簡體   English   中英

pygame中的碰撞檢測問題

[英]Collision Detection Issue in pygame

我有一款游戲,用戶可以使用箭頭鍵移動玩家(“ mrhinckleberg”)。 還有兩個“敵人”會自動上下反彈。

現在如何檢測玩家與敵人之間的碰撞?

這是我到目前為止的代碼:

import pygame
import time
pygame.init()
window = pygame.display.set_mode((800,800))
pygame.display.set_caption("Yues")
theboard = pygame.image.load('theboard.png')
enemy = pygame.image.load('mrenemy.png')
mrhinckleberg = pygame.image.load('MrHinckleBerg.png')
mrhincklebergdead = pygame.image.load('MrHinckleBergdead.png')
deathscreen = pygame.image.load('deathscreen.png')
black = (0,0,0)
clock1 = pygame.time.Clock()
def quitt():
    pygame.quit()
    quit()
playerx = 750
playery = 450
enemydirection = 'down'
enemyx = 500
enemyy = 50
enemyspeed = 100
enemydirection2 = 'up'
enemyx2 = 350
enemyy2 = 750
enemyspeed2 = 50
enemydirection3 = 'down'
enemyx3 = 200
enemyy3 = 50
enemyspeed3 = 150


while True:
    window.blit(theboard, (0,0))
    if enemydirection == 'down':
        enemyy += enemyspeed
        if enemyy >= 790:
            enemydirection = 'up'
    elif enemydirection == 'up':
        enemyy -= enemyspeed
        if enemyy <= 10:
            enemydirection = 'down'


    if enemydirection2 == 'up':
        enemyy2 -= enemyspeed2
        if enemyy2 <= 10:
            enemydirection2 = 'down'
    elif enemydirection2 == 'down':
        enemyy2 += enemyspeed2
        if enemyy2 >= 790:
            enemydirection2 = 'up'

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quitt()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                playerx += 12
            elif event.key == pygame.K_LEFT:
                playerx -= 12
            elif event.key == pygame.K_UP:
                playery -= 12
            elif event.key == pygame.K_DOWN:
                playery += 12
    if playerx == enemyx and playery == enemyy:
           print("hai")
    window.blit(theboard, (0,0))
    window.blit(mrhinckleberg, (playerx,playery))
    window.blit(enemy, (enemyx,enemyy))
    window.blit(enemy, (enemyx2,enemyy2))
    window.blit(enemy, (enemyx3,enemyy3))
    pygame.display.update()

在我的觀點中,問題是您檢查例如變量playerx 是否等於 enemyx ,但這永遠不會成立,因為您僅以特定的間隔(增加或減去12)更改了enemyx變量。

為避免這種情況,您可以檢查playerx / playeryenemyx / enemyy是否在**一定范圍內**:

if (playerx <= enemyx <= playerx + playerWidth) and \
   (playery <= enemyy <= playery + playerHeight):
       print("hai")

請注意,在Python中,比較可以被鏈接。 這意味着5 < x <= 10等於5 < x and x <= 10 有關更多信息,請參見內置類型->比較


更新的代碼:

import pygame
import time
pygame.init()

window = pygame.display.set_mode((800,800))
pygame.display.set_caption("Yues")

theboard = pygame.image.load('theboard.png')

enemy = pygame.image.load('mrenemy.png')

mrhinckleberg = pygame.image.load('MrHinckleBerg.png')
mrhincklebergdead = pygame.image.load('MrHinckleBergdead.png')

deathscreen = pygame.image.load('deathscreen.png')

playerWidth = mrhinckleberg.get_rect().width
playerHeight = mrhinckleberg.get_rect().height

black = (0,0,0)

clock1 = pygame.time.Clock()
def quitt():
    pygame.quit()
    quit()

playerx = 750
playery = 450

enemydirection = 'down'
enemyx = 500
enemyy = 50
enemyspeed = 3

enemydirection2 = 'up'
enemyx2 = 350
enemyy2 = 750
enemyspeed2 = 2

enemydirection3 = 'down'
enemyx3 = 200
enemyy3 = 50
enemyspeed3 = 1


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quitt()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                playerx += 12
            elif event.key == pygame.K_LEFT:
                playerx -= 12
            elif event.key == pygame.K_UP:
                playery -= 12
            elif event.key == pygame.K_DOWN:
                playery += 12

    if enemydirection == 'down':
        enemyy += enemyspeed
        if enemyy >= 790:
            enemydirection = 'up'
    elif enemydirection == 'up':
        enemyy -= enemyspeed
        if enemyy <= 10:
            enemydirection = 'down'

    if enemydirection2 == 'up':
        enemyy2 -= enemyspeed2
        if enemyy2 <= 10:
            enemydirection2 = 'down'
    elif enemydirection2 == 'down':
        enemyy2 += enemyspeed2
        if enemyy2 >= 790:
            enemydirection2 = 'up'

    if (playerx <= enemyx <= playerx + playerWidth) and (playery <= enemyy <= playery + playerHeight):
       print("hai")

    window.blit(theboard, (0,0))

    window.blit(mrhinckleberg, (playerx,playery))

    window.blit(enemy, (enemyx,enemyy))
    window.blit(enemy, (enemyx2,enemyy2))
    window.blit(enemy, (enemyx3,enemyy3))

    pygame.display.update()

我希望這有幫助 :)

暫無
暫無

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

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