目录
引言
最近在学习java之余,利用空余时间写了一款基于pygame的游戏,主要是想测试pygame各方面的性能,其次是因为python语言的简洁性,写起来是真的舒服,最后是拿来自娱自乐一下还挺有趣的(划重点)。声明:该游戏所有代码均为原创,纯手工制作而成。我会在文末放上游戏运行需要的完整文件包,需要的朋友请自取。
创建一款什么样的游戏
由于pygame本身是一款轻量级的游戏开发工具,可以实现的功能也是比较的有限,因此为了简单化,便于操作等目的,本文通过创建一个基本矩形方块来实现各种目的,因为是以矩形方块作为主要操作对象,所以游戏命名为《The Box》。
需要实现什么样的功能
作为一款测试开发游戏,需要实现的功能比较的基本,由于是一款二维平面游戏,因此需要实现一些较为传统的功能:
- 游戏主要操作对象的创建与交互
- 游戏中基本的键鼠交互
- 游戏中场景的构建与其他对象的交互
- 游戏中其他非环境对象的创建与交互
- 游戏中基本循环逻辑的实现
除了以上几个需要实现的基本功能,还需要考虑游戏的基本逻辑构建,所谓的逻辑构建就是为了实现游戏需要达到的目的,比如游戏能否足够有趣,是否具有可玩性,是否有足够的交互性等,当然这些都在不在本文的考虑范围之内(悲)。
如何去实现基本的功能
目前只是初步的实现了一下一些基本功能,因为最近比较忙就暂停开发了,所以先发布一下看看自己有没有可能哪天能捡起来(笑)。废话不多说,先看目前的实现效果:
《 The Box》
看起来还行,就是太呆了(大笑)。好了关于如何实现的问题,其实我们只需要从模块化设计入手就行。这款游戏主要是通过几个基本模块来实现的:背景模块、主角色模块、场景模块、逻辑模块。上面几个模块主要实现的功能及代码如下:
背景模块
# 背景墙
class BackgroundWall(py.sprite.Sprite):
def __init__(self, screen):
py.sprite.Sprite.__init__(self)
wallPath = '../素材库/背景墙素材/'
self.index = 0
self.imageFiles = [os.path.join(wallPath, i) for i in os.listdir(wallPath)]
self.images = [py.transform.smoothscale(py.image.load(name), (screen.get_width(), screen.get_height())) for name
in self.imageFiles]
self.image = self.images[self.index]
self.rect = self.image.get_rect()
self.rect.topleft = (0, 0)
def update(self, game_time):
timeH, timeM = divmod(game_time, 60)
self.index = int(timeH)
if self.index>17:
self.index =17- self.index%17
self.image = self.images[self.index]
self.rect = self.image.get_rect()
self.rect.topleft = (0, 0)
背景模块顾名思义是用来创建游戏的背景,本文在此实现的功能也是极其简单,主要通过调用游戏时间来实现游戏背景的自动切换。如果你想实现各种功能,比如说随着BGM切换背景,或者通过某种事件切换背景都是可以的,只需要在update函数中添加各种需要的功能即可。
主角色模块
class CubeHuman(object):
def __init__(self, screen):
self.x = screen.get_width()
self.y = screen.get_height()
self.CubeBodyGroup = py.sprite.Group()
self.CubeEyeballGroup = py.sprite.Group()
self.CubeMouthGroup = py.sprite.Group()
self.CubeEyesGroup = py.sprite.Group()
self.cube_body = self.CubeBody()
self.cube_eyes = self.CubeEyes()
self.cube_eyeball = self.CubeEyeball()
self.cube_mouth = self.CubeMouth()
self.CubeBodyGroup.add(self.cube_body)
self.CubeEyeballGroup.add(self.cube_eyeball)
self.CubeMouthGroup.add(self.cube_mouth)
self.CubeEyesGroup.add(self.cube_eyes)
# 伤害,血量等自身参数
self.basicDamage = 10 # 基础伤害
self.basic = 10 # 基础防御
self.basicHp = 100 # 基础血量
self.basicMp = 100 # 基础蓝量
self.HP = 100
self.MP = 100
self.rate = 4
hpImage = py.image.load('../素材库/血条和蓝条/血条.png')
hpRect = hpImage.get_rect()
self.hpImage = py.transform.smoothscale(hpImage,
(int(hpRec