私はゲームをコーディングしています。私はJavaのSwingを使用しています。そして今、私はKeyListenersとActionリスナーを動かそうとしています。私がやろうとしている何タイマーが正しく動作しないキーリスト/アクションリスナー
は私が押してるものをキーに応じて移動するために、私のオブジェクトを作ることです。 (左、右、上、下)しかし、私はこれらのキーのいずれかを押すと何も起こりませんが、私はそれらの3つを同時に押すと何も起こりません。
:import java.awt.*;
public class Runner{
private int xpos, ypos, base, side;
public Runner(int b, int h) {
base = b;
side = h;
}
public void setPosition(int x, int y){
xpos = x;
ypos = y;
}
public void view(Graphics g) {
int x[] = { xpos, xpos-base/2, xpos + base/2};
int y[] = { ypos, ypos + side, ypos + side };
g.setColor(Color.lightGray);
g.fillPolygon(x, y, 3);
g.setColor(Color.darkGray);
g.drawLine(xpos, ypos, xpos, ypos + side);
}
public void shoot(Graphics g){
g.setColor(Color.red);
g.drawLine(xpos,ypos, xpos, 0);
}
}
そして、ここではthatsのはこいつを実行すると仮定したコードです:オブジェクトが妙にランナー・オブジェクトを作成するクラスのための私のコードですので、ここで...左に
を動かしています
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RunningGame extends JPanel implements KeyListener, ActionListener{
Runner rs;
int x,y;
Timer t;
boolean shot = false;
boolean left = false, right = false, up = false, down = false;
public RunningGame() {
x = 100;
y = 150;
rs = new Runner(40,60);
rs.setPosition(x,y);
this.addKeyListener(this);
this.setBackground(Color.black);
t = new Timer(40, this);
t.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
rs.view(g);
if(shot) rs.shoot(g);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 37) {left = true;}
if (e.getKeyCode() == 39) {right = true;}
if (e.getKeyCode() == 38) {up = true;}
if (e.getKeyCode() == 40) {down = true;}
if (e.getKeyCode() == 32) {shot = true;}
rs.setPosition(x,y);
this.repaint();
}
public void keyReleased(KeyEvent e){
if (e.getKeyCode() == 37) left = false;
if (e.getKeyCode() == 39) right = false;
if (e.getKeyCode() == 38) up = false;
if (e.getKeyCode() == 40) down = false;
if (e.getKeyCode() == 32) shot = false;
this.repaint();
}
public void keyTyped(KeyEvent e){}
public void actionPerformed(ActionEvent e) {
if (left) {
if(right){
right = false;
x = x - 10; shot = false;
}
}
if (right) {
if(left){
left = false;
x = x + 10; shot = false;
}
}
if (up) {
if(down){
down = false;
y = y - 10; shot = false;
}
}
if (down) {
if(up){
up = false;
y = y + 10; shot = false;
}
}
rs.setPosition(x,y);
this.repaint();
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300); f.setLocation(100,100);
f.setTitle("Running");
RunningGame p = new RunningGame();
f.add(p); f.setVisible(true);
p.requestFocus();
}
}
(これは後に、私はそれが先に進む前に動作しますので、ちょうどたいのKeyListenerとActionListenerをテストし、別のオブジェクトを使用しますが、それだけで宇宙船との例を使用しています最終的なコードではありません。)
とにかく誰でも、宇宙船を円滑に動かせるように助けることができますか?他のキーを有効にするためにすべてのキーを解放する必要はありませんか?すなわち、左を保持している場合は、別のボタンを押すことができます。私が右を押すと、宇宙船は代わりにその方向に動き始めるでしょう。
// MrElephantsように見えるブロックで
KeyListenerの代わりに[KeyBinding](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)を使用する必要があります –
私はあなたは[同様の質問への私の答え](http://stackoverflow.com/a/10077580/544963)を見てみることをお勧めします。それだけでは不十分な場合は、私に知らせてください。 :) – fireshadow52