我研发的Python游戏引擎Pylash已经更新到1.4了。现在我们就来使用它完成一个极其简单的小游戏:接水果。以下是游戏截图:
游戏操作说明:点击屏幕左右两边或者使用键盘方向键控制人物移动,使人物与水果接触得分,碰到非水果的物品,如碎玻璃,就会game over。
接下来是详尽的开发过程,篇幅较长,请看官耐心阅读。
Pylash项目地址
由于本次开发用到了pylash,大家可以先去Github上对引擎进行了解。
https://github.com/yuehaowang/pylash_engine
创建项目
首先在工作目录创建一个名为get_fruits
的目录。然后到Github下载Pylash。引擎是基于Python3和PyQt4构建的,所以在使用前请确保你使用的是Python3并且安装了PyQt4。如果没有,可以在上述项目地址中找到他们的相关网页链接进行下载安装,安装和配置步骤都十分简单。这里不再赘述。
下载完Pylash后,我们得到这样的目录结构:
+- pylash_engine/
|
+- pylash/
|
+- demo/
|
+- examples/
大家可以在demo/
和examples/
两个目录下查看示例。本文的源代码可以在examples/get_fruits
中找到。
pylash
目录就是引擎源代码。接下来把这个目录复制到我们创建的get_fruits
目录下,再在get_fruits
目录下创建一个images
目录,用于储存图片。最后创建一个Main.py
文件。这时,我们的get_fruits
目录结构如下:
+- get_fruits/
|
+- pylash/
|
+- images/
|
+- Main.py
然后将引擎目录plash_engine/examples/get_fruits/images/
下图片复制到项目目录get_fruits/images/
下,用作游戏素材。
这样一来,我们的项目就创建好了,接下来只用往Main.py
里填写代码,然后运行即可。
编写Hello World小程序
用代码编辑器(推荐Sublime Text)打开Main.py
文件,写入以下代码:
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
from pylash.utils import init, addChild
from pylash.text import TextField
def main():
# 创建文本显示对象
txt = TextField()
# 设置文本内容
txt.text = "Hello World"
# 设置文本颜色
txt.textColor = "red"
# 设置文本位置
txt.x = 50
txt.y = 100
# 设置文本字体大小
txt.size = 50
# 将文本对象加入到最底层
addChild(txt)
# 初始化窗口,参数:界面刷新时间(单位:毫秒),窗口标题,窗口宽度,窗口高度,初始化完毕后回调函数
init(1000 / 60, "Hello World", 800, 600, main)
运行Main.py
,如果得到了如下图所示的界面,说明程序正常运转起来了。
大家可以结合注释初步认识Pylash。熟悉flash的同学不难发现,TextField
就是flash里显示文本的类,而且用法十分相近。
我们从代码的第4行看起,这里我们引入了pylash中的一些函数和类。pylash提供了很多模块,大家可以到这里查看它们的简介。
再往下看,我们会发现,pylash提供了一个用于显示文本的类,通过设置这个类的不同属性来设定文本样式。最后使用addChild
将文本显示对象加入到界面中。我们可以把游戏看作分为很多层:地图层、人物层、UI层……,通过分层我们就能实现层次化显示效果。比如人物一直是在地图上方显示的,那么人物层就在地图层上方。addChild
函数就是把一个显示对象加到最底层。
最后,我们使用init
函数初始化窗口。
Pylash提供了许多基础显示对象,除了TextField
文本显示类,还有Bitmap
图片显示类,Sprite
精灵类等。下文会提及。
编写游戏
有了上述对pylash的大致了解,我们就可以开始编写游戏了。首先,删除第四行以后所有代码。
引入所需
首先引入我们所需的所有类和函数,修改Main.py
:
from pylash.utils import stage, init, addChild, KeyCode
from pylash.system import LoadManage
from pylash.display import Sprite, BitmapData, Bitmap, FPS
from pylash.text import TextField, TextFormatWeight
from pylash.events import MouseEvent, Event, KeyboardEvent
from pylash.ui import LoadingSample1
这些类和函数在下面的代码中都会被用到。由于我是提前写好了游戏,所以在这里把这部分代码一块儿贴出来了,大家使用的时候可以根据自己使用情况,每用一个引入一个。
全局变量
游戏中需要用到一些全局变量,大家可以先浏览一遍,不同知道它们是干什么的,后文会用到它们:
dataList = {}
stageLayer = None
player = None
itemLayer = None
scoreTxt = None
addItemSpeed = 40
addItemSpeedIndex = 0
score = 0
keyboardEnabled = False
加载资源
我们的游戏中要用到图片,所以要提前加载图片(存储于images/
目录下)。加载图片我们用到LoadManage
静态类和LoadingSample1
进度条类(还有LoadingSample2
、LoadingSample3
这两款不同样式的进度条。或者大家深入学习后,可以自己写一个进度条类)。修改main
函数:
def main():
# 资源列表,一个list对象,格式:{"name" : 资源名称, "path" : 资源路径}
loadList = [
{
"name" : "player", "path" : <