本次来实现Sprite
类和鼠标事件。
说起这个Sprite
啊,涉及过2D游戏研究领域的看官应该都听说过它。它中文原意是“精灵”,不过在不同人的眼中,它所表示的意义不同。比如说在cocos2d中,它可以是一张图片。不过在flash中,Sprite
是一个类似于“层”的家伙。当然你把它定义为层并不是很准确,实际上它是一个含显示列表的显示对象。什么意思呢?各位看官如果阅读了前面的章节,那对显示列表并不陌生。它说白了就是一个包含其他显示对象的容器。
那也许你会想,为什么要有这个类呢?举个例子大家就明白了。在一款RPG游戏中(如:口袋妖怪),我们的地图上有树林、小河等一系列地图元件。玩过此类游戏的同学都知道,如果我们的人物走到了地图中央继续前进的话,地图会进行卷轴移动,显示出下部分地图。这个时候我们如果要把每个地图元件进行移动,操作起来会相当麻烦。因此flash为我们提供的Sprite
就是为了统一处理一系列显示对象而生的。
经过上面的介绍,大家可能仍然无法理解这么抽象的一个类。那姑且把它视作一个层吧,我们可以通过Sprite
的addChild
来向这个层添加显示对象。添加进去的对象所进行的操作都是相对的,比如说移动,旋转。
以下是前面章节目录:
Sprite的实现
以下是实现代码:
class Sprite(DisplayObject):
def __init__(self):
super(Sprite, self).__init__()
self.childList = []
self.mouseList = []
def addChild(self, child):
self.childList.append(child)
def removeChild(self, child):
self.childList.remove(child)
child.parent = None
def _loopDraw(self, c):
stage._showDisplayList(self.childList)
可以看到,这个类的实现代码很简单,就是添加了显示列表属性(childList)、鼠标事件列表(mouseList)和添加/删除对象的方法。实际上在flash中,这个类还有很多功能,比如说以后会提及的矢量绘图。看过第二章的同学应该会注意到stage._showDisplayList
这个方法,他负责遍历显示列表并显示遍历得到的对象(及子对象)。由于这个方法是在QPainter
变换(平移,旋转,拉伸)之后,QPainter.restore()
之前被调用的,所以再次调用到这个子对象显示方法时,显示方法中对QPainter
的变换就是相对于先前QPainter
变换而言的。因此,我们就实现了子对象相对父对象变换的效果。
鼠标事件
我们要来实现鼠标事件方面的功能了。首先需要了解的是,由于我们无法直接对我们写的显示对象添加事件,所以只能先对QWidget
添加鼠标事件然后在进一步进行计算来判断是否触发到我们的事件。
鼠标事件大致传递过程如下: