当前位置: 首页 > 面试题库 >

pygame-如何使Hitbox配合敌人的运动?

顾乐家
2023-03-14
问题内容

我正在使用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()

您知道解决办法吗?有没有比我现在拥有的方法更好的选择了?


问题答案:

我建议使用pygame.Rect对象,或者使用.collidepoint()colliderect()enemy和之间找到冲突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.H的性质playerenemy你应该使用pygame.Rect对象。

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

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


 类似资料:
  • 我试图用pyplay制作一个游戏,我几乎完成了,但我想让被画在墙上的盒子不闪烁,这些红色的盒子在整个游戏中闪烁,我不想让它们闪烁,最后,我在一个if条件下调用player碰撞函数,在这里每当我制作新的碰撞器时,我每次都要在if条件下添加函数,我想要的是碰撞器对象自动调用这个函数,而不需要我在if语句中为碰撞器的每个实例调用它对象。请指导我如何这样做。

  • 没多久,绝影干脆在学校外面租了房子自己搬了出去。 超薄早在上上学期就在外面租了房子,本来超薄话不多,看起来又热爱学习,大家都以为他是个老实人,根本没想到他居然是寝室第一个谈恋爱的,更没想到他居然会租房子同居。上学期王江也出去租了房子,他有足够的理由:要搞音乐,搞乐队,还要搞平面设计,比如搞音乐的搞设计的标志是什么?当然是有一家属于自己的工作室。――所以租间房子作工作室是很让人信服的。 绝影也想出去

  • 我试图创建一个游戏,敌人将随机产卵,并向屏幕上的一个点移动。我的问题是程序等待它们产卵,然后它们开始移动它们。我希望它们在产卵时开始移动,并在每个产卵之间有一个短暂的Rest。 下面是让它们移动的两个主要方法: Spek是一个简单的类,它扩展了ImageView,setRandomRegion()在屏幕边界上选择一个随机的x,y坐标。为了简单起见,我在while循环中有一个计数器,但我希望最终将其

  • 我让敌人随机移动并看着玩家,现在我想让敌人射击玩家,我不知道为什么,但射击完全随机,正如你在下面的gif中看到的(你按左ctrl射击)。 无论如何,这是玩家类: 这是我的敌人类: 这是我的子弹课: 如果你想测试代码,我已经删除了不必要的东西:< br > https://pastebin.com/HT93hUzt 您可以在此处下载替换图像来测试代码(记得更改图像加载字符串!): https://w

  • 当玩家或敌人被击中时,我希望他们的精灵变成红色。从本质上讲,我想要在精灵上显示透明的红色效果。皮游戏是否提供了一种方法来做到这一点?(我使用多个图像,因为角色是动画的,所以创建一个红色的精灵,只是闪烁而不是正常的子画面是行不通的)

  • 现在,我们已经创建好所有的主要图像,并且已经准备就绪,随着我们使用JavaScript 和 HTML5画布把虚拟世界变成现实,该是好玩的部分了(至少我是这么认为)。我们首先要做的就是创建Actor类,该类包含英雄和坏人都需要的属性和方法。换句话说,英雄和坏人都将是Actor类的实例。Actor类将负责使用moveRight() 和 moveLeft()方法指挥角色,并使用精灵表通过动画把角色渲染到