16 飞机大战:思路整理、重要代码

思路整理

流程:

1.根据关系图搭建框架

2.创建窗口

3.背景

  • 1 背景初始化:位置、图像
  • 2 背景精灵及精灵组组的初始化
  • 3 背景精灵update:背景循环
  • 5 背景精灵组update、draw

4.英雄

  • 1 英雄初始化:位置、图像、速度,子弹精灵组的初始化
  • 2 英雄精灵及精灵组组的初始化
  • 3 英雄精灵update:英雄的移动
  • 4 移动键盘对应的事件监测
  • 5 英雄精灵组update、draw
  • 6 写完子弹精灵后再写fire方法

5.敌机

  • 1 敌机初始化:位置、图像、速度
  • 2 敌机精灵组的初始化
  • 3 敌机精灵update:英雄的移动
  • 4 敌机事件监测:随着时间(设置定时器调用敌机事件)创建精灵并添加到精灵组
  • 5 敌机精灵组update、draw

6.子弹

  • 1 自定义子弹事件
  • 2 设置定时器:触发子弹事件
  • 3 监听捕获子弹事件:调用fire方法
  • 4 精灵组update dreaw

7.检测碰撞

 

重要代码

0.重写方法万万检查记得要不要继承父类方法

def __init__(self):
    super().__init__()

  

1.创建游戏时钟:用来设置游戏刷新率

# 新建游戏时钟对象
self.clock = pygame.time.Clock()
... ...
# 设置游戏刷新率
self.clock.tick(60) #60帧/s

  

2.精灵组

# 创建xx精灵
self.xx = Xx() #其中Xx是Xx类
# 创建xx精灵组
self.xx_group = pygame.sprite.Group(xx) #括号中表示添加xx精灵进组
# 精灵组自行添加精灵
self.xx_group.add(xxx)

  

3.加载精灵的图片及新建精灵的矩形框

# 初始化精灵图片
self.image = pygame.image.load(image_name) #image_name为图片的路径字符串 self.image属性不能改成其它名字!!!
# 初始化精灵矩形框
self.rect = self.image.get_rect()

  

4. 创建游戏窗口

# 游戏窗口矩形框常量
SCREEN.RECT = pygame.Rect(x,y,width.height)
# 创建游戏窗口对象
self.screen = pygame.display.set_mode(SCREEN.RECT.size) #或者直接写分辨率元组也行

  

5.刷新游戏显示

# 游戏循环中最重要也是最后一步:刷新游戏屏幕显示
pygame.display.update()

  

6.退出游戏指令

# 当监听器监听到退出游戏的事件,执行退出游戏指令
exit()

  

7.背景循环滚动

#bg1,bg2两张图,在Backgroud类中的init设置参数is_sec=false
self.bg2 = Background(True)
... ...
if is_sec:
    self.rect.bottom = 0
#在Background的upgdate方法中
if self.rect.y>屏幕最大y值
    self.rect.bottom = 0

  

 8.事件列表及自定义事件常量

#获取事件列表并遍历:用以检测事件
for event in pygame.event.get():
    if event.type == pygame.xxx #xxx表示事件类型
...
# 自定义事件常量(需要使用定时器触发)
ABCD = pygame.USEREVENT # 如果需要定义更多事件常量,后续的使用USEREVENT+1

  

9.键盘监听事件

# 方法一:有弊端,长按不能连续监测
if event.type == pygame.KEYDOWN and event.key==pygame.xxx: #xxx为键名,如K_LEFT

# 方法二:推荐
self.key_pressed = pygame.key.get_pressed() # 此方法返回一个包含所有键盘的元组,元组中0表示对应的键盘没有被按下,1表示对应的键盘被按下
if self.key_pressed = 1:

  

10.实现斜着飞:超级困惑

#再使用9中的方法二进行方向控制时,千万按照:竖直方向一个else归零,水平方向上有且仅有一个else归零的代码,不然飞不起来。我也想不通为什么会这样!
# 左
            if self.key_pressed[pygame.K_LEFT] == 1:
                self.hero1.speedx = -4
            # else水平方向归零
            else:
                self.hero1.speedx = 0
            # 右
            if self.key_pressed[pygame.K_RIGHT] == 1:
                self.hero1.speedx = 4

            # 上
            if self.key_pressed[pygame.K_UP] == 1:
                self.hero1.speedy = -4
            # else竖直方向归零
            else:
                self.hero1.speedy = 0
            # 下
            if self.key_pressed[pygame.K_DOWN] == 1:
                self.hero1.speedy = 4

  

11.*设置定时器:使用定时器触发自定义事件

#定时器:用来触发自定义事件
pygame.time.set_timer(自定义事件,触发间隔毫秒)

  

12. 销毁敌机/子弹

# 超出屏幕的敌机/子弹调用kill方法销毁自身
self.kill()

  

13.精灵碰撞方法

#精灵组之间的碰撞方法
pygame.sprite.groupcollide(group1,group2,dokill1,dokill2,collided = None-->Sprite_dict
#精灵与精灵组的碰撞方法
pygame.sprite.spritecollide(sprite,group,dokill,collided=None)->Sprite_list
#当dokill为True时,精灵与精灵组发生碰撞,死掉的是精灵组的成员。当False,谁都不会死。要想碰撞后精灵死掉,要用一个变量接收这个方法的返回值,然后对这个变量进行判断达到让英雄死掉的效果。

  

14.需要统计的事件类型

  • pygame.QUIT 退出事件
  • pygame.KEYDOWN 按下任意键盘

15.pygame官网API

  • https://www.pygame.org/docs/

成品展示

 

posted @ 2019-10-26 22:56  Scorpicat  阅读(455)  评论(0编辑  收藏  举报