如何防止pygame中的按钮垃圾邮件

时间:2013-12-10 11:43:23

标签: python time timer pygame spam

基本上,目前,在我的游戏中,用户可以根据自己的意愿进行多次射击......这会破坏游戏的目标(这使得它太容易了),因为它们可能只是垃圾弹。我有一个“商店”类型功能,使用户可以购买升级,因此垃圾邮件违背了商店的目的。

elif event.key == K_SPACE:
                    newBullet = {'rect': pygame.Rect(bulletX, bulletY, 10, 3), 'surface': bullet}
                    pistolSound.play()
                    bullets.append(newBullet)

这是代码,我可以添加什么来阻止按钮混合垃圾邮件。我对pygame时间函数不好,但我有一种可以使用的感觉。

此外,我希望我的僵尸能够始终如一地产生,而不是在它非常随机的时刻......

timer = clock.tick()
    if waveNumber <= 2:
                timer += 1
                if timer == 2:
                    newZombie = {'rect':pygame.Rect(zombieX, zombieY, 75, 75), 'surface': zombie}
                    zombieSound.play()
                    zombies.append(newZombie)
                    timer = 0 

我该怎么做呢?我想我的时间功能错了。

非常感谢,Will。

2 个答案:

答案 0 :(得分:1)

将项目符号的数量限制为一些较小的数字:

elif event.key == K_SPACE:
    if len(bullets) < 3:
        newBullet = {'rect': pygame.Rect(bulletX, bulletY, 10, 3), 'surface': bullet}
        pistolSound.play()
        bullets.append(newBullet)

答案 1 :(得分:0)

您应该将模拟和事件处理分解为短暂的“转弯”,并允许玩家每回合只拍一个子弹(甚至更少)。

最接近你的代码示例的是在处理适当类型的事件时设置“本回合按下的拍摄按钮”标记,然后在处理完所有事件后最多拍摄一次:

#each event
if event.key == K_SPACE:
    playerShooting=True 

...

#each turn
if playerShooting:
    newBullet = {'rect': pygame.Rect(bulletX, bulletY, 10, 3), 'surface': bullet}            
    pistolSound.play()
    bullets.append(newBullet)
playerShooting=False#clear to prepare for next turn

僵尸有类似的问题:你无法预测clock.tick()的值。相反,每回合最多产生一次僵尸(可能按计划进行,例如每转五圈)。时钟应该用于决定主循环是否应该进入游戏状态更新而不是等待进一步的输入,并决定何时渲染帧。

供参考,使用bad examplegood but incomplete example PyGame主循环。