目录
在前面我们已经了解过了关于制作pygame的使用和在里面游戏中的简单操作的内容了,今天我们主要讲的就是关于敌机的出现和如何去操控游戏中英雄飞机和敌机的出现
1.1.3每架敌机出现的水平位置不同(0, 480-敌机宽度)
1..2.1而我们常用pygame.time.set_timer()来定义定时器
1.2.2用set_timer去创建一个事件,在游戏循环中监听这个事件,然后做出响应(每隔一秒钟,创建敌机)
首先我们先明确一下需求,这是我们想要敌机达到的效果
每隔一段时间,去执行一些代码
- # 设置定时器,每隔1秒触发ID为USEREVENT + 1的事件
- pygame.time.set_timer(USEREVENT + 1, 1)
- # 设置定时器事件,每隔1000毫秒(1秒)触发一次
- ENEMY_CREATE_EVENT = pygame.USEREVENT + 1
- pygame.time.set_timer(ENEMY_CREATE_EVENT, 1000)
在pygame中,定时器事件是通过pygame.event.get()函数来监听的,就像监听其他任何事件一样。当定时器到达设定的时间间隔时,它会将一个自定义事件(在这个例子中是ENEMY_CREATE_EVENT)添加到事件队列中。然后,你可以在游戏的主循环中遍历这个事件队列,检查是否有定时器事件被触发,并相应地执行代码
- # 游戏主循环
- running = True
- while running:
- # 处理事件队列
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- # 检查定时器事件
- elif event.type == ENEMY_CREATE_EVENT:
- # 创建敌机并添加到列表中
- enemies.append(Enemy())
这里先讲到敌机的设计,接下来就关于英雄飞机,玩家的飞机了
先设计好对英雄飞机的操作要求:
- # 设置颜色
- WHITE = (255, 255, 255)
- RED = (255, 0, 0)
- GREEN = (0, 255, 0)
- BLUE = (0, 0, 255)
- def __init__(self): # 通过调用函数来实现
- print('游戏初始化')
- # 1要创建游戏窗口
- self.screen = pygame.display.set_mode((480, 700)
- # 事件监听
- def __event_handler(self):
- # 获取按键
- keypressed = pygame.key.get_pressed()
- if keypressed[pygame.K_RIGHT]: # 右键
- self.hero.speed = 2 # 将飞机的速度改为2
- elif keypressed[pygame.K_LEFT]: # 左键
- self.hero.speed = -2
- elif keypressed[pygame.K_UP]: # 上键
- self.hero.upanddown = -2
- elif keypressed[pygame.K_DOWN]: # 下键
- self.hero.upanddown = 2
- def update(self):
- self.rect.x+=self.speed
- self.rect.y+=self.upanddown
- #控制飞机不能离开屏幕
- if self.rect.x<0:
- self.rect.x=0
- elif self.rect.x>480-self.rect.width:
- self.rect.x=480-self.rect.width
-
- if self.rect.y<0:
- self.rect.y=0
- elif self.rect.y>700-self.rect.height:
- self.rect.y=700-self.rect.height
- #子弹类
- class Bullet(GameSprites):
- #调用父类方法,设置图片和初始速度
- def __init__(self):
- super().__init__('images/bullet1.png',-2)
-
- def update(self):
- #调用父类方法,让子弹沿垂直方向飞行
- super().update()
- #飞出屏幕就死掉
- if self.rect.y<0-self.rect.height:
- self.kill()#KILL仅仅是把他从精灵组中删除
- def __del__(self):#直接消除对象,还是内置函数
- print('子弹被销毁')
- # 碰撞检测
- def __check_collide(self):
- # 子弹与敌机碰撞
- ret1 = pygame.sprite.groupcollide(self.hero.bullet_group,
- self.enemy_group, True, True)
- if ret1:
- print(ret1)
- # 敌机和英雄碰撞
- ret2 = pygame.sprite.groupcollide(self.enemy_group,
- self.hero_group, True, True)
- if len(ret2):
- pygame.quit()
