玩转Python开发游戏《坦克大战》(中)

欢迎回到我们的 《零基础:100个小案例玩转Python软件开发!》 系列!在上节我们讲述了游戏《坦克大战》的场景和界面制作,本节我们继续开发战斗场景!

PyMe下载**:https://pyme.lanzoum.com/iAUzv3guirpa**

本案例请下载 1.5.6.3版本进行学习开发!

本案例请下载 1.5.6.3版本进行学习开发!

零基础100个案例玩转Python:游戏《坦克大战》(上)

在上一节中,我们在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,这样当前角色就跟动作文件关联好了,我们可以在角色中通过播放动作就方便的显示对应的动作动画啦!

但角色远不仅仅用来管理动画,它本身还拥有一些基础属性,比如:

  • life:生命值

  • speed:运动速度

  • jumpspeed:跳跃的向上速度

  • gravity:重力加速度

  • check_block: 检测阻挡

  • check_collision:检测碰撞

  • check_eventrect:是否有事件矩形。

有了这些基本属性,我们可以通过角色的接口函数来进行存取,这样我们做游戏会更方便,如果小伙伴需要增加自定义属性可以直接点击"增加属性"按钮来增加自定义属性。

面板上除了属性管理外,还有事件管理,可以对常见的事件进行事件函数编写,包括:

  • Load:初始化完成事件,由系统自动调用。

  • Birth:标准的角色出生事件,由系统自动调用。

  • Update:每帧更新事件,由系统自动调用。

  • Render:每帧渲染事件,由系统自动调用。

  • Block:阻挡事件,跟地图阻挡碰撞后调用。

  • Collision:碰撞事件,跟其它物体碰撞后调用。

  • EventRect:事件矩形碰撞事件,事件矩形跟其它物体碰撞后调用。

  • Destroy:销毁后事件,由系统自动调用。

  • PickDown:点击事件,按下时调用。

  • PickUp:松开事件,松开时调用。

  • KeyDown:按键按下事件。

  • KeyUp:按键松开事件。

事件列表下方,还有个"增加事件"按钮,用户也可以在这里增加自定义事件函数。在这里我们需要为KeyDown增加事件处理,只需要双击KeyDown属性栏的值,即可进入到代码编辑器:

python 复制代码
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的事件函数。

在松开时,判断是否松开了对应方向的键,如果是的话,就将运动状态设为停止。

python 复制代码
#按键松开时的处理
    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事件函数填写以下代码:

python 复制代码
    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小游戏角色处理。在下一节中,我们将继续完善坦克敌人的刷新以及碰撞处理。

相关推荐
bin91532 小时前
(文后附完整代码)html+css+javascript 弹球射击游戏项目分析
前端·javascript·css·游戏·html·前端开发
上海云盾商务经理杨杨10 小时前
2026游戏盾深度解析:从被动防御到智能作战,构建DDoS免疫堡垒
网络·游戏·ddos
2501_9444241220 小时前
Flutter for OpenHarmony游戏集合App实战之黑白棋落子翻转
android·开发语言·windows·flutter·游戏·harmonyos
熹乐互动20 小时前
亲测有效!马年互动赛马游戏实践复盘分享
游戏
咕噜企业分发小米20 小时前
腾讯云多云管理工具如何与第三方合规工具集成以支持持续合规?
运维·服务器·游戏
2501_9444241221 小时前
Flutter for OpenHarmony游戏集合App实战之消消乐下落填充
android·开发语言·flutter·游戏·harmonyos
一起养小猫21 小时前
LeetCode100天Day16-跳跃游戏II与H指数
算法·游戏
FairGuard手游加固1 天前
如何检测游戏直装破解
游戏
2501_944526421 天前
Flutter for OpenHarmony 万能游戏库App实战 - 主题切换实现
android·开发语言·javascript·python·flutter·游戏·django