Pygame如何使hitbox与敌人的移动协同工作?

2024-04-26 02:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Pygame制作一个Python游戏,目前正在开发hitbox。当玩家与敌人相撞时,程序应该暂停(设置play=False)。你知道吗

它只“工程”当我评出所有的敌人运动(第56-64行),但这显然不是最好的选择。我读过Pygame有自己的hitbox碰撞系统,但没弄明白。你知道吗

游戏代码:

import pygame
import threading
from random import randint
from time import sleep

pygame.init()
window = pygame.display.set_mode((900, 900))
bg = pygame.image.load("BACKGROUND IMAGE HERE").convert()

class Entity:
    def __init__(self):
        self.W = 50
        self.H = 50
        self.X = 420
        self.Y = 400
        self.speed = 1/10
        self.hitbox = (self.X,self.Y,50,50) #Try out stuff

    def takeDamage(self):
        print("YOU'VE BEEN HIT!")

class Enemy(Entity): # inherit Entity
    def __init__(self):
        Entity.__init__(self) # get all traits of an entity

class Player(Entity): # inherit Entity
    def __init__(self):
        Entity.__init__(self) # get all traits of an entity
        self.X = 300 # overwrite specific traits
        self.Y = 300
        self.speed=1

Play=True
def Gameplay():
    global enemy_list, Entity,Play
    while True:
        window.blit(bg, [0, 0])
        keys = pygame.key.get_pressed()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        if Play:
            if keys[pygame.K_w] and player.Y >= 1:
                    player.Y-=player.speed
            if keys[pygame.K_s] and player.Y <= 900-player.H:
                    player.Y+=player.speed
            if keys[pygame.K_a] and player.X >= 1:
                    player.X-=player.speed
            if keys[pygame.K_d] and player.X <= 900-player.W:
                    player.X+=player.speed

        pygame.draw.rect(window, (93,124,249), (player.X, player.Y, player.W, player.H))
        if Play:
            for enemy in enemy_list:
                if enemy.X > player.X: 
                    enemy.X = enemy.X - enemy.speed
                else:
                    enemy.X = enemy.X + enemy.speed
                if enemy.Y > player.Y:
                    enemy.Y = enemy.Y - enemy.speed
                else:
                    enemy.Y = enemy.Y + enemy.speed

                pygame.draw.rect(window, (255, 50, 49), (enemy.X, enemy.Y, enemy.W, enemy.H))

                if enemy.Y <= player.Y and enemy.Y+enemy.W >= player.Y+player.W:
#PROBLEM HERE
                    Play=False

        pygame.display.update()

def EnemySpawn():
    global enemy_list,Play
    score= 0
    while True: # make enemies until Play == False
        if Play:
            score+=1
            print("Spawned an enemy! Score:", score-1)
            enemy_list.append(Enemy()) # make an instance of our class
            sleep(randint(1000, 5000)) #I know this is 1-5k Seconds

if __name__ == "__main__":
    player = Player() # notice the difference in capitalization!
    enemy_list = [] # to maintain records of all enemies made
    game_thread = threading.Thread(target=Gameplay)
    game_thread.start()
    enemy_spawner_thread = threading.Thread(target=EnemySpawn)
    enemy_spawner_thread.start()

你知道怎么解决这个问题吗?有什么比我现在怎么做更好的选择吗?你知道吗


Tags: andimportselfplayifinitdefkeys
1条回答
网友
1楼 · 发布于 2024-04-26 02:30:06

我建议使用^{}对象和^{}^{}来查找enemyplayer之间的冲突。你知道吗

例如,检查enemy是否与player的中心发生碰撞:

player_rect = pygame.Rect(player.X, player.Y, player.W, player.H)
enemy_rect  = pygame.Rect(enemy.X, enemy.Y, enemy.W, enemy.H)
if enemy_rect.collidepoint(player_rect.center):
    Play=False

注意,应该使用playerenemy对象,而不是.X.Y.W.H属性。你知道吗

如果你想验证,如果敌人正好在玩家身上,比较矩形的中心点就足够了:

if enemy_rect.center == player_rect.center:
    Play=False

相关问题 更多 >