簡體   English   中英

碰撞檢測不起作用-PyGame

[英]Collision Detection Not Working - PyGame

我在一個游戲中工作,在這個游戲中,有一個物體從游戲屏幕的頂部掉落,而在屏幕底部的玩家必須擊落該物體。 當玩家撞擊下落的物體時,玩家的寬度和高度需要增加。 當我測試代碼時,當玩家從側面擊落物體時,碰撞起作用,但是當玩家在中間擊中墜物時,碰撞不起作用。 有人能幫我嗎?

蟒蛇

# IMPORTS
import pygame, random

# GLOBALS
global screen, displayW, displayH
global clock, FPS
global end, food, player

# SETGLOBALVALUES
def setGlobalValues():
    global screen, displayW, displayH
    global clock, FPS
    global end, food, player

    displayW = 800
    displayH = 600
    screen = pygame.display.set_mode((displayW, displayH))

    clock = pygame.time.Clock()
    FPS = 60

    end = False
    food = Food()
    player = Player()

# MAIN
def main():
    pygame.init()

    setGlobalValues()
    setup()
    gameLoop()
    quitGame()

# GAMELOOP
def gameLoop():
    global end, player

    while not end:
        for event in pygame.event.get():
            # ONCLICK QUIT
            if event.type == pygame.QUIT:
                end = True;

            # KEYDOWN
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player.velX -= 10
                if event.key == pygame.K_RIGHT:
                    player.velX += 10

            # KEYUP
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    player.velX = 0
                if event.key == pygame.K_RIGHT:
                    player.velX = 0

        draw()
        animate()
        collision()
        setFPS()


# DRAW
def draw():
    global screen, food, player

    # fill background
    screen.fill((255, 255, 255))

    player.draw()
    food.draw()

    # update
    pygame.display.update()

# ANIMATE
def animate():
    global food, player

    food.animate()
    player.animate()

# COLLISION
def collision():
    global player, food;

    player.collision()
    food.collision();

# SETFPS
def setFPS():
    global clock, FPS

    clock.tick(FPS);

# CLASSES
class Food():
    def __init__(self, img="", x=0, h=0, w=0, velY=0, color=()):
        global displayW

        self.img = pygame.image.load("assets/img/rsz_burger.png")
        self.w = 30
        self.h = 30
        self.x = random.randrange(0, displayW - self.w)
        self.y = -100
        self.velY = 3
        self.color = (255, 0, 0)

    def draw(self):
        global screen

        screen.blit(self.img, (self.x, self.y))

    def animate(self):
        self.y += self.velY

        if self.y >= displayW:
            self.reset()

    def collision(self):
        global displayW, displayH

        # collision with player
        if self.y >= player.y and self.y <= player.y + player.h and self.x >= player.x and self.x <= player.x + player.w:
            player.w += player.increase
            player.h += player.increase
            player.y - player.increase

            print(player.w)
            self.reset()

    def reset(self):
        self.y = -100
        self.x = random.randrange(0, displayW - self.w)
        self.velY += 1
        screen.blit(self.img, (self.x, self.y))

class Player():
    def __init__(self, x=0, y=0, velX=0, velY=0, w=0, h=0, increase=0, color=()):
        global displayW, displayH

        self.w = 20
        self.h = 20
        self.x = displayW / 2 - self.w / 2
        self.y = displayH - 100
        self.velX = 0
        self.velY = 0
        self.increase = 2
        self.color = (0, 0, 0)

    def draw(self):
        global screen

        pygame.draw.ellipse(screen, self.color, (self.x, self.y, self.w, self.h))

    def animate(self):
        self.x += self.velX
        self.y += self.velY

    def collision(self):
        global displayW

        # collision to walls
        if self.x <= 0:
            self.velX = 0
        elif self.x  + self.h >= displayW:
            self.velX = 0


# SETUP
def setup():
    pygame.display.set_caption("Food Catcher")

# QUIT GAME
def quitGame():
    pygame.quit()
    quit()

# CALL MAIN
if __name__ == "__main__":
    main()

問題是必須減去播放器的寬度

之前:

if self.y >= player.y and self.y <= player.y + player.h and self.x >= player.x and self.x <= player.x + player.w:
            player.w += player.increase
            player.h += player.increase
            player.y - player.increase

后:

if self.y >= player.y - player.h and self.y <= player.y + player.h and self.x >= player.x - player.w and self.x <= player.x + player.w:
            player.w += player.increase
            player.h += player.increase
            player.y - player.increase

我忘記了對象x和y從左上方開始。

暫無
暫無

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

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