2016-05-01 6 views
0

私は現在、キーバインディングを使用する方法を学んでいます。私は、私が書いたコードをいじるた、と私は2つのキー(矢印キー)を押したとき、私は、最後のものだけが実行されます気づきました。私は単にKeyListenerを使うべきですか、それともこの方法を作る方法はありますか?そのゲーム以来、同時に4つ以上のキーを実行することができなければなりません。キーバインディングでブロックのコードを同時に実行するにはどうすればよいですか?

package game; 


import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferInt; 

import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

import game.sfx.Screen; 
import game.sfx.SpriteSheet; 

public class Game implements Runnable{ 


    private static final long serialVersionUID = 1L; 

    public static final int WIDTH = 160; 
    public static final int HEIGHT = WIDTH/12 * 9; 
    public static final int SCALE = 3; 
    public static final String NAME = "Game"; 

    private JFrame frame; 
    private JPanel panel; 

    public boolean running = false; 
    public int tickCount = 0; 

    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

    Screen screen; 

    public Game(){ 
     panel = new JPanel(); 

     panel.setMinimumSize(new Dimension(WIDTH*SCALE, HEIGHT*SCALE)); 
     panel.setMaximumSize(new Dimension(WIDTH*SCALE, HEIGHT*SCALE)); 
     panel.setPreferredSize(new Dimension(WIDTH*SCALE, HEIGHT*SCALE)); 

     frame = new JFrame(NAME); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 

     frame.add(panel, BorderLayout.CENTER); 
     frame.pack(); 

     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     InputMap im = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); // key binding here 
     ActionMap am = panel.getActionMap(); 

     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "r"); 
     am.put("r", new InputHandler("right", this)); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "l"); 
     am.put("l", new InputHandler("left", this));  
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "u"); 
     am.put("u", new InputHandler("up", this)); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "d"); 
     am.put("d", new InputHandler("down", this));  

    } 


    public void init(){ 
     screen = new Screen(WIDTH, HEIGHT, new SpriteSheet("res/Untitled.png")); 
    } 

    public synchronized void start() { 
     running = true; 
     new Thread(this).start(); 
    } 

    public synchronized void stop() { 
     running = false; 
    } 

    public void run() {  
     long lastTime = System.nanoTime(); 
     double nsPerTick = 1000000000D/60D; 

     int frames = 0; 
     int ticks = 0; 

     long lastTimer = System.currentTimeMillis(); 
     double delta = 0; 

     init(); 

     while (running){ 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/nsPerTick; 
      lastTime = now; 
      boolean shouldRender = true; 
      while(delta >= 1) 
      { 
       ticks++; 
       tick(); 
       delta -= 1; 
       shouldRender = true; 
      } 

      try { 
       Thread.sleep(2); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      if (shouldRender) 
      { 
       frames++; 
       render(); 
      } 

      if(System.currentTimeMillis() - lastTimer >= 1000){ 
       lastTimer += 1000; 
       System.out.println(ticks + " ticks, " + frames + " frames"); 
       frames = 0; 
       ticks = 0; 
      } 
     } 
    } 

    public void tick(){ 
     tickCount++; 


    } 

    public void render(){ 


     screen.render(pixels, 0, WIDTH); 

     Graphics g = panel.getGraphics(); 

     g.drawImage(image, 0, 0, panel.getWidth(), panel.getHeight(), null); 

     g.dispose(); 

    } 

    public static void main(String[] args){ 
     new Game().start();  
    } 

} 

class InputHandler extends AbstractAction { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private String key; 
    private Game game; 


    public InputHandler(String key, Game game) { 
     this.key = key; 
     this.game = game; 
    } 


    @Override 
    public void actionPerformed(ActionEvent e) {   
     switch(key){ 
     case "right": 
     game.screen.xOffset+=2; 
     break; 
     case "left": 
     game.screen.xOffset-=2; 
     break; 
     case "up": 
     game.screen.yOffset+=2; 
     break; 
     case "down": 
     game.screen.yOffset-=2; 
     break; 
     } 

    } 

} 

これは、コード

+0

ですか?これがなければ、あなたはあなたの質問を答えにくくします。 [mcve]リンクを読んでから、これらのプログラムの1つをあなたの質問と共に作成して投稿してください。これはあなたの完全なプログラムやリンクではなく、私たちにとってあなたの問題を示す小さな独立した実行可能プログラムです。 –

+0

[Java KeyEvent square movement]の複製があります(http://stackoverflow.com/questions/19476685/java-keyevent-square-movement) –

答えて

1

は私linked to answerにお勧め何をしている:

  • DOWN、UP持つ方向という列挙型を作成してスイングタイマー
  • を使用してゲームループを作成します。 、左、右の項目
  • そして、それはまた、実際の方向を示すint型のベクトル場を持ってい
  • 矢印キーが
  • 押されたときに変更された作成HashMap<Direction, Boolean>は、ゲームループのポールにこのマップを持っている、とにBoolean.TRUEにマッピングされた方向に応じて方向を変えます。
  • 単純にHashMapの状態を変更するために、あなたのキーバインディングを設定し、それはそれです。
+0

私はあなたの答えを見ました。コードを実行すると、上/下と左/右が押されると正方形が正常に対角線上に移動します。しかし、私が上、下、左に押しても正方形は左にいかないのですか?アップ/ダウンはキャンセルせず、単に左に行くでしょうか?これは問題ではない、私は理解しようとする。 – Ilann

+0

@Ilann:一緒に上/下/左を押すと左に行く。 –

+0

あなたは私のコードまたは正方形のコードについて話していますか? – Ilann

2

と私は唯一のイベントが最後のキーのために生成されるため、最後のものだけが

を実行します私は2つのキー(矢印キー)を押したときに気づいたが押さ

万一私は単純にKeyListenerを使用します。

これは、KeyListenerまたはKeyBindingsを使用するかどうかに関係なく適用されます。イベントを生成するOS。

ゲームのため、同時に4つ以上のキーを実行する必要があります。

だから、解決策は、それがMotion Using the Keyboardをチェック

をリリース/押されている各キーを追跡することです。 KeyboardAnimationの例では、これをKeyBindingsでどのように行うことができるかを示しています。どこに適切なコードが

関連する問題