美文网首页
飞机大战(项目实战2)

飞机大战(项目实战2)

作者: 5482698 | 来源:发表于2018-03-18 19:03 被阅读0次

    今天详细的讲一下英雄的出场 和位置,我们先定义需求:

    1:游戏启动后,英雄出现在屏幕的中间位置,距离屏幕底部120像素

    2:英雄每隔0.5秒发射一个子弹,每次连发三枚子弹

    3:默认不会移动,需要左/右方向键,控制英雄在水平方向移动


    子弹需求:

    1:子弹从英雄的正上方沿直线向上方飞行

    2:子弹飞出屏幕后需要从精灵租中删除

    Hero-----英雄

    ~初始化方法

                ·指定英雄图片   ,  ·定义初始速度 =0(英雄静止不动)

    ·定义 bullets子弹精灵组保存子弹精灵

    `重写 update()方法

    `英雄需要水平移动

    并且需要保证不能移出屏幕

    增加bullets属性,记录所有子弹精灵

    增加fire方法,用于发射子弹

    Bullet —— 子弹

    初始化方法

    指定子弹图片

    初始速度 = -2—— 子弹需要向上方飞行

    重写update()方法

    判断是否飞出屏幕,如果是,从精灵组删除

    2:创建英雄

    2.1 准备英雄类

    在plane_sprites新建Hero类

    重写初始化方法,直接指定图片名称,并且将初始速度设置为0

    设置英雄的初始位置

    centerx = x + 0.5 * widthcentery = y + 0.5 * heightbottom = y + height

    class   Hero   (GameSprite):

    """英雄精灵"""

    def__init__(self):

    super().__init__("./images/me1.png",0)

    # 设置初始位置

    self.rect.centerx = SCREEN_RECT.centerx

    self.rect.bottom = SCREEN_RECT.bottom -120

    2.2 绘制英雄

    1:在__create_sprites,添加英雄精灵和英雄精灵组

    后续要针对英雄做碰撞检测以及发射子弹

    所以英雄需要单独定义成属性

    2:在__update_sprites,让英雄精灵组调用update和draw方法

    代码实现

    修改__create_sprites方法如下:

    # 英雄组

    self.hero = Hero()

    self.hero_group = pygame.sprite.Group(self.hero)

    修改__update_sprites方法如下:

    self.hero_group.update()

    self.hero_group.draw(self.screen)

    03. 移动英雄位置

    在pygame中针对键盘按键的捕获,有两种方式

    第一种方式判断event.type == pygame.KEYDOWN

    第二种方式

    1:首先使用pygame.key.get_pressed()返回所有按键元组

    2:通过键盘常量,判断元组中某一个键是否被按下—— 如果被按下,对应数值为1

    提问这两种方式之间有什么区别呢?

    第一种方式

    elif   event.type == pygame.KEYDOWNandevent.key == pygame.K_RIGHT:

    print("向右移动...")

    第二种方式

    # 返回所有按键的元组,如果某个键被按下,对应的值会是1

    keys_pressed = pygame.key.get_pressed()

    # 判断是否按下了方向键

    if  keys_pressed [pygame.K_RIGHT]:

    print("向右移动...")

    结论

    第一种方式event.type用户必须要抬起按键才算一次按键事件,操作灵活性会大打折扣

    第二种方式用户可以按住方向键不放,就能够实现持续向某一个方向移动了,操作灵活性更好

    3.1 移动英雄位置

    演练步骤

    1.在Hero类中重写update方法

    用速度speed和英雄rect.x进行叠加

    不需要调用父类方法—— 父类方法只是实现了单纯的垂直运动

    2.在__event_handler方法中根据左右方向键设置英雄的速度

    向右=>speed = 2

    向左=>speed = -2

    其他=>speed = 0

    代码演练

    在Hero类,重写update()方法,根据速度水平移动英雄的飞机

    def  update (self):

    # 飞机水平移动

    self.rect.x += self.speed

    调整键盘按键代码

    # 获取用户按键

    keys_pressed = pygame.key.get_pressed()

    if  keys_pressed[pygame.K_RIGHT]:

    self.hero.speed =2

    elif  keys_pressed[pygame.K_LEFT]:

    self.hero.speed =-2

    else:

    self.hero.speed =0

    控制英雄运动边界

    在Hero类的update()方法判断英雄是否超出屏幕边界

    right = x + width利用rigth属性可以非常容易的针对右侧设置精灵位置


    def   update(self):

    # 飞机水平移动

    self.rect.x += self.speed

    # 判断屏幕边界

    if  self.rect.left <0:

    self.rect.left =0

    if   self.rect.right > SCREEN_RECT.right:

    self.rect.right = SCREEN_RECT.right


    注意:我们在pygame中使用的图片格式为.png格式,如果想要添加自己的图片要注意格式

    相关文章

      网友评论

          本文标题:飞机大战(项目实战2)

          本文链接:https://www.haomeiwen.com/subject/zyfyqftx.html