Python 太空入侵者-Pygame-随机射击

Python 太空入侵者-Pygame-随机射击,python,random,pygame,Python,Random,Pygame,我在Pygame中制作游戏空间入侵者,我想让敌人随机向玩家射击。此时,我只能让敌人按tab键向玩家射击。但它应该以随机间隔自动完成这项工作。我怎样才能在不按tab键的情况下工作? 谢谢 import pygame,sys 从pygame.locals导入* 随机输入 屏幕宽度=800 屏幕高度=600 FPS=60 pygame.init() pygame.mixer.init() screen=pygame.display.set_模式((屏幕宽度、屏幕高度)) pygame.display.

我在Pygame中制作游戏空间入侵者,我想让敌人随机向玩家射击。此时,我只能让敌人按tab键向玩家射击。但它应该以随机间隔自动完成这项工作。我怎样才能在不按tab键的情况下工作? 谢谢

import pygame,sys
从pygame.locals导入*
随机输入
屏幕宽度=800
屏幕高度=600
FPS=60
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
pygame.display.set_标题(“太空入侵者”)
clock=pygame.time.clock()
船宽=67
#颜色
黑色=(0,0,0)
蓝色=(0,0255)
绿色=(0128,0)
红色=(255,0,0)
白色=(255255)
黄色=(255255,0)
def app_quit():
pygame.quit()
系统退出(“系统退出”)
职业玩家(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“spaceship3.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.centerx=屏幕宽度/2
self.rect.bottom=屏幕高度-10
def更新(自我):
self.speedx=0
如果event.type==KEYDOWN和event.key==K_LEFT:
self.speedx=-2
elif event.type==KEYDOWN和event.key==K_RIGHT:
self.speedx=2
self.rect.x+=self.speedx
如果self.rect.right>屏幕宽度:
self.rect.right=屏幕宽度
如果self.rect.left<0:
self.rect.left=0
def shootPlayer(自我):
bulletPlayer=bulletPlayer(self.rect.centerx、self.rect.top)
所有精灵。添加(bulletPlayer)
bulletPlayer.add(bulletPlayer)
职业敌人(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“敌方.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.x=0
self.rect.y=random.randrange(0200)
self.speedx=random.randrange(1,2)
def更新(自我):
self.rect.x+=self.speedx
如果self.rect.right>屏幕宽度:
self.rect.x=0
self.rect.y=random.randrange(0250)
self.speedx=random.randrange(1,3)
#如果self.rect.x>screenWidth:#在屏幕关闭时终止
#self.kill()
def射击敌人(自身):
BulletForeign=BulletForeign(self.rect.centerx,self.rect.bottom)
所有精灵。添加(Bullet敌人)
bulletsEnemy.add(BulletForeign)
类BulletPlayer(pygame.sprite.sprite):
定义初始化(self,x,y):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“bullet.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.bottom=y
self.rect.centerx=x
self.speedy=-3
def更新(自我):
self.rect.y+=自加速
如果self.rect.bottom<0:
self.kill()
类(pygame.sprite.sprite):
定义初始化(self,x,y):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“bulletForeign.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.bottom=y
self.rect.centerx=x
self.speeded=2
def更新(自我):
self.rect.y+=自加速
如果self.rect.bottom>屏幕高度:
self.kill()
类墙(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“wall.png”).convert()
self.rect=self.image.get_rect()
self.rect.center=100300
allSprites=pygame.sprite.Group()
player=player()
敌人=pygame.sprite.Group()
bulletsPlayer=pygame.sprite.Group()
bulletsEnemy=pygame.sprite.Group()
墙=墙()
所有精灵。添加(玩家、敌人、bulletsPlayer、bulletsEnemy、墙)
对于范围(1)中的i:
e=敌人()
所有精灵。添加(e)
添加(e)
运行=真
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==QUIT或(event.type==KEYUP和event.key==K_ESCAPE):
运行=错误
app_quit()
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
player.shootPlayer()
如果event.key==pygame.K_选项卡:
random.choice(敌方.精灵()).shoot敌军()
allSprites.update()
hitplayer=pygame.sprite.spritecollide(玩家,bulletsEnemy,True)
如果击球员:
running=app_quit()
Hit敌军=pygame.sprite.groupcollide(敌军,bulletsPlayer,真,真)
如果击中敌人:
running=app_quit()
屏幕填充(黑色)
所有精灵。绘制(屏幕)
pygame.display.flip()
pygame.quit()

您需要一个随机定时器变量,可以按每帧的
dt
(增量时间)递减。当它低于零时,创建一个bullet实例,将其添加到组中并重置计时器。我在这里使用的函数给你一个浮点,但是如果你想要整数,你也可以使用
random.randrange
randint
。要获取增量时间(自上次滴答声以来的时间),只需指定
clock.tick(fps)
返回给变量的值

# The timer is the time in seconds until the enemy shoots.
timer = random.uniform(2, 6)  # Random float between 2 and 6.
dt = 0

running = True
while True:
    # Event handling omitted.

    # Decrease the timer by the delta time.
    timer -= dt
    if timer <= 0:  # Ready to fire.
        # Pick a random enemy to get the x and y coords.
        random_enemy = random.choice(enemy.sprites())
        enemy_x, enemy_y = random_enemy.rect.center
        # Create a bullet and add it to the sprite groups.
        bullet = BulletEnemy(enemy_x, enemy_y)
        allSprites.add(bullet)
        enemy.add(bullet)
        timer = random.uniform(2, 6)  # Reset the timer.

    # Collision detection and drawing omitted.

    # clock.tick returns the time that has passed since the last frame.
    dt = clock.tick(60) / 1000  # / 1000 to convert it to seconds.
#计时器是敌人射击前的秒数。
计时器=随机。均匀(2,6)#2和6之间的随机浮动。
dt=0
运行=真
尽管如此:
#忽略事件处理。
#将计时器减少增量时间。
定时器-=dt

如果计时器一种方法是创建一个自定义事件,并根据某些条件(如时间)触发它

您可以使用
pygame.event.event()
pygame.event.post()
手动触发事件,而不是使用Tab键。要按时设置此事件,您可以使用
pygame.time.set\u timer(myEvent,time)
。在这之后,您的主循环只需要
# The timer is the time in seconds until the enemy shoots.
timer = random.uniform(2, 6)  # Random float between 2 and 6.
dt = 0

running = True
while True:
    # Event handling omitted.

    # Decrease the timer by the delta time.
    timer -= dt
    if timer <= 0:  # Ready to fire.
        # Pick a random enemy to get the x and y coords.
        random_enemy = random.choice(enemy.sprites())
        enemy_x, enemy_y = random_enemy.rect.center
        # Create a bullet and add it to the sprite groups.
        bullet = BulletEnemy(enemy_x, enemy_y)
        allSprites.add(bullet)
        enemy.add(bullet)
        timer = random.uniform(2, 6)  # Reset the timer.

    # Collision detection and drawing omitted.

    # clock.tick returns the time that has passed since the last frame.
    dt = clock.tick(60) / 1000  # / 1000 to convert it to seconds.