簡體   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