当两个矩形交叉可预测时如何进行增量?

时间:2011-09-09 19:29:27

标签: java increment intersect

长话短说,我正在用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(看似)没有理由,如果启用“增强”,它们只增加4(使玩家的速度加倍)。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

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

boolean p1IsOnFinishLine = false;
boolean p2IsOnFinishLine = false;

修改您的if以检查汽车是否与终点线 p1IsOnFinishLine相交false - 这意味着它是第一帧汽车撞上了线。如果是,请将p1Laps 设置为p1IsOnFinishLinetrue。现在,在下一帧中,汽车仍然会与终点线相交,但由于p1IsOnFinishLinetrue,你知道你已经计算了那一圈,所以你不需要再做一次。当汽车不再与终点线相交时,您可以将p1IsOnFinishLine设置为false,以便为下一次穿越做好准备。

答案 1 :(得分:1)

玩家确实与多个帧的终点线相交。每次更新,您都会检查 是否相交。这意味着您需要与终点线相交的8帧长。我建议改变检查过境线的方式。

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

    喜欢(假设你从下到上赛车):

    if (p1.y > finishLineY && p1.y + speedY < finishLine) lap++;
    

答案 2 :(得分:1)

其他答案告诉你问题所在。

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