其实作为一个2D游戏引擎,可以不必使用相机概念,但ppb引入的相机确实把一些相关功能整合在了一个直观的概念下,有一定的价值。
目前游戏的操作都是基于鼠标,但是键盘事件也是互动操作中必不可少的一环,让我们看看键盘事件是怎样处理的。
补充这两个内容容,对ppb的基本结构3个核心概念做一个总结。
相机(camera)
相机有三个直接的用处
- 屏幕的放大和缩小
- 屏幕的移动
- 精灵可见性的检测
放大与缩小
只需设置一个参数(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)
当导弹发现已经飞出屏幕可见范围后,发出一个轻柔的声音以通知用户,同时删除掉自己。
键盘事件
我们在键盘事件里处理屏幕缩放和游戏初始化两个环节。
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的架构做一个总结。
ppb的三大核心概念:精灵、场景、事件。
- 核心概念——精灵
- 通过类定义一个精灵
- 精灵的名字可以自动匹配同目录下的同名图片
- 精灵可以通过设置多图显示动画效果
- 精灵可以把图片设置成文字
- 通过精灵的属性来改变它的位置、大小、旋转
- 通过类函数来响应事件
- 精灵加入场景后可见,删除后消失
- 核心概念——场景
- 场景在setup函数中初始化
- 可以方便地按类型枚举场景中所有的精灵
- 场景的坐标系统由相机控制
- 场景的缩放移动等功能用相机的形式来体现
- 核心概念——事件
- 事件包括系统内置事件与自定义事件
- 事件携带场景信息
- 内置事件中比较常用的有
- 鼠标事件
- 刷新事件
- 键盘事件
- 自定义事件本身就是一个类
- 类是属性用于在触发事件时传递参数给响应它的精灵
- 事件的触发通过signal
- 播放音效也通过signal
作为一个游戏引擎,ppb的使用相当简洁清晰,适合初学者,我们希望它能持续发展完整。