Python游戏引擎开发(五):Sprite精灵类和鼠标事件

本文介绍了Python游戏引擎开发中的Sprite精灵类的实现,以及如何处理鼠标事件。Sprite类用于统一管理一系列显示对象,简化地图元素的移动操作。文章详细讲解了Sprite的显示列表和鼠标事件的传递过程,包括鼠标事件的回调函数和坐标计算。通过示例代码展示了如何添加和处理鼠标事件,以及如何为不同类型的显示对象实现点击检测。文章最后预告了接下来将实现动画类。
摘要由CSDN通过智能技术生成

本次来实现Sprite类和鼠标事件。
说起这个Sprite啊,涉及过2D游戏研究领域的看官应该都听说过它。它中文原意是“精灵”,不过在不同人的眼中,它所表示的意义不同。比如说在cocos2d中,它可以是一张图片。不过在flash中,Sprite是一个类似于“层”的家伙。当然你把它定义为层并不是很准确,实际上它是一个含显示列表的显示对象。什么意思呢?各位看官如果阅读了前面的章节,那对显示列表并不陌生。它说白了就是一个包含其他显示对象的容器。
那也许你会想,为什么要有这个类呢?举个例子大家就明白了。在一款RPG游戏中(如:口袋妖怪),我们的地图上有树林、小河等一系列地图元件。玩过此类游戏的同学都知道,如果我们的人物走到了地图中央继续前进的话,地图会进行卷轴移动,显示出下部分地图。这个时候我们如果要把每个地图元件进行移动,操作起来会相当麻烦。因此flash为我们提供的Sprite就是为了统一处理一系列显示对象而生的。
经过上面的介绍,大家可能仍然无法理解这么抽象的一个类。那姑且把它视作一个层吧,我们可以通过SpriteaddChild来向这个层添加显示对象。添加进去的对象所进行的操作都是相对的,比如说移动,旋转。

以下是前面章节目录:

Python游戏引擎开发(一):序

Python游戏引擎开发(二):创建窗口以及重绘界面

Python游戏引擎开发(三):显示图片

Python游戏引擎开发(四):TextField文本类

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添加鼠标事件然后在进一步进行计算来判断是否触发到我们的事件。

鼠标事件大致传递过程如下:

Created with Raphaël 2.1.0 点击窗口 QWidget窗口部件
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值