1

要下载代码,请点击以下链接

背景

所以我一直在阅读 pygame 教程,因为我是新手,我发现了 Eli Bendersky 的著名教程。我正在经历第一部分,并试图通过使其成为“社交猫”来增加我自己的天赋。猫会四处游荡,如果它们互相接触,它们就会互相吃草并分道扬镳。换句话说,Eli 拥有相同的东西,但具有碰撞检测和新的精灵。我认为这将是一个很好的做法。在过去的几天里,我一直在研究碰撞检测以及不同的人如何做到这一点,但我还没有看到一个适用于我的场景或类似情况的。我开始看到我所在的社区有多小。

目标

最终,我试图做到这一点,当一只猫撞到另一只猫时,相撞的那只猫会朝一个随机方向飞去,这个方向比它当前的方向少或多 45 度。

问题

我正在导入 vec2d,我有我的 Cat 类和我的主类。我想主要进行碰撞检测,因为稍后我将创建一个 GameManager 类来监视正在发生的事情。根据 OOP,猫不应该知道彼此。我一直无法让碰撞检测工作。我尝试了几种不同的方法。在这两种方式中,当它们相互接触时,什么都不会发生。我得到的印象是我想做的事情比我想象的要复杂得多。我怎么搞砸了?我觉得好像我在这一方面浪费了足够多的时间。当然,这是学习的过程。想法?

方式一:

    mainWindow.fill(_white_)
    for cat in cats:
        cat.update(timePassed)
        cat.blitme()
        catsCollided = pg.sprite.spritecollide(cat, catGroup, True)
        print pg.sprite.spritecollide(cat, catGroup, False)

    for cat in catsCollided:
        cat.currentDirection.angle = randint(int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45))   

方式二:

    mainWindow.fill(_white_)
    for cat in cats:
        cat.update(timePassed)
        cat.blitme()
        print pg.sprite.spritecollide(cat, catGroup, False)


    tempCatList = list(cats)
    for catA in cats:
        tempCatList.remove(catA)
        for catB in cats:
            if catA.rect.colliderect(catB.rect):
                cats[cats.index(catA)].currentDirection.angle = randint(int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45))
4

1 回答 1

1

您的第一种方法是正确的,但是只有一些错误。Sprite 碰撞是最好的方法。首先,您希望 sprite collide 中的第三个参数为 true 的情况很少,除非我完全误解了您的代码是如何做到的,否则您不想使用 True。当你指定 True 时,它​​会在碰撞时自动删除两个精灵。另一件事是您要确保过滤掉自碰撞。基本上,如果一个精灵在自身上运行精灵碰撞,它会记录与自身的碰撞。关于您的代码的最后一件事是,尽管您的 randint 选择器可能工作(您可能想测试它返回的内容),但 random.choice() 将更适合您正在寻找的内容。实施这些更改后,它看起来像这样:

mainWindow.fill(_white_)
for cat in cats:
    cat.update(timePassed)
    cat.blitme()
    catsCollided = pg.sprite.spritecollide(cat, catGroup, False)   #False makes it so colliding sprites are not deleted
    print pg.sprite.spritecollide(cat, catGroup, False)

for cat in catsCollided:                                           #by the way although this is perfectly fine code, the repetition of the cat variable could be confusing
    if cat != self:                                                #checks that this is not a self collision
        cat.currentDirection.angle = random.choice([int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45])
于 2013-11-23T23:30:23.997 回答