Pygame - 如何使 hitbox 与敌人的移动一起工作?

2024-05-07

我正在用 Pygame 制作一个 Python 游戏,目前正在研究 hitbox。程序应该暂停(设置play=False)每当玩家与敌人碰撞时。

只有当我注释掉所有敌人的移动(第 56-64 行)时它才“有效”,但这显然不是最好的选择。我读过有关 Pygame 有自己的碰撞箱碰撞系统的信息,但无法弄清楚。

游戏代码:

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()

你知道解决这个问题的方法吗?还有比我现在的做法更好的选择吗?


我建议使用pygame.Rect https://www.pygame.org/docs/ref/rect.html#pygame.Rect.collidepoint对象和任一.collidepoint() https://www.pygame.org/docs/ref/rect.html#pygame.Rect.collidepoint or colliderect() https://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect找到之间的碰撞enemy and player.

例如检查是否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

请注意,而不是.X, .Y, .W and .H的属性player and enemy你应该使用pygame.Rect object.

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

if enemy_rect.center == player_rect.center:
    Play=False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pygame - 如何使 hitbox 与敌人的移动一起工作? 的相关文章

随机推荐