zoukankan      html  css  js  c++  java
  • 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/

    成品展示

  • 相关阅读:
    嵌入式C语言编程小技巧
    冒号:在linux bash中的各种用法
    巧用ls命令
    嵌入式C精华提炼1
    不知道这些,别说你是嵌入式工程师!
    这些ARM基础知识你还不知道吗
    代码示例_C_冒泡
    代码示例_文件IO_lseek
    代码示例_文件IO_read / write
    代码示例_标准IO_fseek
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/11746162.html
Copyright © 2011-2022 走看看