我正在使用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
的性质player
和enemy
你应该使用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()方法指挥角色,并使用精灵表通过动画把角色渲染到