Java游戏:鼠标控制和边框(矩形)问题

时间:2018-01-08 06:33:50

标签: java

未显示20 x 20框(包括动作侦听器且没有错误)。另一个类是设置JFrame和游戏start()的窗口。以下是代码(使用名为"javagame9"的包。

public class Game extends Canvas implements Runnable {
    private static final long serialVersionUID = -2713820159854096116L;
    public static final int WIDTH = 640, HEIGHT = 700;
    private Thread thread;
    private boolean running = false;
    public static boolean paused = false;

    public Game() {
        this.addMouseMotionListener(new Mouse());
        new Window(WIDTH, HEIGHT, "A Game", this);
    }

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

    public synchronized void stop() {
        try {
            thread.join();
            running = false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        this.requestFocus();
        long LastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int frames = 0;
        while (running) {
            long now = System.nanoTime();
            delta += (now - LastTime) / ns;
            LastTime = now;
            while (delta >= 1) {
                tick();
                delta--;
            }
            if (running)
                render();
            frames++;
            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("FPS: " + frames);
                frames = 0;
            }
        }
        stop();
    }

    private void tick() {


    }


    private void render() {


    }

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


public class Mouse extends Canvas implements MouseMotionListener {


    private static final long serialVersionUID = 7986961236445581989L;

    private Image dbImage;    //Mouse - class
    private Graphics dbg;

    int mx, my;
    boolean mouseDragged;


    public void paint(Graphics g) {
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }

    public void paintComponent(Graphics g) {

        if (mouseDragged) {
            g.setColor(Color.DARK_GRAY);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(mx, my, 20, 20);
        } else {
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.DARK_GRAY);
            g.fillRect(mx, my, 20, 20);
        }
        repaint();
    }


    @Override
    public void mouseDragged(MouseEvent e) {
        mx = e.getX() - 10;
        my = e.getY() - 10;

        mouseDragged = true;

        e.consume();
    }

    public void mouseMoved(MouseEvent e) {
        mx = e.getX() - 10;
        my = e.getY() - 10;

        mouseDragged = false;
        e.consume();
    }

}

1 个答案:

答案 0 :(得分:0)

问题在于您有2 CanvasGameMouse

假设Window类如下(找到here):

public class Window extends Canvas {

    public Window(int width, int height, String title, Game game) {
        JFrame frame = new JFrame(title);

        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.add(game);
        frame.setVisible(true);

        game.start();
    }

}

我们发现添加到Canvas的{​​{1}}是JFrame,因此它将是可见的。{/ p>

但你只是在Game画布上画画,因此你不会看到任何东西。

您可以将绘制逻辑从Mouse移至Mouse,并仅将Game用于Mouse功能。

修改后的MouseMotionListener类(注释突出显示的差异):

Game

现在,您可以从public class Game extends Canvas implements Runnable { private static final long serialVersionUID = -2713820159854096116L; public static final int WIDTH = 640, HEIGHT = 700; private Thread thread; private boolean running = false; public static boolean paused = false; // fields previously in Mouse moved here: private Image dbImage; private Graphics dbg; // mouse field so we can reuse it private Mouse mouse; public Game() { // we create an instance of mouse and use it as MouseMotionListener mouse = new Mouse(); this.addMouseMotionListener(mouse); new Window(WIDTH, HEIGHT, "A Game", this); } public synchronized void start() { thread = new Thread(this); thread.start(); running = true; } public synchronized void stop() { try { thread.join(); running = false; } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { this.requestFocus(); long LastTime = System.nanoTime(); double amountOfTicks = 60.0; double ns = 1000000000 / amountOfTicks; double delta = 0; long timer = System.currentTimeMillis(); int frames = 0; while (running) { long now = System.nanoTime(); delta += (now - LastTime) / ns; LastTime = now; while (delta >= 1) { tick(); delta--; } if (running) render(); frames++; if (System.currentTimeMillis() - timer > 1000) { timer += 1000; System.out.println("FPS: " + frames); frames = 0; } } stop(); } private void tick() { } private void render() { } public static void main(String args[]) { new Game(); } // paint methods previously in Mouse moved here: @Override public void paint(Graphics g) { dbImage = createImage(getWidth(), getHeight()); dbg = dbImage.getGraphics(); paintComponent(dbg); g.drawImage(dbImage, 0, 0, this); } public void paintComponent(Graphics g) { if (mouse.mouseDragged) { g.setColor(Color.DARK_GRAY); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.LIGHT_GRAY); g.fillRect(mouse.mx, mouse.my, 20, 20); } else { g.setColor(Color.LIGHT_GRAY); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.DARK_GRAY); g.fillRect(mouse.mx, mouse.my, 20, 20); } repaint(); } } 类删除用于绘画的所有方法/字段,也不再延伸Mouse

Canvas

使用这些课程,您现在应该可以看到您正在绘画的内容。