亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

2D 平臺游戲的碰撞檢測

2D 平臺游戲的碰撞檢測

白衣染霜花 2022-08-16 15:29:17
我正在開發平臺游戲,我想與平臺進行基本的碰撞,遺憾的是仍然無法正確完成。玩家移動的計算公式如下:velocity += acceleration position += velocity + 0.5 * acceleration所有變量都是具有和值的向量。這按預期工作,問題是碰撞。我的規則是:xy降落在平臺上時停止摔倒。從平臺上運行時開始下降。在跳躍過程中撞到平臺時停止向上移動。撞墻時停止向一側移動,但能夠向相反的方向移動。檢查底部是否與平臺碰撞非常簡單,但棘手的部分是檢測,哪一側與平臺碰撞,并能夠為玩家設置適當的位置。我試圖從每一側檢測角落和中間,但由于我的速度不是每幀1px,有時玩家會下降到快速,并且也被檢測到側面。檢測哪一側碰撞的好方法是什么?
查看完整描述

2 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

我在javascript中有幾個類似平臺游戲的游戲,這就是我實現碰撞的方式:

1.降落在平臺上時停止掉落:你可以給你的精靈一個矩形作為邊界區域,然后使用Pygames內置的Rect類來檢測交叉點。當您的精靈命中框(矩形)和平臺矩形(另一個矩形)之間發生這種交集時,您可以將玩家的Y速度設置為0。

2. 在平臺外運行時開始下降。我通常有一個專門用于重力的變量,并且簡單地不斷將其應用于精靈以將其向下推。這樣,在您不再與平臺相交后,它將向下下降。

3.在跳躍過程中撞到平臺時停止向上移動:與交叉點前相同,只需在矩形碰撞后將Y速度設置為0,并讓玩家由于恒定的重力而摔倒。

4.撞墻時停止向側面移動,但能夠向相反的方向移動:同樣的事情,但這次將X速度設置為0。(如果你被困在墻上,你總是可以將X設置為大于0,以推動你回到游戲中)

還有一點需要注意,如果您只想在子畫面擊中平臺的某個邊緣時執行某些操作,則可以創建一個與子畫面側面對齊的矩形。例如,如果我想查看某些內容是否與我的精靈的左側相交,我可以使用 - 高度:相同高度 - 寬度:1 - x:x + 寬度 - y:相同y

有關矩形的文檔:https://www.pygame.org/docs/ref/rect.html


查看完整回答
反對 回復 2022-08-16
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

好吧,這里有代碼可以幫助檢測你什么時候可以從平臺跳轉:


self.rect.y += 2

platform_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)

self.rect.y -= 2


# If it is ok to jump, set our speed upwards

if len(platform_hit_list) > 0:

    velocity += acceleration

    position += velocity + 0.5 * acceleration

然后編寫代碼,用于檢測何時落入平臺:


if self.rect.y >= constants.SCREEN_HEIGHT and self.change_y >= 0:

    self.change_y = 0

    self.rect.y = constants.SCREEN_HEIGHT

最后是沖突代碼:


block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)

for block in block_hit_list:

    # If we are moving right,

    # set our right side to the left side of the item we hit

    if self.change_x > 0:

        self.rect.right = block.rect.left

    elif self.change_x < 0:

        # Otherwise if we are moving left, do the opposite.

        self.rect.left = block.rect.right


# Move up/down

velocity += acceleration

position += velocity + 0.5 * acceleration


# Check and see if we hit anything

block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)

for block in block_hit_list:


    # Reset our position based on the top/bottom of the object.

    if self.change_y > 0:

        self.rect.bottom = block.rect.top

    elif self.change_y < 0:

        self.rect.top = block.rect.bottom


    # Stop our vertical movement

    self.change_y = 0

希望這一切都能以某種方式幫助您為您提供所需的答案。請注意,這些塊指的是平臺,并將檢查給定列表中的每個平臺,我使用rects,因為它是檢查碰撞的最佳方法之一。至于change_x和change_y它只是存儲玩家移動多少的變量。


查看完整回答
反對 回復 2022-08-16
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號