我一直在注意所有游戏中发生的一件奇怪的事情:如果我移动,则玩家停止射击,这是因为当我移动时玩家已经在射击,还是当我尝试射击时玩家已经在移动,如果我移动了,则射击停止。这是我在最近制作的一款游戏中用来移动玩家的代码:
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_d]:
self.x += self.speed
if keys[pygame.K_a]:
self.x -= self.speed
为了拍摄,我这样做:
def handle_events():
if event.type == pygame.MOUSEBUTTONDOWN:
game.bullets.append(Bullet())
任何帮助,将不胜感激。还有一个旁注:如果有人知道一般代码中可能导致这种情况的事情(因为它在我的所有游戏中都发生过),请用plaeses注释,以便我可以使用相关事件代码来更新问题,因为现在我不知道可能会导致什么这个。
编辑:我最近注意到的一点是,当玩家被重力(技术上仍在移动)下拉时,它仍然可以射击。所以我想我在按下按键时会发生某些事情(任何按键,而不仅仅是我代码中包含的音调),这会使玩家无法射击。
我的handle_evnets()
功能实际上只是处理关闭游戏和鼠标按键的操作。反正这是代码:
def handle_events():
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
game.bullets.append(Bullet())
继承人的子弹类,game.bullets
如果MOUSEBUTTONDOWN
class Bullet:
def __init__(self):
self.pos = [(player.x - 10 - scroll[0]), (player.y + 15 - scroll[1])]
self.height = 3
self.width = 20
self.bullet = pygame.Surface((self.width, self.height)).convert_alpha()
self.bullet.fill((255, 255, 255))
self.dir = [(mouse.x - (player.x - 10 - scroll[0])), (mouse.y - (player.y + 15 - scroll[1]))]
self.distance = math.hypot(self.dir[0], self.dir[1])
self.dir = [(self.dir[0]/ self.distance), (self.dir[1]/ self.distance)]
angle = math.degrees(math.atan2((-self.dir[1]), self.dir[0]))
self.bullet = pygame.transform.rotate(self.bullet, (angle))
self.speed = 10
这是游戏类,子弹添加到该类即shoot_bullet()
函数中后会发生什么。
class Game:
def __init__(self):
self.bullets = []
def shoot_bullet(self):
for bullet in self.bullets:
bullet.pos[0] += bullet.dir[0] * bullet.speed
bullet.pos[1] += bullet.dir[1] * bullet.speed
D.blit(bullet.bullet, (bullet.pos[0], bullet.pos[1]))
我认为,如果按下任意键,它的真正作用是“ pygame.MOUSEBUTTONDOWN”。
否。问题与变量有关events
:
def handle_events(): for event in events: #[...] if event.type == pygame.MOUSEBUTTONDOWN: game.bullets.append(Bullet())
上面的函数访问events
全局名称空间中的变量,但是该列表似乎根本不包含事件。
您可以在代码中的某个位置执行操作events = pygame.event.get()
。但这可能在函数或方法的范围内。这将导致events
在本地名称空间中生成新变量,并且events
不会更新全局变量。
您有2种解决方案。添加一个参数handle_events
并传递events
给handle_events
:
def handle_events(events):
for event in events:
#[...]
if event.type == pygame.MOUSEBUTTONDOWN:
game.bullets.append(Bullet())
或events
通过使用global
语句确保在获取事件时设置了全局名称空间中的变量。
在aver上,请在前面events = pygame.event.get()
添加global events
:
global events
events = pygame.event.get()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句