0
我一直在做我的第一個項目:一個蛇遊戲。我看過一個視頻,我做了這個。然而它不起作用,當我運行它時,我的蛇不動。有人能幫助我如何讓它工作。有人可以幫助我讓我的蛇移動
package game;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable, KeyListener {
public static final int WIDTH = 400;
public static final int HEIGHT = 400;
//Render
private Graphics2D g2d;
private BufferedImage image;
//Game Loop
private Thread thread;
private boolean running;
private long targetTime;
//Game Stuff
private final int SIZE = 10;
private Entity head, apple;
private ArrayList<Entity> snake;
private int score;
private int level;
private boolean gameover;
//Movement
private int dx,dy;
//key input
private boolean up,down,right,left,start;
public GamePanel() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
addKeyListener(this);
}
@Override
public void addNotify() {
super.addNotify();
thread = new Thread(this);
thread.start();
}
private void setFPS(int fps) {
targetTime = 1000/fps;
}
// Toetsenbord input --> beweging van de snake
@Override
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
if (k == KeyEvent.VK_UP) up = true;
if (k == KeyEvent.VK_DOWN) down = true;
if (k == KeyEvent.VK_LEFT) left = true;
if (k == KeyEvent.VK_RIGHT) right = true;
if (k == KeyEvent.VK_ENTER) start = true;
}
@Override
public void keyReleased(KeyEvent e) {
int k = e.getKeyCode();
if (k == KeyEvent.VK_UP) up = false;
if (k == KeyEvent.VK_DOWN) down = false;
if (k == KeyEvent.VK_LEFT) left = false;
if (k == KeyEvent.VK_RIGHT) right = false;
if (k == KeyEvent.VK_ENTER) start = false;
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//Snelheid van de snake
@Override
public void run() {
if (running) return;
init();
long startTime;
long elapsed;
long wait;
while (running) {
startTime = System.nanoTime();
update();
requestRender();
elapsed = System.nanoTime() - startTime;
wait = targetTime - elapsed/1000000;
if (wait>0) {
try{
Thread.sleep(wait);
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
private void init() {
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
g2d = image.createGraphics();
running = true;
setUplevel();
}
//Hoe het level eruit ziet
private void setUplevel() {
snake = new ArrayList<Entity>();
head = new Entity(SIZE);
head.setPosition(WIDTH/2, HEIGHT/2);
snake.add(head);
for (int i = 1;i < 3; i++) {
Entity e = new Entity(SIZE);
e.setPosition(head.getX() + (i * SIZE), head.getY());
snake.add(e);
}
apple = new Entity(SIZE);
score = 0;
gameover = false;
level = 1;
dx = dy = 0;
setFPS(level*10);
}
//Waar het fruit komt
public void setApple() {
int x = (int)(Math.random() * (WIDTH - SIZE));
int y = (int)(Math.random() * (HEIGHT - SIZE));
x = x - (x%SIZE);
y = y - (y%SIZE);
apple.setPosition(x,y);
}
private void requestRender() {
render(g2d);
Graphics g = getGraphics();
g.drawImage(image, 0,0,null);
g.dispose();
}
//Hoe dat ding beweegt
private void update() {
if (gameover) {
if (start) {
setUplevel();
}
return;
}
if (up && dy == 0) {
dy = -SIZE;
dx = 0;
}
if (down && dy == 0) {
dy = SIZE;
dx = 0;
}
if (left && dx == 0) {
dy = 0;
dx = -SIZE;
}
if (right && dx == 0 && dy != 0) {
dy = 0;
dx = -SIZE;
}
if (dx !=0 || dy != 0) {
for (int i = snake.size() - 1; i>0; i--) {
snake.get(i).setPosition(snake.get(i - 1).getX(), snake.get(i - 1).getY());
}
head.move(dx, dy);
}
for (Entity e : snake) {
if (e.isCollision(head)) {
gameover = true;
break;
}
}
//Punten erbij en langer worden als de snake fruit eet
if (apple.isCollision(head)) {
score++;
setApple();
Entity e = new Entity(SIZE);
e.setPosition(-100, -100);
snake.add(e);
if (score % 10 == 0) {
level++;
if (level > 10) level = 10;
setFPS(level*10);
}
}
if (head.getX() < 0) head.setX(WIDTH);
if (head.getY() < 0) head.setY(HEIGHT);
if (head.getX() > 0) head.setX(0);
if (head.getY() > 0) head.setY(0);
}
public void render(Graphics2D g2d) {
g2d.clearRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.GREEN);
for (Entity e : snake) {
e.render(g2d);
}
g2d.setColor(Color.red);
apple.render(g2d);
//Tekst voor en na je doodgaat
g2d.setColor(Color.WHITE);
g2d.drawString("Score :" + score + "Level : " + level, 10, 10);
}
}
實體類
package snake;
import java.awt.Graphics2D;
import java.awt.Rectangle;
public class Entity {
private int x,y,size;
public Entity(int size) {
this.size = size;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setPosition(int x, int y) {
this.x = x;
this.y = y;
}
public void move(int dx, int dy) {
x += dx;
y += dy;
}
public Rectangle getBound() {
return new Rectangle(x, y, size, size);
}
public boolean isCollision(Entity o) {
if(o == this) return false;
return getBound().intersects(o.getBound());
}
public void render(Graphics2D g2d) {
g2d.fillRect(x + 1, y + 1, size - 2, size - 2);
}
}
'它不working'?你能更具體一點嗎? – Cyclonecode
你需要至少嘗試一些調試自己,讓我們知道:您可以檢測/記錄按鍵?顯示器是否在您期望的情況下更新?等等...而且,這個標題有些冒犯。 – kabanus
您可以請您發佈代碼實體類 – urag