Ява, мое изображение не будет обновляться / двигаться - PullRequest
1 голос
/ 16 декабря 2011

Я довольно новичок в Java, но ... прочитав много онлайн, я пытался поработать над этой игрой и начал работать, я работаю с несколькими изображениями.Я пытаюсь обновить свои позиции, чтобы продемонстрировать движение, конечно, через KeyListener, я полагаю.к сожалению, изображение остается в том же месте и отказывается двигаться D:

Я уверен, что я немного усложнил этот код, но вот он: \

public class Game extends javax.swing.JPanel implements ActionListener, KeyListener{

    private Vladimir vlad;
    private Timer timer;

    public Game() {
        addKeyListener(this);
        setPreferredSize(new Dimension(1024,768));
        setDoubleBuffered(true);

        vlad = new Vladimir();
        timer = new Timer(15,this);
        timer.start();
    }

    public void actionPerformed (ActionEvent e){
        repaint();
    }

    private void toggleKey(int keyCode, boolean pressed){
        if (keyCode == 87){ // W
             vlad.move("UP", pressed);
        }

        if (keyCode == 83){ // S
            vlad.move("DOWN", pressed);
        }

        if (keyCode == 65) // A
        {
            vlad.move("LEFT", pressed);
        }

        if (keyCode == 68) // D
        {
            vlad.move("RIGHT", pressed);
        }
    }

    public void keyPressed(KeyEvent e)
    {
        toggleKey(e.getKeyCode(), true);
    }

    public void keyReleased(KeyEvent e)
    {
        toggleKey(e.getKeyCode(), false);
    }

    public void keyTyped(KeyEvent e){

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics g2d = (Graphics2D)g;
        g2d.drawImage(vlad.getGrassMap(),0,0,this);
        g2d.drawImage(vlad.getCharOne(),vlad.getX(),vlad.getY(),this);

        repaint();


      }
}

А потом..

public class Vladimir{

    private int x;
    private int y;
    private Image grassMapOne;
    private Image charOne;
    private String gMapLocate = "/phantasma/resources/GrassMap1.png";
    private String charOneLocate = "/phantasma/resources/moveright1.png";

    public Vladimir(){
        ImageIcon gMap1 = new ImageIcon(this.getClass().getResource(gMapLocate));
        ImageIcon char1 = new ImageIcon(this.getClass().getResource(charOneLocate));
        grassMapOne = gMap1.getImage();
        charOne = char1.getImage();
        x = 512;
        y = 350;
    }

    public void move(String direction, boolean keyHeld){
        if (direction == "UP"){
            y += 12;
        }

        if (direction == "DOWN"){
            y -= 12;
        }

        if (direction == "LEFT"){
            x -= 12;
        }

        if (direction == "RIGHT"){
            x += 12;
        }
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public Image getGrassMap(){
        return grassMapOne;
    }

    public Image getCharOne(){
        return charOne;
    }
}

1 Ответ

5 голосов
/ 16 декабря 2011

Прежде чем вы сможете это исправить, вам нужно знать, что не так, поэтому вам следует сначала спросить себя, а не почему изображение не движется, а слушатель ключа даже слушает?Если вы добавите println операторы, подобные этому:

public void keyPressed(KeyEvent e) {
    System.out.println("in keyPressed. keyCode is: " + e.getKeyCode());
    toggleKey(e.getKeyCode(), true);
}

, вы увидите, что это не так, что для него требуется компонент, который способен получать фокус и который действительно имеет фокус.

Вам необходимо установить для свойства JPanel focusable значение true, а затем присвоить его acceptFocusInWindow() после его отрисовки.

Еще лучше - используйте привязки клавиш, поскольку они гораздо более гибкие, когда речь идет о проблемах, и представляют собой конструкцию более высокого уровня.На самом деле это то, что использует сам Swing, чтобы компоненты реагировали на нажатия клавиш.

Далее, не используйте == для сравнения String с, поскольку это только проверяет, являются ли два объекта String одним ито же самое, то, что тебя не волнует.Вместо этого вы хотите знать, имеет ли один String те же символы в том же порядке, что и другой String, и для этого вы хотите использовать метод String equals(...) или его метод equalsIgnoreCase(...).

...