RealTutsGMLのチュートリアルを使用してゲームを作成しています。そのため、2013年の古いビデオを見たことがあれば、このコードの概要を知ることができます。KeyListenerはランダムに動作を停止します。 KeyBindings?
(ちなみに、私はJavaには新しくないが、AWTとSwingにかなり新しくなっている.Minecraft Bukkit/Spigotプラグインを使用していた/まだまだコード化していたからだ。 Java標準言語/構文ですが、AWTとSwing ...)
とにかく、KeyAdapterを使用してキーを制御しています。しかし、それは最初に動作し、次にランダムに動作を停止します。私はそれをデバッグしたし、それはゲーム内のオブジェクトではないようだ、それはKeyAdapterだ。私はこれにいくつかの他の解決策を見てきました。人々はフォーカスや何かを失ってしまったと言いました。代わりにKeyBindingsを使うべきです。 KeyListenerが無作為に私のために働いていないので変です。
Handler handler;
public KeyInput(Handler handler){
this.handler = handler;
}
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
for (int i = 0; i < handler.object.size(); i++){
GameObject tempObject = handler.object.get(i);
if (tempObject.getId() == ObjectId.Player){
if (key == KeyEvent.VK_SPACE && !tempObject.isJumping()){
tempObject.setJumping(true);
tempObject.setVelY(-10);
}
if (key == KeyEvent.VK_Y){
tempObject.setY(100);
}
if (key == KeyEvent.VK_A){
System.out.println("Pressed A");
tempObject.setVelX(-5);
}
if (key == KeyEvent.VK_D){
System.out.println("Pressed D");
tempObject.setVelX(5);
}
}
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
for (int i = 0; i < handler.object.size(); i++) {
GameObject tempObject = handler.object.get(i);
if (tempObject.getId() == ObjectId.Player) {
if (key == KeyEvent.VK_D) {
for (int velX = (int) tempObject.getVelX(); velX >= 0; velX--) {
tempObject.setVelX(velX);
}
}
if (key == KeyEvent.VK_A) {
for (int velX = (int) tempObject.getVelX(); velX <= 0; velX++) {
tempObject.setVelX(velX);
}
}
}
}
}
あなたが見ることができるように
が、私はそれを行うためにKeyAdapterを使用しています:とにかく、ここで私が使用していたコードです。ここではメインクラスで私の初期化方法は次のとおりです。
private void init(){
WIDTH = getWidth();
HEIGHT = getHeight();
handler = new Handler();
handler.addObject(new Player(100, 100, handler, ObjectId.Player));
handler.createTestLevel();
this.addKeyListener(new KeyInput(handler));
}
initメソッドは、前に呼び出されている「this.requestFocusInWindow()」
私はこの上でいくつかの情報を見て、私は他の解決策として、キーバインドを見ました人々の問題。しかし、JComponentsにキーバインディングを追加する必要があると思います。そのうちの1つを取得する方法はわかりません。新しいJComponent()が動作せず、JFrameがメインクラスを追加しています(これはJComponentではなくComponentとして動作していると思います)。
誰かが助けることができれば、それは素晴らしいことでしょう!ありがとう!
編集#1:
私はKeyBindingsに切り替えました!ここでKeyInputクラスは次のとおりです。
Handler handler;
public JComponent component;
public KeyInput(Handler handler, JComponent component){
this.handler = handler;
this.component = component;
register();
}
public void register(){
Actions actions = new Actions();
component.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressSpace");
component.getActionMap().put("pressSpace", actions.pressSpace());
component.getInputMap().put(KeyStroke.getKeyStroke("A"), "pressLeft");
component.getActionMap().put("pressLeft", actions.pressLeft());
component.getInputMap().put(KeyStroke.getKeyStroke("released A"), "releaseLeft");
component.getActionMap().put("releaseLeft", actions.releaseXMovement());
component.getInputMap().put(KeyStroke.getKeyStroke("D"), "pressRight");
component.getActionMap().put("pressRight", actions.pressRight());
component.getInputMap().put(KeyStroke.getKeyStroke("released D"), "releaseRight");
component.getActionMap().put("releaseRight", actions.releaseXMovement());
}
public JComponent finish(){
return component;
}
public class Actions{
public Actions() { }
public Action pressRight(){
Action action = new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < handler.object.size(); i++){
GameObject temp = handler.object.get(i);
if (temp.getId() == ObjectId.Player){
temp.setVelX(5);
System.out.println("pressed right debug");
}
}
}
};
return action;
}
public Action releaseXMovement(){
Action action = new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < handler.object.size(); i++){
GameObject temp = handler.object.get(i);
if (temp.getId() == ObjectId.Player){
temp.setVelX(0);
}
}
}
};
return action;
}
public Action pressLeft(){
Action action = new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < handler.object.size(); i++){
GameObject temp = handler.object.get(i);
if (temp.getId() == ObjectId.Player){
temp.setVelX(-5);
}
}
}
};
return action;
}
public Action pressSpace(){
Action action = new AbstractAction(){
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < handler.object.size(); i++){
GameObject temp = handler.object.get(i);
if (temp.getId() == ObjectId.Player){
if (!temp.isJumping()){
temp.setJumping(true);
temp.setVelY(-10);
}
}
}
}
};
return action;
}
}
はしかし、私はまだ同じ凍結問題を抱えています。デバッグメッセージは送信されないので、setVelメソッドとは何の関係もありません。私はリスナーのことがなぜ機能しなくなったのかわかりません... (最初は動作しますが、キーを押し続けると、最終的に停止します)。
は、ここで私はJComponentのを得た方法は次のとおりです。
JComponent comp = (JComponent) frame.getContentPane();
KeyInput input = new KeyInput(handler, comp);
frame.add(input.finish());
さらに詳しいヘルプが必要な場合は、自分の現在の質問に有効な[mcve]を作成して投稿する必要があります。いつものように、コードはリンクではなくコード形式のテキストとして投稿する必要があります。 –
あなたの質問の下の部分については、「編集する」を参照してください。再び、MCVEは計り知れないほどの助けになるだろう。 –
@HovercraftFullOfEelsリンクではどういう意味ですか?私は私のポストにリンクがありません。 – Blockhead7360