其实作为一个2D游戏引擎,可以不必使用相机概念,但ppb引入的相机确实把一些相关功能整合在了一个直观的概念下,有一定的价值。

目前游戏的操作都是基于鼠标,但是键盘事件也是互动操作中必不可少的一环,让我们看看键盘事件是怎样处理的。

补充这两个内容容,对ppb的基本结构3个核心概念做一个总结。

python 引擎engine是什么_键盘事件

相机(camera

相机有三个直接的用处

  1. 屏幕的放大和缩小
  2. 屏幕的移动
  3. 精灵可见性的检测

放大与缩小

只需设置一个参数(scene.main_camera.width)即可调整屏幕的比例:


event.scene.main_camera.width=20

 


我们把这一操作,放在键盘事件中,当按方向键↑的时候,放大屏幕,按↓的时候,缩小屏幕。

屏幕移动

相机本身也有position属性,移动屏幕,在ppb中转换为相机的移动,直接改变相机的position即可。对于横屏拖动的游戏很适合,但本课程的案例由于始终在一个固定场景中,所以无法演示这一次功能。

精灵可见性

单击一次鼠标就发出一枚导弹,只有个别导弹由于击中靶子而销毁。大部分导弹会无止境地飞翔。感觉是对系统资源的一种浪费。我们增加一个设定,如果导弹飞出了屏幕(看不到了)即让它自行删除。

判断精灵的可见性,我们把这一代码加到导弹的刷新事件中,使用相机的sprite_in_view函数来判断:


class Projectile(ppb.Sprite):

    image = ppb.Image("resources/Projectile.png")

    speed = 6

    layer= 2



    def on_update(self, update_event, signal):

       self.rotation= 90- self.direction.angle(ppb.Vector(1,0))

       self.position += self.direction * self.speed * update_event.time_delta

       if not update_event.scene.main_camera.sprite_in_view(self):

            signal(ppb.events.PlaySound(ppb.Sound('resources/hit_glass.mp3')))

            update_event.scene.remove(self)

 


当导弹发现已经飞出屏幕可见范围后,发出一个轻柔的声音以通知用户,同时删除掉自己。

python 引擎engine是什么_python_02

键盘事件

我们在键盘事件里处理屏幕缩放和游戏初始化两个环节。


def on_key_pressed(self, key_event: KeyPressed, signal):

       global score

       if key_event.key == ppb.keycodes.Up:

           key_event.scene.main_camera.width=20

       elif key_event.key == ppb.keycodes.Down:

           key_event.scene.main_camera.width=25

       elif key_event.key == ppb.keycodes.Enter:

           if score==100:

              score= 0

              for x in range(-4, 5, 2):

                 key_event.scene.add(Target(position=ppb.Vector(x, 3)))

              signal(ChangeScore(0))

 


我们把键盘事件(on_key_pressed)写在Blob类的事件中,由于这是控制全局的事件,其实写在任何一个稳定存在的对象类中都是可以的。

key_event.key代表按下键的键值,我们无须记忆具体的数字,使用ppb.keycodes中对应键的名字即可。这里的逻辑是:

  • 方向键↑,放大:相机的width减小
  • 方向键↓,缩小:相机的width增大
  • 回车键,系统重置:当所有的靶子都打完后(成绩是100分),重新建立所有的靶子精灵。并发出事件,将成绩设置为0,这一机制是上节课讨论的内容。

引擎总结

经过这六次课程的介绍,我们现在可以对ppb的架构做一个总结。

python 引擎engine是什么_python_03

ppb的三大核心概念:精灵、场景、事件。

  • 核心概念——精灵
  • 通过类定义一个精灵
  • 精灵的名字可以自动匹配同目录下的同名图片
  • 精灵可以通过设置多图显示动画效果
  • 精灵可以把图片设置成文字
  • 通过精灵的属性来改变它的位置、大小、旋转
  • 通过类函数来响应事件
  • 精灵加入场景后可见,删除后消失
  • 核心概念——场景
  • 场景在setup函数中初始化
  • 可以方便地按类型枚举场景中所有的精灵
  • 场景的坐标系统由相机控制
  • 场景的缩放移动等功能用相机的形式来体现
  • 核心概念——事件
  • 事件包括系统内置事件与自定义事件
  • 事件携带场景信息
  • 内置事件中比较常用的有
  • 鼠标事件
  • 刷新事件
  • 键盘事件
  • 自定义事件本身就是一个类
  • 类是属性用于在触发事件时传递参数给响应它的精灵
  • 事件的触发通过signal
  • 播放音效也通过signal

作为一个游戏引擎,ppb的使用相当简洁清晰,适合初学者,我们希望它能持续发展完整。