当前位置: 首页 > 知识库问答 >
问题:

为什么我的碰撞检测方法不起作用?

祁宝
2023-03-14

我了解碰撞检测的基础,并开发了我自己的碰撞检测方法(据我所知)。然而,这似乎并不奏效。我所做的不是围绕精灵、形状和其他对象绘制完整的矩形,而是简单地在对象的所有边(左、右、上、下)绘制线条(非常细的矩形)。

在指定子画面的左侧、右侧、顶部和底部绘制细矩形的方法。这可能不是进行碰撞的最佳方式,但这就是我所拥有的,并且对所有想法和不同的解决方案持开放态度!

注:(int)(x-Game.getCamera()。getX()),(int)(y height -Game.getCamera()。getY()),只是为了相机,所以当玩家移动时,树(在我的例子中,我想碰撞的对象)不会随他移动

public Rectangle getBounds() {
return new Rectangle((int)(x-Game.getCamera().getX()),
        (int)(y + height - Game.getCamera().getY()),width,height-height);
}

public  Rectangle getBoundsTop() {
return new Rectangle((int)(x-Game.getCamera().getX()),
        (int)(y- Game.getCamera().getY()),width,height-height);
}

public  Rectangle getBoundsRight() {
return new Rectangle((int)(x + width -Game.getCamera().getX()),
        (int)(y - Game.getCamera().getY()),width - width,height);

}

public  Rectangle getBoundsLeft() {
return new Rectangle((int)(x -Game.getCamera().getX()),
        (int)(y- Game.getCamera().getY()),width - width,height);

    }

实际碰撞检查(在玩家类中)-

if(getBounds().intersects(treeTile.getBoundsTop())) {
    //What happens when they collide
    //When the bottom of the player collides with the top of the tree.
    }
if(getBoundsTop().intersects(treeTile.getBounds())) {
    //What happens when they collide
    //When the top of the player collides with the bottom of the tree

    }
if(getBoundsRight().intersects(treeTile.getBoundsLeft())) {
    //What happens when they collide
    //when the right side of the player collides with the left of the 
    //tree
    }
if(getBoundsLeft().intersects(treeTile.getBoundsRight())) {
    //What happens when they collide
    //When the left of the player collides with the right of the tree
    }

我很感激我能得到的一切帮助

这是碰撞和移动代码-

for (int i = 0; i < handler.object.size(); i++) {
        Square handle = handler.object.get(i);
    if (getBounds().intersects(treeTile.getBoundsTop())) {
            handle.setvelY(-1);

    }
    if (getBoundsTop().intersects(treeTile.getBounds())) {
            handle.setvelY(0);

    }
    if (getBoundsRight().intersects(treeTile.getBoundsLeft())) {
            handle.setvelX(0);
    }
    if (getBoundsLeft().intersects(treeTile.getBoundsRight())) {
            handle.setvelX(0);

    }
    }

移动-

    public void keyPressed(KeyEvent e) {

    int code = e.getKeyCode();



    for (int i = 0; i < handler.object.size(); i++) {
        Square handle = handler.object.get(i);

        if (handle.getId() == ObjectId.Zelda) {


            if (code == KeyEvent.VK_D) {
                handle.right();
            }
            if (code == KeyEvent.VK_A) {
                handle.left();
            }
            if (code == KeyEvent.VK_W) {
                handle.up();
            }
            if (code == KeyEvent.VK_S) {
                handle.down();
            }
 }

我的新碰撞想法-

boolean walkRight = true;
boolean walkLeft = true;
boolean walkDown = true;
boolean walkUp = true;
public void tick() {

    if(walkRight == true) {
        velX = 2;

    }if(walkLeft == true) {
        velX = -2;

    }if(walkDown == true) {
        velY = 2;

    }if(walkUp == true) {
        velY = -2;
    }


if (getBounds().intersects(treeTile.getBoundsTop())) {
       walkDown = false;

}
if (getBoundsTop().intersects(treeTile.getBounds())) {
        walkUp = false;
}
if (getBoundsRight().intersects(treeTile.getBoundsLeft())) {
        walkRight = false;

}
if (getBoundsLeft().intersects(treeTile.getBoundsRight())) {
        walkLeft = false;

} 

像这样的事情,不完全是,这只是一个例子。

共有1个答案

邓鸿信
2023-03-14

你试过用1代替宽-宽和高-高吗?

我认为这些宽度/高度计算为0会导致intersects函数失败。

编辑

我认为你把这过于复杂了。如果你只有一个大的碰撞盒,而不是四个小的碰撞盒,那么无论你在哪里移动你的播放器,你都可以

// Square previousPosition = currentPosition
// do move player code, which presumably updates the currentPosition
// loop through all the trees you have
//    if the player is colliding with a tree
//        currentPosition = previousPosition

这应该可以处理玩家与树的任何一侧发生碰撞的情况,因为我们只是将其移回之前所在的位置。

 类似资料:
  • 我正在尝试检测我的两个精灵何时发生碰撞。我做的第一件事是在我的播放器周围创建一个矩形(称为player.img),然后在我想检测的树周围创建另一个矩形(称为背景.treesrect)。我将玩家矩形的坐标设置为等于当用户按下键移动时更新的坐标,但玩家矩形不移动。然后我使用精灵.碰撞(精灵)函数来检测它们是否碰撞并且没有检测到。有人可以向我展示为什么我的播放器矩形没有更新以及其他任何可能错误的内容吗?

  • 我正在制作我的第一个自由移动(不是瓷砖限制)2d游戏,想知道如何使用冲突检测。我有3种可能的方法在我的脑海中,但不确定什么是最有效的: > 地图上的每个物体都有一个比图像本身更小的纹理(例如,一棵树只有一个更小的纹理代表它的底部),不能碰撞。为此,我会使用第二个不可见的纹理来标记该区域。 每个对象都有一个用于碰撞的矩形或圆形区域。可能每个纹理都需要一个辅助文件,说明碰撞的大小(再次以树为例)。 我

  • 当我尝试检测两个矩形之间的碰撞时当我启动程序时,它只打印“HIT”一次 我还尝试使用但出现此错误: 回溯(最近调用最后): 文件“D:/蟒蛇/PyCharm/test/src/Main/test.py”,第 104 行, 命中 = pygame.sprite.spritecollide(player_sprites,enemy_sprites,1) 文件“D:\程序\蟒蛇\lib\site-pac

  • 我正在尝试使代码中的冲突检测正常工作。我正在使用矢量,我希望玩家精灵在与称为的精灵组碰撞时碰撞并停止。问题是玩家可以通过底墙。 在这个例子中,我关闭了重力。 x冲突是可以的,但它有点滑稽,只有y方向不能正常工作与相同的代码。 我已经尝试使用调试器调试代码,但没有成功。 我主要感兴趣的是弄清楚为什么垂直碰撞检测不起作用,但我也希望得到关于水平碰撞检测的建议。 友情链接: 吉特哈布 : 完整代码 当前

  • 大家好,我正在用Java制作一个体素游戏,在研究我需要学习的所有不同内容时,我注意到很多游戏都使用AABB进行碰撞检测。然后我记得在Minecraft中也看到了AABB。但当我在谷歌上搜索什么是AABB时,它只会给出其他人的代码,或者历史书上的某个组织。Stackoverflow,什么是AABB?

  • 我正在用pygame和数学模块用python编写一个游戏。我写了这些代码来进行碰撞检测(我制造了5个障碍物,我想让我的玩家与之碰撞),但问题是在玩游戏的过程中,有时有效,有时无效。 这些是我定义的碰撞函数 在while循环中 请告诉我哪里做错了。