2D吃豆人移动吃豆人

时间:2020-03-13 19:53:11

标签: java

我正在尝试使用Java创建2D吃豆人游戏,但是我无法获取表示吃豆人移动的矩形。我认为我的问题可能在Game类的keyPressed方法中,但是我不确定。到目前为止,这是我在主要班级中所拥有的。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable,KeyListener {

private static final long serialVersionUID = 1L;

private boolean isRunning = false;

public static final int WIDTH = 640;
public static final int HEIGHT = 480;

public static final String TITLE = "Pac-Man";

public Thread thread;

public static Player player;

public Game() {
    Dimension dimension = new Dimension(Game.WIDTH,Game.HEIGHT);
    setPreferredSize(dimension);
    setMinimumSize(dimension);
    setMaximumSize(dimension);

    addKeyListener(this);
    player = new Player(Game.WIDTH/2,Game.HEIGHT/2);
}

public synchronized void start() {
    if(isRunning) {
        return;
    } else {
        isRunning = true;
        thread = new Thread(this);
        thread.start();
    }
}

public synchronized void stop() {
    if(!isRunning) {
        return;
    } else {
        isRunning = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void tick() {
    player.tick();
}

private void render() {
    BufferStrategy bs= getBufferStrategy(); 

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

    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.black);
    g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
    player.render(g);

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

@Override
public void run() {

    int fps = 0;
    double timer = System.currentTimeMillis();

    long lastTime = System.nanoTime();
    double targetTicks = 60.0; 
    double delta = 0;

    double ns = 1000000000/targetTicks;

    while(isRunning) { 
        long currentTime = System.nanoTime();
        delta += (currentTime - lastTime)/ns;
        lastTime = currentTime;

        while(delta >= 1) {
            tick();
            render();
            fps++;
            delta--;
        }
        if((System.currentTimeMillis() - timer) >= 1000) { 
            System.out.println(fps);
            fps = 0;
            timer += 1000;
        }
    }   
    stop();
}

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

    JFrame frame = new JFrame();
    frame.setTitle(Game.TITLE);

    frame.add(game);

    frame.setResizable(false);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setLocationRelativeTo(null);

    frame.setVisible(true);

    game.start();
}

@Override
public void keyTyped(KeyEvent e) {}

@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
        player.right = true;
    }

    if(e.getKeyCode() == KeyEvent.VK_LEFT) {
        player.left = true;
    }

    if(e.getKeyCode() == KeyEvent.VK_UP) {
        player.up = true;
    }

    if(e.getKeyCode() == KeyEvent.VK_DOWN) {
        player.down = true;
    }
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
        player.right = false;
    }

    if(e.getKeyCode() == KeyEvent.VK_LEFT) {
        player.left = false;
    }

    if(e.getKeyCode() == KeyEvent.VK_UP) {
        player.up = false;
    }

    if(e.getKeyCode() == KeyEvent.VK_DOWN) {
        player.down = false;


    }
  }
}

到目前为止,这是我在Player类中拥有的。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

public class Player extends Rectangle{

    private static final long serialVersionUID = 1L;

    public boolean right;
    public boolean left;
    public boolean up;
    public boolean down;
    private int speed = 4;

    public Player(int x, int y) {
        setBounds(x,y,32,32);
    }

    public void tick() {
        if(right) {
            x+=speed;
        } 

        if(left) {
            x-=speed;
        }

        if(up) {
            y-=speed;
        }

        if(down) {
            y+=speed;
        }
    }

    public void render(Graphics g) {
        g.setColor(Color.yellow);
        g.fillRect(x,y,width,height);
    }
}

0 个答案:

没有答案