首页 > 解决方案 > 试图在两个不同的类之间进行碰撞

问题描述

抱歉,我没有在这里发布我的代码,但格式搞砸了,无法正确发布。我正在尝试制作一个游戏,其中玩家控制一艘船,小行星从屏幕右侧进入,玩家必须避开它们。对于我的生活,我无法弄清楚如何让小行星与玩家相撞导致玩家失败并且可以使用一些帮助。

我的游戏代码

标签: classprocessingcollision

解决方案


你很接近。

在函数 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;}

希望能帮助到你!


推荐阅读