java - 如果我从另一个类设置 x y,则矩形不会移动。

标签 java swing

好吧,我这里有两个类,主类和按键监听器类,我用它们将键盘输入传递给主类。

    import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable{

    private static final long serialVersionUID = 1L;

    private final static int WIDTH = 240;
    private final static int HEIGHT = WIDTH / 12 * 9;
    private final static int SCALE = 2;
    private String TITLE = "Game";

    private boolean running = false;

    private Thread thread;

    Random r = new Random();

    ArrayList<Point> snakePart = new ArrayList<Point>();
    Point head;

    KeyHandle keyhandle;



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

    public Game() {
        init();

        JFrame frame = new JFrame(TITLE);
        Dimension size = new Dimension(WIDTH * SCALE, HEIGHT * SCALE);

        setMinimumSize(size);
        setMaximumSize(size);
        setPreferredSize(size);

        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(this);
        frame.pack();

        frame.setVisible(true);



        start();

    }

    public void init() {
        head = new Point(0,0);
        addKeyListener(new KeyHandle());
    }

    @Override
    public void run() {

        final double ticks = 60.0;
        long initTime = System.nanoTime();
        double ns = 1000000000 / ticks;
        double delta = 0;

        long timer = System.currentTimeMillis();
        double updates = 0;
        int frames = 0;

        while (running) {
            long nowTime = System.nanoTime();
            delta += (nowTime - initTime) / ns;
            initTime = nowTime;
            if (delta >= 1) {
                tick();
                updates++;
                delta--;

            }

            render();
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("Ticks: " + updates + " Frames: " + frames);
                updates = 0;
                frames = 0;
            }
        }

        stop();

    }



    public void tick() {



    }



    public void render() {

        BufferStrategy bs = getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();

        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());

        g.setColor(Color.white);
        g.drawRect(head.x, head.y, 10, 10);



        bs.show();
        g.dispose();

    }

    private synchronized void start() {
        if (running)
            return;

        running = true;
        thread = new Thread(this);
        thread.start();
    }

    private synchronized void stop() {
        if (!running)
            return;

        running = false;

        try {
            thread.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.exit(1);
    }


}

然后我得到了如下所示的 keylistener 类

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

public class KeyHandle implements KeyListener {

    Game game;

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_UP){


        } else if(e.getKeyCode() == KeyEvent.VK_DOWN){
            game.head.y += 10;


        } else if(e.getKeyCode() == KeyEvent.VK_LEFT){

        } else if(e.getKeyCode() == KeyEvent.VK_RIGHT){

        } else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){

        } 

    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_UP){

        } else if(e.getKeyCode() == KeyEvent.VK_DOWN){

        } else if(e.getKeyCode() == KeyEvent.VK_LEFT){

        } else if(e.getKeyCode() == KeyEvent.VK_RIGHT){

        } else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){

        } 

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }



}

现在,当我尝试编辑第二类中看到的“head”y 和 x 值时,问题出现了。

if(e.getKeyCode() == KeyEvent.VK_DOWN){
            game.head.y += 10;

我在这里做错了什么,有没有更好的方法来更有效地传递和设置 x 和 y 值。

最佳答案

您的 KeyHandle 类包含对 Game 的引用,但不包含游戏的实例。不要在主方法中创建 new Game() 并将实例放在地板上,而是将该实例分配给 KeyHandle 中包含的引用。

keyhandle.game = new Game();

关于java - 如果我从另一个类设置 x y,则矩形不会移动。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40531886/

相关文章:

java - 在 Java 的 XML 中创建多个子节点

java - 将数组排序为三个不同的 ArrayLinearList

java - Java 中标签和单选组之间不需要的线

java - 为什么此代码不起作用 : jLabel setIcon?

java - 为 jcheckbox 添加边框

java - 调整大小/添加组件时滚动 Pane 滚动条到整个 Jframe

java - 错误 org.omg.CORBA.MARSHAL 序列长度太大

java - 如何在 JTextPane 上设置不同的行?

java - Play Framework : Server monitoring and performance admin page

java - 如何在 JFileChooser Swing 组件中列出最近使用的文件