试图在两个不同的类之间进行碰撞

时间:2018-12-13 22:11:22

标签: class processing collision

对不起,我没有在这里发布代码,但是格式搞砸了,无法正确发布。我正在尝试制作一种游戏,其中玩家控制飞船,小行星从屏幕的右侧移动,玩家必须避开它们。在我的一生中,我无法弄清楚如何使小行星与玩家碰撞,从而导致玩家迷失并可以使用一些帮助。

My Code for my game

1 个答案:

答案 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;}

希望有帮助!