1

私は単純なJavaゲームの作成に取り組んでおり、入力処理をメインゲームとは別のクラスに分離するという素晴らしいアイデアを持っていました。InputHandlerクラスが実際に入力を受け取るのに問題があります。

メインゲームクラス(DrawPanel.java)

package com.eriksaulnier.DesignedToFail;

import java.awt.*;
import java.awt.image.*;
import com.eriksaulnier.DesignedToFail.InputHandler;

import javax.swing.*;

public class DrawPanel extends JPanel {
private static final long serialVersionUID = 1L;
BufferedImage buffer;
InputHandler inputHandler;
Entity player;
Entity enemy;
public boolean spawnBullet = false;

public DrawPanel () {
    setIgnoreRepaint(true);
    setVisible(true);
    setFocusable(true);
    addKeyListener(inputHandler);
    addMouseListener(inputHandler);
    new InputHandler();
}

public void initialize() {
    buffer = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
    player = new Entity(370, 270);
    enemy = new Entity(100, 100);
}

public void update() {
    player.move();
}

public void checkCollisions() {
    if (player.getBounds().intersects(enemy.getBounds()))
        player.collision = true;
    else
        player.collision = false;
}

public void drawBuffer() {
    Graphics2D b = buffer.createGraphics();
    b.setColor(Color.white);
    b.fillRect(0, 0, 800, 600);
    if (player.collision == false) {
        b.setColor(Color.blue);
        b.fillRect(player.getX(), player.getY(), player.getWidth(), player.getHeight());
        b.setColor(Color.red);
        b.fillRect(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
        b.dispose();
    }
    else {
        b.setColor(Color.black);
        b.drawString("Collision!", 350, 300);
        b.dispose();
    }
}

public void drawScreen() {
    Graphics2D g = (Graphics2D)this.getGraphics();
    g.drawImage(buffer, 0, 0, this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

public void startGame() {
    initialize();
    while(true) {
        try {
            update();
            checkCollisions();
            drawBuffer();
            drawScreen();
            Thread.sleep(15);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

}

}

InputHandler(InputHandler.java)

package com.eriksaulnier.DesignedToFail;

import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;

public class InputHandler extends JPanel implements KeyListener, MouseListener {
public boolean isShooting = false;
Entity player;

public InputHandler () {
    System.out.println("Listener Works!");
}

public void mouseClicked(MouseEvent e) {

}

public void mousePressed(MouseEvent e) {
    int button = e.getButton();
    if (button == MouseEvent.BUTTON1)
        isShooting = true;
        System.out.println("Shooting!");
}

public void mouseReleased(MouseEvent e) {
    int button = e.getButton();
    if (button == MouseEvent.BUTTON1)
        isShooting = false;
        System.out.println("Not Shooting!");
}

public void mouseEntered(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void keyTyped(KeyEvent e) {

}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_W)
        player.up = true;
    if (key == KeyEvent.VK_S)
        player.down = true;
    if (key == KeyEvent.VK_A)
        player.left = true;
    if (key == KeyEvent.VK_D)
        player.right = true;
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_W)
        player.up = false;
    if (key == KeyEvent.VK_S)
        player.down = false;
    if (key == KeyEvent.VK_A)
        player.left = false;
    if (key == KeyEvent.VK_D)
        player.right = false;
}

}
4

2 に答える 2

2

nullハンドラーをGUIに渡しているようです。たとえば、inputHandler変数を使用する前にどこでインスタンス化しますか?

例えば:

public class DrawPanel extends JPanel {
  //...

  InputHandler inputHandler; // here you declare the variable 

  //...

  public DrawPanel () {
    setIgnoreRepaint(true); // why this line?
    setVisible(true); // not needed in a JPanel's code
    setFocusable(true);
    addKeyListener(inputHandler); // here you use a null variable
    addMouseListener(inputHandler); // ditto, here you use a null variable
    new InputHandler(); // I don't know what you're doing here
  }

inputHandler = new InputHandler()上記のコードでは、使用する前にどこにも表示されません。新しいInputHandlerを作成しているように見える行で、オブジェクトを変数に割り当てたり使用したりしないため、無駄なコード行のように見えるため、その行が何であるかわからないという私のコメント達成する。これらの問題はSwingとは関係がなく、基本的なコアJavaと関係があることに注意してください。

また:

  • ハンドラークラスは、JPanelsなどのSwingコンポーネントを拡張しないでください。リスナーインターフェイスのみを実装する必要があります。
  • Swing GUIでのKeyListenerの使用を避け、可能であれば代わりにKeyBindingsを使用する必要があります。詳細については、Googleでキーバインディングのチュートリアルを確認してください。
  • ハンドラーの使用については、OracleSwingチュートリアルで詳しく説明されています。繰り返しになりますが、これらをグーグルで調べてください。Swingコーディングを学んだ場所であるため、それらの有用性を証明できます。
于 2013-01-03T23:58:48.217 に答える
2

少なくとも、バインドする前にinputHandlerのインスタンスを作成するのを忘れています。DrawPanelコンストラクターは次のように開始する必要があります。

public DrawPanel () {
    inputHander=new InputHandler();
    ...
}

この問題を修正した後、機能しない場合はお知らせください。詳しく調べます。

于 2013-01-03T23:58:59.513 に答える