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

在上一章中我们讲了如何创建窗口以及对界面进行重绘。可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大致讲一下原因:
由于我们的游戏是动态的,所以我们每次更改数据后(例如播放动画时切换图片),要让界面显示更改后的结果,一般的想法是:首先进行擦除原先要改的地方,然后再把变更的内容画出来。不过这个看似简单,如果遇到了重叠放置的对象就麻烦了,比如说A在B的下面,我们要更改A,那么把A擦掉后,B也会被擦掉,原因在于我们的画布是2D的,无法控制Z方向的擦除。这样一来,我们除了重画A还要再把B画上去。这是个比较复杂的问题,所以为了简化操作,我们直接使用全窗口的重绘,也就是定期的进行擦除,然后重绘。

在阅读本章正文前,请先阅读前两章:

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

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

显示对象

在前面的章节中,我们屡次提到了显示对象这个东西,那显示对象到底是什么呢?顾名思义,它是一个可视的物体,比如说游戏中的人物,地图等。例如listtuple等,这些对象是不可以显示的,它们只用于内部的数据存储,所以不是显示对象。同理,游戏中的资源加载器也不是显示对象。

程序开发可以看作一个归类的过程(所以class成为了一种主要的程序语句)。如果我们以对象的尺寸,或者颜色来分类显示对象,那么可能会出现这些类:BigTreeGreenTree……这样的分类存在明显的问题:分类不够细化,而且无法实现所有效果。于是flash给了我们很好的示例:通过负责显示的内容来分类。也就是说,图片显示为一类,文本显示为一类,矢量图形显示为一类……这样一来,细化层度不仅高,而且界面上的一切都可以用这几个类来组合完成。

今天就先来实现显示图片。由于上述的类都和显示对象有关,所以我们先创造一个所有显示对象的父类DisplayObject

class DisplayObject(object):
    def __init__(self):
        super(DisplayObject, self).__init__()

        self.parent = None
        self.x = 0
        self.y = 0
        self.alpha = 1
        self.rotation = 0
        self.scaleX = 1
        self.scaleY = 1
        self.visible = True

    @property
    def width(self):
        return self._getOriginalWidth() * abs(self.scaleX)

    @property
    def height(self):
        return self._getOriginalHeight() * abs(self.scaleY)

    def _show(self, c):
        if not self.visible:
            return

        c.save()

        c.translate(self.x, self.y)
        c.setOpacity(self.alpha * c.opacity())
        c.rotate(self.rotation)
        c.scale(self.scaleX, self.scaleY)

        self._loopDraw(c)

        c.restore()

    def _loopDraw(self, c):
        pass

    def _getOriginalWidth(self):
        return 0

    def _getOriginalHeight(self):
        return 0

    def remove(self):
        self.parent.removeChild(self)

这个类中的所有属性,就是所有显示对象的公共属性。比如说xy分别表示平面直角坐标系中横纵坐标(原点为屏幕最左上角);rotation表示对象绕其左上角旋转的角度。
前面提到了重复渲染,所以我们要提供一个方法来实现自我重绘。在重绘的途中,不同的显示对象显示的内容不同,比如说图片类就该显示图片,文本类显示文本。但是这些类又有统一之处,比如说都可以设置横纵坐标,旋转度数等。所以我们创建_show方法,其中对旋转,缩放,移动进行统一处理,然后调用_loopDraw来进行绘制不同的内容。
由于显示对象还有获取宽高的功能,所以我们再加入_getOriginalWidth_getOriginalHeight进行获取widthheight属性时计算宽高。
还有个remove方法用于将自身从显示列表中移除。

以上在代码安排进行了说明,接下来来解释代码。首先追忆一下上一章的代码࿱

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值