0

长话短说,我正在用 Java 制作赛车游戏。我使用一些书籍和我的数学逻辑知识自学成才,而且我只编程了三周,所以我仍在学习这一切的来龙去脉。这里有一些背景:

我有一个由边界矩形包围的玩家图像,代码将检查该玩家矩形何时与作为终点线的矩形相交。每次成功与线相交时,p1Laps 都会增加。当该值达到某一点时,游戏结束,玩家被宣布为获胜者。

这是问题和问题:我的问题是Java在每次矩形交叉时计算多个相交。通常有 8 个相交,因此 p1Laps 会增加 8 倍。如果它始终如一地发生,这将不是问题,但有时圈数会以不同的值递增。我遇到了 4,7 和 8 的增量,因此很难设置一个值来确保比赛将在一定圈数后结束。

我的第一个问题是“为什么?” 当两个矩形交叉时,为什么java会计算这么多相交?我假设这与它们都是 2D 形状有关,但我可能是错的。

我的第二个问题是如何使增量以一致的值发生?最好是“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。谢谢你的帮助。

4

3 回答 3

3

原因可能是汽车需要几帧才能越过终点线。您可以通过跟踪每辆车是否已经穿过终点线来解决这个问题。boolean为每辆车使用一个变量,例如

boolean p1IsOnFinishLine = false;
boolean p2IsOnFinishLine = false;

修改您if以检查汽车是否与终点线相交并且 p1IsOnFinishLinefalse- 这意味着它是汽车撞线的第一帧。如果是这样,增加p1Laps 设置p1IsOnFinishLinetrue。现在,在下一帧中,汽车仍会与终点线相交,但既然p1IsOnFinishLinetrue,您就知道您已经数完了那一圈,所以您不需要再做一次。当汽车不再与终点线相交时,您可以设置p1IsOnFinishLinefalse,以便为下一次穿越做好准备。

于 2011-09-09T19:37:36.393 回答
1

玩家确实与多帧终点线相交。每次更新,您检查它是否相交。这意味着您将与终点线相交 8 帧。我的建议是改变检查越线的方式。

  • 使用一条线而不是矩形作为终点线。这并不意味着您不能将其保留为屏幕上的矩形。
  • 使用检查系统,例如:
    如果(玩家在线之前并且下一帧玩家将在终点线之后)然后 lap++

    类似的东西(假设你从下到上比赛):

    if (p1.y > finishLineY && p1.y + speedY < finishLine) lap++;
    
于 2011-09-09T19:40:12.960 回答
1

其他答案告诉你问题出在哪里。

但是,一种简单的解决方法是尝试调试它。您将在 IDE(集成开发环境)中编写 Java 代码。通常,它们带有调试器。您可以使用调试器设置断点。当您在调试模式下运行代码并且代码到达断点所在的确切行时,它将暂停并且调试器会将您带到您的代码。然后你可以看到发生了什么。您将能够查看变量,例如 p1Laps。然后,您可以逐行运行代码。检查行为,它会告诉你很多关于代码的信息,通常你可以立即发现问题。

于 2011-09-09T19:44:03.840 回答