0
私はJavaで最初のゲームを作ろうとしています。私は自分のキャンバスと、動くことができる小さなサークルプレーヤーを持っています。左矢印キーを押すと、文字が上に移動し、左に移動します。私が右を押すと、文字は下に移動し、右に移動します。上矢印と下矢印は何もしません。私は自分の変数が混乱しているのを見て確認したが、私はそうは思わなかった。 左または右の矢印キーを押すと文字が斜めに移動する
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
public class GamePanel extends JPanel implements Runnable, KeyListener{
// Fields
public static int WIDTH = 600;
public static int HEIGHT = 600;
private Thread thread;
private boolean running;
private BufferedImage image;
private Graphics2D g;
private int FPS = 30;
private double averageFPS;
private Player player;
// Constructor
public GamePanel() {
super();
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
}
// Functions
public void addNotify() {
super.addNotify();
if (thread == null) {
thread = new Thread(this);
thread.start();
}
addKeyListener(this);
}
public void run() {
running = true;
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
g = (Graphics2D) image.getGraphics();
player = new Player();
long startTime;
long URDTimeMillis;
long waitTime;
long totalTime = 0;
int frameCount = 0;
int maxFrameCount = 30;
long targetTime = 1000/FPS;
// Game Frame Limiter and Timer
while (running) {
startTime = System.nanoTime();
gameUpdate();
gameRender();
gameDraw();
URDTimeMillis = (System.nanoTime() - startTime)/1000000;
waitTime = targetTime - URDTimeMillis;
try {
Thread.sleep(waitTime);
} catch (Exception ignored){
}
totalTime += System.nanoTime() - startTime;
frameCount ++;
if (frameCount == maxFrameCount) {
averageFPS = 1000.0/((totalTime/frameCount)/1000000);
frameCount = 0;
totalTime = 0;
}
}
}
private void gameUpdate() {
player.update();
}
private void gameRender() {
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor(Color.BLACK);
g.drawString("FPS: " + averageFPS, 10, 10);
player.draw(g);
}
private void gameDraw() {
Graphics g2 = this.getGraphics();
g2.drawImage(image, 0, 0, null);
g2.dispose();
}
public void keyTyped(KeyEvent key){
}
public void keyPressed(KeyEvent key){
int keyCode = key.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT){
player.setLeft(true);
}
if (keyCode == KeyEvent.VK_RIGHT){
player.setRight(true);
}
if (keyCode == KeyEvent.VK_UP){
player.setUp(true);
}
if (keyCode == KeyEvent.VK_DOWN){
player.setDown(true);
}
}
public void keyReleased(KeyEvent key){
int keyCode = key.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT){
player.setLeft(false);
}
if (keyCode == KeyEvent.VK_RIGHT){
player.setRight(false);
}
if (keyCode == KeyEvent.VK_UP){
player.setUp(false);
}
if (keyCode == KeyEvent.VK_DOWN){
player.setDown(false);
}
}
}
そして、これが私のPlayer.java
です:私は誰がなぜ、どこが間違っていた私を見ることができますので、もし、それがはるかに便利
マイGame.javaはこれですとなり、これに非常に新しいですプレイヤーのDrawメソッドで
import java.awt.*;
public class Player {
// Fields
private int x;
private int y;
private int r;
private int dx;
private int dy;
private int speed;
private boolean left;
private boolean right;
private boolean up;
private boolean down;
private int lives;
private Color color1;
private Color color2;
// Construtor
public Player(){
x = GamePanel.WIDTH /2;
y = GamePanel.HEIGHT /2;
r = 5;
dx = 0;
dy = 0;
speed = 5;
lives = 3;
color1 = Color.WHITE;
color2 = Color.BLACK;
}
// Functions
public void setLeft(boolean b){left = b;}
public void setRight(boolean b){right = b;}
public void setUp(boolean b){up = b;}
public void setDown(boolean b){down = b;}
public void update(){
if (left){
dx = -speed;
}
if (right){
dx = speed;
}
if (up){
dy = speed;
}
if (down){
dy = -speed;
}
x += dx;
y += dy;
if (x < r){
x = r;
}
if (y < r){
y = r;
}
if (x > GamePanel.WIDTH - r){
x = GamePanel.WIDTH - r;
}
if (y > GamePanel.HEIGHT - r){
y = GamePanel.HEIGHT - r;
}
dx = 0;
dy = 0;
}
public void draw(Graphics2D g){
g.setColor(color1);
g.fillOval(x - r, x - r, 2 * r, 2 * r);
g.setStroke(new BasicStroke(3));
g.setColor(color1.darker());
g.drawOval(x - r, x - r, 2 * r, 2 * r);
g.setStroke(new BasicStroke(1));
}
}
'keyReleased()'コールバックに頼るのではなく、プレーヤーの 'left'、' right'などのメンバーを 'Player.update()'の最後に 'false'に戻してみてください。問題が単にキーリリースが正しく登録されていないことを確認するだけです。 – domsson
[キー・リスナーの代わりにキー・バインディングを使用する方法](http://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners) – user1803551
@domdom iそれを試してみると、プレイヤーのレスポンスが遅くなり(動きが遅くなる)、それでも上下左右に動きます。上矢印と下矢印は何もしない –