gpt4 book ai didi

java - 需要有关 Breakout 游戏碰撞错误的帮助

转载 作者:行者123 更新时间:2023-12-01 14:49:06 27 4
gpt4 key购买 nike

这是 12 年级的 OPP 作业。

目前我遇到一个问题,球偶尔会进入方 block 而不是反射。

这是我的代码:

主要如何检查球是否击中方 block :

public void theBall(){
//System.out.println(blocks.size());
if(!started){
balls.get(0).withPaddle(paddle.returnX());
}
if(started){
for(int i=0;i<balls.size();i++){
if(balls.get(i).returnX()>=0 && balls.get(i).returnX()<=800 && balls.get(i).returnY()>=0){
balls.get(i).move();
}
if(balls.get(i).returnX()+balls.get(i).returnDx()<= 0){
balls.get(i).collide(1);//collide with left wall
}
if(balls.get(i).returnX()+10+balls.get(i).returnDx() >= 800){
balls.get(i).collide(2);//collide with right wall
}
if(balls.get(i).returnY()-balls.get(i).returnDy() <= 0){
balls.get(i).collide(3);//collide with up wall
}

if(paddle.returnX() < balls.get(i).returnX() && balls.get(i).returnX()< paddle.returnX()+paddle.returnSize() && balls.get(i).returnY()-balls.get(i).returnDy() >= 545){//fix this && balls.get(i).returnY()-balls.get(i).returnDy() <= 560
balls.get(i).collidePaddle(balls.get(i).returnX()-paddle.returnX());//collide with paddle
//System.out.println(ball.returnDy());
}
for(int j=0;j<blocks.size();j++){
//blocks.get(j).getHit(balls.get(i));
if(balls.get(i).returnX()+10+balls.get(i).returnDx() >= blocks.get(j).returnX() && balls.get(i).returnX()+10+balls.get(i).returnDx() <= blocks.get(j).returnX()+5 && balls.get(i).returnY() >= blocks.get(j).returnY() && balls.get(i).returnY() < blocks.get(j).returnY()+50){
if(!blocks.get(j).returnHit()){
balls.get(i).collide(2);//collide with right wall (block's left)
blocks.get(j).getHit(balls.get(i));
System.out.println("boiboiboiboibo1");
}
}

if(balls.get(i).returnX()+balls.get(i).returnDx() <= blocks.get(j).returnX()+50 && balls.get(i).returnX()+balls.get(i).returnDx() >= blocks.get(j).returnX()+45 && balls.get(i).returnY() >= blocks.get(j).returnY() && balls.get(i).returnY() < blocks.get(j).returnY()+50){
if(!blocks.get(j).returnHit()){
balls.get(i).collide(1);//collide with left wall (block's right)
blocks.get(j).getHit(balls.get(i));
System.out.println("boiboiboiboibo2");
}
}

if(balls.get(i).returnX() >= blocks.get(j).returnX() && balls.get(i).returnX() < blocks.get(j).returnX()+50 && balls.get(i).returnY()-balls.get(i).returnDy() <= blocks.get(j).returnY()+50 && balls.get(i).returnY()-balls.get(i).returnDy() >= blocks.get(j).returnY()+45){
if(!blocks.get(j).returnHit()){
balls.get(i).collide(3);//collide with up wall (block's bottom)
blocks.get(j).getHit(balls.get(i));
System.out.println("boiboiboiboibo3");
}
}
if(balls.get(i).returnX() >= blocks.get(j).returnX() && balls.get(i).returnX() < blocks.get(j).returnX()+50 && balls.get(i).returnY()+10-balls.get(i).returnDy() >= blocks.get(j).returnY() && balls.get(i).returnY()+10-balls.get(i).returnDy() <= blocks.get(j).returnY()+5){
if(!blocks.get(j).returnHit()){
balls.get(i).collide(4);//collide with down wall (block's top)
blocks.get(j).getHit(balls.get(i));
System.out.println("boiboiboiboibo4");
}
}
}
for(int j=0;j<specialBlocks.size();j++){
if(balls.get(i).returnX()>=specialBlocks.get(j).returnX() && balls.get(i).returnX()<=specialBlocks.get(j).returnX()+100 && balls.get(i).returnY()>=specialBlocks.get(j).returnY() && balls.get(i).returnY()<=specialBlocks.get(j).returnY()+100){
oneAndThreeBalls(i, j);
balls.get(i).changeType(j);
}
}
}
}
}

球如何反射:

public void collide(int collideWith){
if(collideWith==1){//collide with left wall
if(90<direction && direction<180){
direction = 180-direction;
}
if(180<direction && direction<270){
direction = 540-direction;
}
}
if(collideWith==2){//collide with right wall
if(0<direction && direction<90){
direction = 180-direction;
}
if(270<direction && direction<360){
direction = 540-direction;
}
}
if(collideWith==3){//collide with up wall
direction = 360-direction;
}
if(collideWith==4){//collide with down wall
direction = 360-direction;

}
}

我很清楚该错误是由于边界的双重检查造成的。当球位于方 block 的角落时,就会发生这种情况。但这是我能想到的检查球的位置是否反射(reflect)的唯一方法。我有什么想法可以修复这个错误吗?谢谢。

最佳答案

为什么不这样做:

1) 弹跳后,您停止检查该球的碰撞,直到游戏的下一个周期。这样球每次跳动只能弹跳一次。

2) 与方 block 碰撞并弹开后,您会忽略该特定方 block 与球之间的碰撞,直到球不与方 block 重叠为止。这样,球就不会在相同的撞击下从木 block 上虚假地反弹两次。

顺便说一句,您有很多复制和粘贴的代码,只有数字等方面的细微变化。如果您找到一种方法来重述它,即使用稍微不同的参数不断调用的方法,您的代码将变得更加整洁,问题的基本对称性也将更加明显。

关于java - 需要有关 Breakout 游戏碰撞错误的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059856/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com