繁体   English   中英

使精灵互相弹起

[英]Making sprites bounce off of each other

要下载代码,请点击链接

背景

因此,自从接触它以来,我就一直在阅读pygame教程,并找到了Eli Bendersky的著名教程 我正在阅读第一部分,并尝试通过将其制作为“社交猫”来增加自己的才能。 猫会四处游荡,如果彼此碰触,它们就会互相掠食并走分开的路。 换句话说,Eli拥有相同的东西,但是具有碰撞检测和新的Sprite。 我认为这将是一个好习惯。 过去几天我一直在研究碰撞检测以及不同的人如何做,但是我还没有看到可以与我的场景或类似情况一起使用的方法。 我开始看到我所在的社区有多小。

目的

最终,我试图做到这一点,以便当一只猫碰到另一只猫时,发生碰撞的那只猫会沿等于或小于当前方向45度的随机方向飞行。

问题

我正在导入vec2d,并且具有Cat类和主类。 我想主要进行碰撞检测,因为稍后我将创建一个GameManager类来监视发生的事情。 根据OOP的说法,猫们无论如何都不应该互相认识。 我一直无法使碰撞检测正常工作。 我尝试了几种不同的方法。 两种方式在彼此接触时都不会发生。 我的印象是,我想做的比我感觉的要复杂得多。 我该如何解决? 我觉得我在这方面浪费了足够的时间。 当然,这就是学习过程。 思考?

方法1:

    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))   

方式2:

    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))

您的第一种方法是正确的,但是只有几个错误。 精灵碰撞是最好的方法。 首先,在极少数情况下,您希望sprite碰撞中的第三个参数为true,除非我完全误解了代码的运行方式,否则您不希望使用True。 当指定True时,它将在碰撞时自动删除两个精灵。 另一件事是您要确保过滤掉自碰撞。 基本上,如果一个sprite运行,sprite会在其自身上发生碰撞,则它会与自身发生碰撞。 关于代码的最后一件事是,尽管您的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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM