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

获取碰撞的侧面:碰撞检测

太叔志文
2023-03-14

我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况?

下面是我的玩家类:

class Player(pg.sprite.Sprite):
    def __init__(self,game):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((30, 40))
        self.game = game
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)
        self.pos = vec(WIDTH / 2, HEIGHT / 2)
        self.vel = vec(0, 0)
        self.acc = vec(0, 0)

    def jump(self):
        self.rect.y += 1
        hits = pg.sprite.spritecollide(self, self.game.platforms, False)
        self.rect.y -= 1
        if hits:
            self.vel.y = -15

    def update(self):
        self.acc = vec(0, PLAYER_GRAV)
        keys = pg.key.get_pressed()
        if keys[pg.K_LEFT]:
            self.acc.x = -PLAYER_ACC
        if keys[pg.K_RIGHT]:
            self.acc.x = PLAYER_ACC
        self.acc.x += self.vel.x * PLAYER_FRICTION
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc


        self.rect.midbottom = self.pos
class Platform(pg.sprite.Sprite):
    def __init__(self, x, y ,w, h):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((w,h))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.centerx = x+(w/2)
        self.centery = y+(h/2)
hits = pg.sprite.spritecollide(self.player,self.platforms, False)

if hits:
    self.player.pos.y = hits[0].rect.top+1
    self.player.vel.y = 0

我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。

def wall_collisions(self):
    self.rect.centerx = self.pos.x
    for wall in pg.sprite.spritecollide(self, self.walls, False):
        if self.vel.x > 0:
            self.rect.right = wall.rect.left
            self.vel.x = 0
        elif self.vel.x < 0:
            self.rect.left = wall.rect.right
            self.vel.x = 0
        self.pos.x = self.rect.centerx

    self.rect.centery = self.pos.y
    for wall in pg.sprite.spritecollide(self, self.walls, False):
        if self.vel.y > 0:
            self.rect.bottom = wall.rect.top
            self.vel.y = 0
        elif self.vel.y < 0:
            self.rect.top = wall.rect.bottom
            self.vel.y = 0
        self.pos.y = self.rect.centery

在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非我把玩家压在他们身上然后跳。如果我试图打在平台底部的球员,它会把我射到平台的任何一边。有人帮忙吗?

共有1个答案

任飞鸣
2023-03-14

我找到了一个有效的解决办法。下面的代码工作得非常好。

def wall_collisions(self):
    self.rect.centerx = self.pos.x
    for wall in pg.sprite.spritecollide(self, self.walls, False):
        if self.vel.x > 0:
            self.rect.right = wall.rect.left
            self.vel.x = 0
        elif self.vel.x < 0:
            self.rect.left = wall.rect.right
            self.vel.x = 0
        self.pos.x = self.rect.centerx

    self.rect.centery = self.pos.y
    for wall in pg.sprite.spritecollide(self, self.walls, False):
        if self.vel.y > 0:
            self.rect.bottom = wall.rect.top
            self.vel.y = 0
        elif self.vel.y < 0:
            self.rect.top = wall.rect.bottom
            self.vel.y = 0
        self.pos.y = self.rect.centery
 类似资料:
  • 我下面的碰撞方法有问题。问题是当游戏中有两个敌人时。它与循环中的一个敌人相交,然后返回true进行碰撞。但是如果在这个数组列表中有第二个敌人,它将不会与第二个物体碰撞,因此导致它返回false,玩家继续行走。有什么办法可以让他在接触任何敌人时停下来,而不是因为他没有接触到所有的敌人而继续下去吗?谢谢,这是密码。

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 问题内容: 在pygame中,有没有一种方法来寻找某一方之间的碰撞 一个精灵和另一个精灵的特殊一面?例如,如果 精灵A的顶部与精灵B的底部碰撞,返回True。 我肯定有办法做到这一点,但我找不到任何特别的方法 在文档中。 谢谢! 问题答案: 在PyGame中没有函数来获取侧面碰撞。 但你可以试着用 pygame.Rect.CollipePoint公司 测试是否,,, ,,,, 在里面 (pygam

  • 问题内容: 有人可以帮我了解JS中冲突检测的工作原理吗?我不能使用jQuery或gameQuery-已经使用了原型- 因此,我正在寻找非常简单的东西。不要求完整的解决方案,只需为我指明正确的方向。 假设有: 现在球正在移动(任何方向)。“ Someobject”(0-X)已经预先定义,其中有20-60个随机放置,如下所示: 我可以创建一个位置为“ someobject(X)”的数组,并在“球”移动

  • 我已经尝试添加冲突检测一段时间了,但似乎做不到... 要绘制地图,我只需使用x,y坐标: 使用这种方法,我想出了这种检测: 我一直在尝试使用for循环遍历树来检测玩家(一个矩形)是否穿过树,但我想不出任何东西。 我已经试过了 如果碰撞=true,player.update(碰撞)将矩形更改为红色,如果为false,将矩形变为黑色。 我已尝试使用for和if,例如: 等但这不起作用,它只适用于wit