对不起,我没有在这里发布代码,但是格式搞砸了,无法正确发布。我正在尝试制作一种游戏,其中玩家控制飞船,小行星从屏幕的右侧移动,玩家必须避开它们。在我的一生中,我无法弄清楚如何使小行星与玩家碰撞,从而导致玩家迷失并可以使用一些帮助。
答案 0 :(得分:2)
您非常接近。
在move()函数中,计算播放器的新x和y位置:
void move() {
int r = d>>1;
sx = constrain(sx + v*(int(isRight) - int(isLeft)), r, width - r);
sy = constrain(sy + v*(int(isDown) - int(isUp)), r, height - r);
}
接下来,您要检查玩家的位置是否在小行星的边界内。
这是从您在Display()函数中的代码得出的:
void display() {
image(ship, sx, sy, 100, 50);
if (sx > a1x && sx < a1x && sy > a1y && sy < a1y){
image(explo, sx, sy, 200, 200);
}
这是正确的方向,但请检查玩家和小行星的x和y是否完全匹配。这是非常不可能的,因为它是玩家和小行星的确切角。此外,播放器每帧可能会移动1个像素以上,从而导致跳过触发器。
相反,请尝试以下操作:
if (sx > a1x && sx < a1x +asteroid.aw && sy > a1y && sy < a1y+asteroid.ah)
这将检查玩家x / y是否在小行星的边界内。并且应该得到您想要的结果。但是,这还没有说明玩家飞船的高度/宽度。所以你也应该检查
if (sx+player.width > a1x && sx+player.width< a1x +asteroid.aw && sy+player.height> a1y && sy+player.height< a1y+asteroid.ah)
最后,我将对您的代码进行一般性评论。有很多重复。我认为您正在学习,没关系,但是请允许我给您一些指针,使编写代码更加简单:使用ArrayLists和扩展对象的使用
ArrayList<Asteroid> List_Of_Asteroids = new ArrayList<Asteroid>();
List_Of_Asteroids.add(new Asteroid(random(X1,X2), random(Y1,Y2))
这将创建一个列表,您可以在其中添加或删除小行星对象。这使对所有小行星执行相同的操作变得容易,因为您只需键入一次即可。以及更少的代码。例如:
player.move();
for (Asteroid rock : List_Of_Asteroids){
if (player.collisionCheck(rock)){
gameOver(); //triggers explosion image and subtracts life / ends game
}
}
display();
只需5行即可检查所有小行星,即使有100条也是如此。与对象有关的所有事情都应该写在对象本身中。在您的代码中,小行星的x / y位置保持在主循环中。您可以轻松地将它们转移到对象。如果您查看上面的两个代码片段,则可以像这样在玩家类内部访问x / y小行星:
boolean collisionCheck(Asteroid a){
if (x > a.ax && x < a.ax+a.aw && y > a.ay && y < a.ay+a.ah){
return true;
else{
return false;}
希望有帮助!