2012-04-12 19 views
1

私はゲームをコーディングしています。私は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ように見えるブロックで

+1

KeyListenerの代わりに[KeyBinding](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)を使用する必要があります –

+0

私はあなたは[同様の質問への私の答え](http://stackoverflow.com/a/10077580/544963)を見てみることをお勧めします。それだけでは不十分な場合は、私に知らせてください。 :) – fireshadow52

答えて

2

if (left) { 
    if(right){ 
     right = false; 
     x = x - 10; shot = false; 
    } 
} 

私はあなたが二ifx = x - 10;を持つべきだと思う:

if (left) { 
    if(right){ 
     right = false; 
     shot = false; 
    } 
    x = x - 10; 
} 

私は本当にわからないが、その内部のifは、おそらく完全に削除する必要があります(ただし、x = = 10などはそのままにしてください)。これは、動きを自然に見せるには十分であるはずです。

+1

+1、あなたが働かなければならないと思われるもの:-) –

+0

ありがとう! :)私はちょうどあなたが言ったし、それは完璧に働いた!あなたがそれを言及したので、それはどのようにしなければならないかということを完全に理解しました。 – MrElephants

+0

ああ、内側の 'if'は、私が持っているものとは反対のボタンを押すと(例えばLeftとRight)、船は止まらず、他の代わりに。しかし、あなたがこれを行う良い方法を知っているなら、私はそれを聞いてうれしいでしょう:)私はそれを正しく行う方法を考えていた原因! – MrElephants