ケニー:
私はJavaで私の最初の小さなゲームを作るしようとしています。あなたは、プレス何もいけない場合、私は、ダウンしている動き、ボールを作りたいです。あなたは、スペースバーを押した場合でも、それが下方に移動することを、同じ速度で上に移動します。だから上がっていくと、ボタン一つでダウン。
問題は、ボールがスムーズに上がらないんです。私はこれをどのように修正することができますか?
package Game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Gameplay extends JPanel implements KeyListener, ActionListener{
private boolean play = false;
private int delay = 5;
private Timer timer;
private int playerX = 250;
private int playerY = 325;
private int playerYdir = 2;
private boolean up = false;
public Gameplay() {
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
timer = new Timer(delay, this);
timer.start();
}
public void paint(Graphics g) {
//BG
g.setColor(Color.black);
g.fillRect(0, 0 , 1000, 700);
//Player
g.setColor(Color.yellow);
g.fillOval(playerX, playerY, 30, 30);
g.dispose();
}
@Override
public void actionPerformed(ActionEvent e) {
timer.start();
if(play) {
if(playerY >= 640) playerY = 640;
if(playerY <= 0) playerY = 0;
if(!up) move(-playerYdir, false);
}
repaint();
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
move(8, true);
play = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
move(8, false);
}
}
public void move(int moveUp, boolean dir) {
//dir: true = down, false = up
up = dir;
playerY -= moveUp;
}
@Override
public void keyTyped(KeyEvent e) {}
}
マイケル:
あなたはすでにボタンが保持されていることを検出するために、すべてのものを持っていますが、運動を適用するあなたのアプローチが間違っています。キーが押されたときは、検出し、かつキーが解放されたときに検出します。これらの2つのイベントの間に、キーを表し、すべての時間が開催されています。
キーが押されたときに一度だけ発生しますので、あなたは、運動を適用するべきではありません。あなたは、単にフラグを設定する必要があります。
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
isSpaceButtonDown = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
sSpaceButtonDown = false;
}
}
他の場所でゲームのメインループ(すべてのフレームと呼ばれています1)で、あなたはフラグをチェックする必要がありますし、それに応じて行動します。
void myMainGameLoop() {
if (isSpaceButtonDown) {
moveUp();
}
else {
moveDown()
}
}