您好,作为一名Java程序员,我正忙于用Java创建一个简单的吃豆子游戏,只是为了锻炼身体,我为幽灵创建了一种方法,可以让它随机地垂直移动垂直方向,但是我有一些问题,我不知道该如何强制它可以左右或上下移动(因此不能同时),我现在的幽灵代码如下:
public void moveUp() {
}
public void moveLeft() {
if (g1x >= 500) { g1x = 500; g1r = false; }
else if (g1x <= 0) { g1x = 0; g1r = true; }
}
public void moveRight() {
if (g1x >= 500) { g1x = 500; g1r = false; }
else if (g1x <= 0) { g1x = 0; g1r = true; }
}
public void moveDown() {
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
// pacman movement
diameter = 25;
pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, getView(), Color.yellow);
// ghosts movement
g1x += ghostSpeed * (Math.random() > 0.5? 1 : -1); // random direction
Random randomGen = new Random();
// generate a random number, between 0 - 3
int randomize = randomGen.nextInt(4);
switch(randomize) {
case 0:
moveUp();
System.out.println("up");
break;
case 1:
moveLeft();
System.out.println("Left");
break;
case 2:
moveRight();
System.out.println("Right");
break;
case 3:
moveDown();
System.out.println("down");
break;
}
ghost.drawGhost(g, randomize, 40, diameter, Color.red);
}
如您所见,我已经在方向上使用了randomize变量,并且水平位置进行了硬编码,但是水平位置也由randomize表示,但是如果我同时使用它,则会产生一些奇怪的对角线运动
下一个问题是我在这样的建筑中使用计时器
public PacMan() {
// create timer and start timer
javax.swing.Timer autoKlik = new javax.swing.Timer(WACHTTIJD, this);
autoKlik.start();
}
因此方向的随机值正在快速变化(500ms),但是速度也可以配置游戏速度,因此我认为我犯了一个逻辑错误,但我不确定如何解决此问题。也许我必须将动作分开吗?还是有更简单的方法来实现这一目标,请与我分享您的技能,我很乐于学习:),如果您可能需要更多代码,可以在此处发布或提供指向我的github帐户的链接,以便您可以查看:)
提前致谢!
链接到完整源代码:pacman game source
最佳答案
我建议将关注点分开:
一组用于模拟仿真的类,仅包含实体和逻辑
一组绘制吃豆人的图形类
一个由控制器来处理动作并将其委托给模型(由swing类触发)
由于性能原因,在paint()方法中,仅执行绘画操作,切勿“新建”或调用复杂的方法。框架经常调用Paint。
关于java - 固定计时器和随机方向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13034841/