[实战]来做动作游戏:如何在斜45度游戏里实现跳跃高度
本教程内的游戏为小英雄大乱斗:https://indienova.com/g/little%20fighting,美术资源版权归属为@JKLLIN
注意:本教程只讲思路不会去详细说明如何在C2里怎么写事件。
我们要实现什么效果?
在C2里有2个非常常用的移动行为:
8 direction行为用来实现8方行走,通常我们可以用来做顶视角或45度角游戏。添加8dir就可以直接实现用键盘控制实例在画面中移动。
platform行为用来实现平台跳跃,platform的实例可以有非常简单实用的platform状态,包括jump,fall等。
那么,如果我们需要在8dir里添加跳跃该怎么实现?
基础概念
首先必须对有高度的斜45度游戏有一个基础概念:游戏的坐标体系是由XY轴(坐标)和Z轴(高度)组成的。
通过8dir行为可以直接实现对XY轴的控制,我们需要的是在这个基础上添加一个Z轴,让角色有高度。
拉尔夫出镜
逻辑和表现分离
首先我们要确定的是,为了实现这个效果,我们需要让角色的逻辑和表现分离。
为什么要拆开?
因为我们需要用8dir行为控制角色在地面的XY轴上移动,但当角色跳起来的时候,其实角色只是原地提高了Z轴高度,并没有改变XY的位置。
但角色在画面中真的会位移到较高的位置,所以我们必须让这个跳起来的角色还有一个标记当前XY位置的真正逻辑位置。
观察角色下方的绿色方块,该方块为角色在XY轴空间中的位置
即我们需要2个精灵,一个是真正的角色表现效果,包括角色的所有动画。另一个则是角色的逻辑位置,只需要一个简单的矩形即可。
这里暂时命名这两个精灵为:
role1 角色表现
role1_logic 绿框逻辑
接下来你只要控制role1_logic的8方行走就行了。对应的role1根据状态改变动画。
上面的角色精灵role1使用set postion可以绑定在role1_logic上。注意这里不要使用pin,pin会把角色钉死在role1_logic上,role1就真的跳不起来了。
Z轴的添加思路
为role1_logic添加一个litetween行为,按照以下方式进行配置:
其中tween property设置为value,即我们要用litetween改变的是一个值。
function选择easeOutQuad是一个减速的运动行为,跳起到最高点是一个不断减速的表现效果。
target Mode选择Relative,即相对差值。
target和duration填写改变值和插值时间,这两个控制跳起来的高度和速度,可以在事件里填写。
跳跃开启
在事件里启动litetween的value,让角色跳起来。
第一行先为value设置初始值=0(表示是从地面开始的)
第二行设置value目标值为40
第三行设置时间为0.5秒
第四行设置开始执行litetween,这里使用pingpong的运动模式,是一个往返循环的运动模式
跳跃结束
因为设置了pingpong的运动模式会导致角色会不停的跳不会停止。所以还需要设置当pingpong循环一个循环结束后停止litetween:
这样,从逻辑上实现一个跳跃高度就完成了。最后你只需要把litetween.value的值和role1绑定起来就大功告成了。
逻辑Z轴体现在跳跃高度上
前面讲到role1需要set postion始终跟随role1_logic,这里的XY设置除了role1.x=role1_logic.x外,还需要在Y轴上添加litetween.value的值:role1.y=role1_logic.y-role1_logic.litetween.value(注意这里减value,因为跳起来是y轴减少)
这样,就可以让角色保持XY轴不变的情况下跳起来。
行为的拆分
上面描述的情况是非常简单的同高度跳跃,即从0高度开始跳到40,再落到0。ACT游戏一般也只需要做到这个程度了。但如果你想做更复杂的,比如二段跳,那么就不能使用pingpong方法。而需要自己将角色的状态扩展为jump和fall两个状态,分别控制litetween.value的起落运动了。
扩展内容
实现了以上功能,基本你就可以做出包括空中攻击,升龙拳,打击浮空等更复杂的战斗效果了。
楼主这个什么游戏啊,好酷~
谢谢potion叔的干货!这个效果可以直接用动画来实现么,就是直接在动画里做出精灵的z轴位移,然后每一个动画的锚点都设置在玩家的逻辑位置。