Python pygame中的连续对象创建?
好的,我对这个话题做了一些研究。我正在用Python的Pygame创建一个游戏,它是著名的“Raiden 2”的复制品。我的游戏循环与我所见过的非常相似。我要做的是让构造函数在按住空格键的同时创建一个bullet对象(使用我的bullet类)。但是,以下代码仅为每个按键创建一个项目符号。按住按钮不起任何作用,只会创建一个项目符号Python pygame中的连续对象创建?,python,python-2.7,pygame,Python,Python 2.7,Pygame,好的,我对这个话题做了一些研究。我正在用Python的Pygame创建一个游戏,它是著名的“Raiden 2”的复制品。我的游戏循环与我所见过的非常相似。我要做的是让构造函数在按住空格键的同时创建一个bullet对象(使用我的bullet类)。但是,以下代码仅为每个按键创建一个项目符号。按住按钮不起任何作用,只会创建一个项目符号 while game.play is True: for event in pygame.event.get(): if event.type
while game.play is True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
b = Bullet(x, y)
bullet_group.add(b)
bullet_group.draw(screen)
不知道从这里到哪里去。欢迎并感谢您的任何帮助。这应该能满足您的期望:
addBullets = False
while game.play is True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
addBullets = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_SPACE:
addBullets = False
if addBullets:
b = Bullet(x, y)
bullet_group.add(b)
bullet_group.draw(screen)
您将项目符号的创建从事件处理中移出,并在其中仅设置一个“标志”,如果释放键停止项目符号的创建,则该标志将被收回
而且。。。正如jsbueno
在评论中提到的,这也会起作用:
我认为另一个答案是缺乏一个重要的细节。你很可能不想每帧发射一颗子弹,所以你需要一个计时器。最简单的方法是计算帧数,但这样游戏就有帧速率限制(最好不要这样做)
帧速率独立变量是使用
pygame.Clock.tick
返回的时间(自上次调用以来经过的时间)并从计时器变量中减去它。如果计时器是,那么您希望在每次按键时创建几个项目符号?我认为您正在查找您只查看KEYDOWN
事件,因此每次按键只会获得一次事件。对于像这样的实时游戏,我喜欢使用,pygame.key.get_pressed()
@cmd嘿,它很管用!谢谢你帮我。我不知道KEYDOWN不适用于多对象创建…@Minighost不要忘记接受答案以完成问答过程。。。(答案左侧的“V”在单击表示答案已被接受时变为绿色)酷。另一个选项是使用pygame.key,get_pressed()[pygame.K_SPACE]
来了解函数调用时是否按下了给定的键(在本例中为空格)。哇,有这么多选项。。。我想我会坚持@jsbueno使用get_pressed()的方法。似乎与我的代码一致。非常感谢你们!
while game.play is True:
for event in pygame.event.get():
pass # do something with events
if pygame.key.get_pressed()[pygame.K_SPACE]:
b = Bullet(x, y)
bullet_group.add(b)
firing = False
bullet_timer = 0
while game.play:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game.play = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
firing = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_SPACE:
firing = False
if bullet_timer > 0:
bullet_timer -= 1
elif firing: # Timer is less than 0 and we're firing.
bullet = Bullet()
bullet_group.add(bullet)
bullet_timer = 10 # Reset timer to 10 frames.
clock = pygame.time.Clock()
firing = False
bullet_timer = 0
while game.play:
# `dt` is the passed time since the last tick in seconds.
dt = clock.tick(30) / 1000
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
firing = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_SPACE:
firing = False
if bullet_timer > 0:
bullet_timer -= dt
elif firing: # Timer is below 0 and we're firing.
bullet = Bullet()
bullet_group.add(bullet)
bullet_timer = .5 # Reset timer to a half second.