长话短说,我正在用 Java 制作一款赛车游戏。我使用一些书籍和我的数学逻辑知识自学成才,而且我只编程了三周,所以我仍在学习这一切的来龙去脉。以下是一些背景知识:
我有一个被边界矩形包围的玩家图像,代码将检查该玩家矩形何时与终点线矩形相交。每次成功与线相交时,p1Laps 都会递增。当数值达到一定值时,游戏结束,玩家被宣布为获胜者。
这是问题和问题: 我的问题是,每次矩形交叉时,Java 都会计算多个相交。通常有 8 个相交,因此 p1Laps 会增加 8 倍。如果这种情况持续发生,这不会成为问题,但有时圈数会以不同的值增加。我遇到过 4,7 和 8 的增量,因此很难设置一个值来确保比赛在一定圈数后结束。
我的第一个问题是“为什么?”当两个矩形相交时,为什么java会计算这么多相交次数?我假设这与它们都是二维形状有关,但我可能是错的。
我的第二个问题是如何使增量以一致的值发生?最好是“1”,但这并不是最重要的,因为我可以调整最终值。
这是似乎相关的代码(删除了很多代码):
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.applet.AudioClip;
public class RacerDoom extends JFrame {
//lap counter
int p1Laps=0;
//bouding rectangles
Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30);
Rectangle finishtop = new Rectangle(WIDTH/9,(HEIGHT/2)-HEIGHT/9,(int)((WIDTH/9)*1.5),HEIGHT/70);
//check for intersect
if(p1.intersects(finishtop)&&p1Direction==UP){
p1Laps++;}
//choose winner
if(p1Laps>=24) {
if(!winnerChosen) {
winnerChosen = true;
break;
}
}
如前所述,增量通常会增加 8,但我让它们无缘无故地增加 7,并且如果启用“Boost”(使玩家的速度加倍),它们只会增加 4。 感谢您的帮助。
最佳答案
原因可能是汽车需要几帧才能冲过终点线。您可以通过跟踪每辆车是否已经穿过终点线来解决这个问题。为每辆车使用一个 boolean 变量,例如
boolean p1IsOnFinishLine = false;
boolean p2IsOnFinishLine = false;
修改 if
以检查汽车是否与终点线相交并且 p1IsOnFinishLine
为 false
- 这意味着这是汽车冲线的第一帧。如果是这样,请增加 p1Laps
并将 p1IsOnFinishLine
设置为 true
。现在,在下一帧中,汽车仍将与终点线相交,但由于 p1IsOnFinishLine
为 true
,您知道您已经计算了该圈数,因此您不需要不需要再做一次。当汽车不再与终点线相交时,您可以将 p1IsOnFinishLine
设置为 false
,以便为下一次穿越做好准备。
关于java - 如何使两个矩形相交时的增量可预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366545/