欢迎回到我们的 《零基础:100个小案例玩转Python软件开发!》 系列!在上节我们讲述了游戏《坦克大战》的场景和界面制作,本节我们继续开发战斗场景!PyMe下载:https://pyme.lanzoum.com/ihtxE3gtinwh
本案例请下载 1.5.6.3版本进行学习开发!
在上一节中,我们在War场景创建出了多层网格地图,底层是地面格子,中间层是放置位置点的Tank层,上层是物件层。 场景是800x600,而格子是10x10的,占用600x600像素,右边还有200像素宽空余,我们制作一个界面来显示信息。 在当前文件夹下右键单击,弹出输入界面名称,输入WarUI后点击确定新建游戏界面WarUI,我们将Form_1设为200宽,600高,并从左边工具条拖动创建出显示1P的信息,包括"1P"文字下的玩家坦克图标和数量文字,以及在上面摆放初始生成的20辆敌军坦克。 再返回到场景War,在右下角的资源选项页中选择”界面“,导入WarUI界面并摆放到场景 X :600,Y :0 的位置,补足场景中右边的空白区。 按CTRL+S保存一下,再次运行,点击”开始游戏“按钮,就可以看到场景和编辑时的一致效果啦。 在资源文件夹下用鼠标右键创建一个Character文件夹。 在Character文件夹下用鼠标右键单击,在弹出菜单中点击"新建序列动画",进入到动画编辑器中。 动画编辑器主要用来制作动作动画,支持创建多个动作,支持生成序列帧图片,点击左边的"+"号,在弹出对话框中选择创建新动作,填写动作名称为up,因为只有一帧,所以在这里我们使用自由创作模式,使用坦克图片tank_0.png作,点击确定。 确定后可以看到"+"右边的下拉列表框出现了up动作,坦克图片显示在第一帧。 继续创建出left,right,down三个动作,因为pygame旋转是逆时针,所以根据方向设置旋转逆时针角度。 有了这四个动作,下面我们来创建坦克角色并装配一下这四个动作。 在Character文件夹下用鼠标右键单击,在弹出菜单中点击"新建游戏角色",输入player,创建角色文件player.py进入到角色编辑器中。 进入角色文件player,在右上角的属性面板导入动作文件,导入成功后选择默认动作up,这样当前角色就跟动作文件关联好了,我们可以在角色中通过播放动作就方便的显示对应的动作动画啦! 但角色远不仅仅用来管理动画,它本身还拥有一些基础属性,比如: 有了这些基本属性,我们可以通过角色的接口函数来进行存取,这样我们做游戏会更方便,如果小伙伴需要增加自定义属性可以直接点击“增加属性”按钮来增加自定义属性。 面板上除了属性管理外,还有事件管理,可以对常见的事件进行事件函数编写,包括:- Collision:碰撞事件,跟其它物体碰撞后调用。
- EventRect:事件矩形碰撞事件,事件矩形跟其它物体碰撞后调用。
事件列表下方,还有个”增加事件“按钮,用户也可以在这里增加自定义事件函数。在这里我们需要为KeyDown增加事件处理,只需要双击KeyDown属性栏的值,即可进入到代码编辑器:def on_KeyDown(self,key): if key == 'up': self.PlayAction("up",True) elif key == 'left': self.PlayAction("left",True) elif key == 'right': self.PlayAction("right",True) elif key == 'down': self.PlayAction("down",True)
最后是绑定设置,可以为角色设置一些绑定点,用于挂件或定位使用,比如我们希望得到人物脚的位置,或者坦克炮口的位置点,可以在这里增加绑定点。 介绍完这些功能,是不是感觉PyMe还是很强大的!下面我们来处理一下坦克的移动,首先我们双击Load事件进入加载完成函数,在其中增加运动方向和运动状态变量,并在按键处理的代码中加入设置方向和状态。编写完后通过鼠标右键菜单,返回角色设计视图,在右边是响应面板的Update事件的对应函数栏双击,并在on_Update(self,delay)函数中处理更新,这里delay为浮点的秒数。 还要为键盘松开事件增加设置停止运动的处理,同样返回到角色编辑视图,为事件逻辑增加KeyUp的事件函数。 在松开时,判断是否松开了对应方向的键,如果是的话,就将运动状态设为停止。#按键松开时的处理 def on_KeyUp(self,key): if key == 'up' and self.move_dir == 'up': self.move_state = False elif key == 'left' and self.move_dir == 'left': self.move_state = False elif key == 'right' and self.move_dir == 'right': self.move_state = False elif key == 'down' and self.move_dir == 'down': self.move_state = False
请大家想一想,这里为什么要用and来同时判断mov_dir,而不是直接判断key就设为停止?你知道么,欢迎在评论区回复,我将对第一个答出来的小伙伴赠送10个PyMe AIGC豆哟~ 返回到场景War,然后在右边图层列表选择War图层,因为我们上一节将四个位置点放置在这个图层了,一个player位置点,三个enemy位置点,所以我们需要获取这个图层上的当前Player玩家位置点用于定位和出生一个当前玩家坦克。 选择事件响应页面,双击Load事件的对应函数栏,可以进入到场景对应层的初始化完成的函数代码中。 进入到函数中,在War层的Load事件函数填写以下代码: def on_War_Load(self): #获取之前为War层设置的Player位置点 pointInfo = self.GetLayer('War').GetPoint("Player") #位置点信息为(名称,类型,X,Y) tank = GameFun.CreateCharacter("War",pointInfo[2],pointInfo[3],"player.py")
下面我们来运行一下,进入战斗场景,可以看到坦克放置在Player位置点,按键盘上、下、左、右时也会有相应的方向变化。在本节的讲解中,我们主要学会了动作制作和角色编辑,理解这两部分的制作后,我们将能够应对一般的2D小游戏角色处理。在下一节中,我们将继续完善坦克敌人的刷新以及碰撞处理。PyMe官网:www.py-me.com
PyMe下载:https://pyme.lanzoum.com/ihtxE3gtinwh
本案例请下载 1.5.6.3版本进行学习开发!