簡體   English   中英

移動時如何使敵人的精靈碰撞而不能嚙合在一起

[英]How to make enemy sprites collide and not mesh together when moving

編輯:請不要再指我指的是與搖滾游戲相撞的那只鳥,我的問題不在他附近。 我的玩家可以與游戲中的牆壁碰撞而不會穿過牆壁,但是代碼不會傳遞給僵屍。 僵屍不會相互碰撞和摩擦,它們只會彼此滑動並成為一個塊。 請在下面閱讀我的說明<3

因此,我正在開發pygame中的游戲,當玩家將僵屍擊落時,僵屍會向玩家移動(我知道,原始的,對嗎?),但是我必須檢測到僵屍相互碰撞的代碼在任何實際操作中均不起作用如果沒有這種方式,僵屍只會向玩家移動並嚙合成一個僵屍塊。 我如何更改僵屍的代碼,以使它們在靠近進食時不會互相碰到對方?

class Enemy(pygame.sprite.Sprite):
    def __init__(self, color):
        super().__init__()
        self.image = pygame.Surface([20, 20])
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.pos_x = self.rect.x = random.randrange(35, screen_width - 35)
        self.pos_y = self.rect.y = random.randrange(35, screen_height - 135)

        # How Zombies move towards player

    def update(self):
        zombie_vec_x = self.rect.x - player.rect.x
        zombie_vec_y = self.rect.y - player.rect.y
        vec_length = math.sqrt(zombie_vec_x ** 2 + zombie_vec_y ** 2)
        zombie_vec_x = (zombie_vec_x / vec_length) * 1 # These numbers determine
        zombie_vec_y = (zombie_vec_y / vec_length) * 1 # zombie movement speed

        self.pos_x -= zombie_vec_x
        self.pos_y -= zombie_vec_y

        self.rect.x = self.pos_x
        self.rect.y = self.pos_y


        block_hit_list = pygame.sprite.spritecollide(self, sprites_list, False)
        for block in block_hit_list:
            if self.rect.x > 0:
                self.rect.right = block.rect.left
            elif self.rect.x < 0:
                self.rect.left = block.rect.right
            elif self.rect.y > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom

這是完整的僵屍代碼,當前的碰撞代碼在底部,從block_hit_list =開始。 我們將不勝感激關於如何糾正此錯誤或解釋沖突編碼是如何工作的!

由於您尚未詳細描述坐標系,因此我不確定代碼細節是否100%正確。 但是,要點是必須為當前的僵屍移動找到一個安全的地方,該地方沒有其他僵屍。 這確實需要您從限制最大的區域到最小的區域工作。 您可以將僵屍按某種空間順序分類嗎? 也許從左下角到右上角遍歷您的僵屍列表?

鑒於此,每個僵屍都必須檢查相對於所有其他僵屍的位置,而不僅僅是依次躲開彼此的僵屍。 您必須更全面地考慮x和y方向。 我認為這可以很好地實現,具體取決於移動速度(僵屍可以跨步超過僵屍寬度的一半嗎?)。

    block_hit_list = pygame.sprite.spritecollide(self, sprites_list, False)
    if self.rect.x > 0:
        self.rect.right = min(block.rect.left for block in block_hit_list)
    else:
        self.rect.left = max(block.rect.right for block in block_hit_list)

    if self.rect.y > 0:
        self.rect.bottom = min(block.rect.top for block in block_hit_list)
    else:
        self.rect.top = max(block.rect.bottom for block in block_hit_list)

請注意,我要處理兩個坐標,而不僅僅是一個坐標-我假設僵屍可以對角移動。 我不確定在您的坐標系中方向是否正確匹配:如果self.rect.x> 0,我是否想要正向的僵屍的左邊緣? 我不知道您的坐標系中是left> right還是top> bottom。 請根據需要進行測試和調整。

另外,請在每個分支中臨時插入一個跟蹤打印語句:至少在之前和之后顯示x / y坐標。

這是否會使您邁向解決方案?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM