15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 如何制作移动的平台-Godot3-2D教程

如何制作移动的平台-Godot3-2D教程

时间:2023-06-26 23:45:01 | 来源:网站运营

时间:2023-06-26 23:45:01 来源:网站运营

如何制作移动的平台-Godot3-2D教程:

目录

平台的移动看上去很简单,但仔细一想,就会发现它其实并没有想像中那么容易。好在Godot已经为我们提供了一些相关的方法来处理,所以本期我们就来看看使用Godot如何制作移动的平台。

创建平台

首先,使用Node2D节点创建一个新场景,命名为 MovingPlatform ,添加子节点 KinematicBody2D 节点,命名为 Platform

接着为 Platform 节点添加子节点,可以使用 Sprite 节点,也可以使用 TileMap 节点。本文将使用TileMap节点,因为素材是现成。关于如何使用TileMap节点,可以看看之前的文章。

跟着再为 Platform 节点添加 CollisionShape2D 节点,将它覆盖到TileMap上。如图:

移动平台

本文为了移动更平滑,将使用 Tween 方法,所以,首先为 MovingPlatform 节点添加 Tween 子节点,命名为 MoveTween ,并选中两个 Repeat ,并将 Playback Proce mode 设置为 Physics

然后为 MoveingPlatform 节点添加脚本。仍然从变量开始:

首先就是将 PlatformMoveTween 节点引用进来。

onready var platform = $Platformonready var tween = $MoveTween接着,我们要定义3个变量:

export var move_to = Vector2(100, 0)export var speed = 50.0var delay = 1.0move_tospeed 使用了 export ,目的是方便在属性里设置。

move_to 是一个向量,它有x和y两个方向,所以想要向任何一个方向移动,移动多远都是可以设置的。

然后来到 _ready() 函数,使用 Tween 节点的 interpolate_property() 函数来实现移动,可以先看看它的定义:

bool interpolate_property(object: Object, property: NodePath, initial_val: Variant, final_val: Variant, duration: float, trans_type: TransitionType = 0, ease_type: EaseType = 2, delay: float = 0)
Animates property of object from initial_val to final_val for duration seconds, delay seconds later. Setting the initial value to null uses the current value of the property.
Use TransitionType for trans_type and EaseType for ease_type parameters. These values control the timing and direction of the interpolation. See the class description for more information.
说明一下第八个参数 delay ,在前面,我们定义了一个空闲时间,其实就是为delay赋值,这个时间会在运动停止后开始计时,它并不包含运动时间,这一点很重要。

第五个参数 duration 是持续时间,因为移动的距离不总是相同,所以它是一个计算结果值,即用移动距离除以速度得到。

那么来到_ready函数,首先,计算出 duration 值,并调用 interpolate_property() 函数和start()函数:

func _ready(): var duration = move_to.length() / speed tween.interpolate_property(platform, "position", Vector2.ZERO, move_to, duration, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT, delay) tween.start()保存后,将 MovingPlatform 场景拖入主场景中,运行测试。

可以看到,平台可以正常往后移动目标距离。但是同时也看到,它在移动结束后,会 的一下回到开始的位置,这说明,没有移回来这一步,那么要解决这个问题,只需要在它移到位置后,再将它移回来即可,于是再调用一次 interpolate_proerpty 方法,这次从目标位置移回起点位置。

func _ready(): var duration = move_to.length() / speed tween.interpolate_property(platform, "position", Vector2.ZERO, move_to, duration, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT, delay) tween.interpolate_property(self, "follow", move_to, Vector2.ZERO, duration, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT, duration + delay * 2) tween.start()注意:两个interpolate_property方法,并不是一个执行完另一个再执行,它们会一起运行,错开它们的就靠 delay 参数。意思是第一个方法将平台移动到位置后,第二个方法因为delay参数才开始执行,所以,只要将delay时间设置好,它就总是能在正确的时间去执行。

于是我们看看第二个方法的delay参数值: duration + delay * 2

那么,运行测试一下。

站在平台上移动

站在平台上移动,这里要区分一下水平和垂直,斜向移动则包含两种情况。首先,我们先看垂直移动,因为受到的影响是最大的,如图:

垂直方向上的抖动

可以看到,平台在向上移动时,角色的脚陷进平台了,而向下移动时,角色的脚又离开平台,像是飞了起来。

这是因为平台的移动是通过position控制的,而角色是在重力或是碰撞的影响下往下或往上移动,那么势必会产生不同帧移动,所以出现了上面的情况。

解决这个问题非常简单,将平台的 platform 节点的 Motion -> Sync to Physics 属性勾上。

再次运行游戏:

感觉好多了(仍然有些抖动是因为像素的问题)。但它仍然有一个问题,就是向上移动的时候,角色始终会隔帧产生一个下坠的速度,这有什么问题呢,这会倒置角色站在平台上,平台向上移动时,跳跃会因为有些帧检查是否站在地面上失败,而无法起跳。

解决这个问题,Godot提供了一个类 move_and_slide 函数: move_and_slide_with_snap 函数,先看看它的定义:

Vector2 move_and_slide_with_snap(linear_velocity: Vector2, snap: Vector2, up_direction: Vector2 = Vector2( 0, 0 ), stop_on_slope: bool = false, max_slides: int = 4, floor_max_angle: float = 0.785398, infinite_inertia: bool = true)
Moves the body while keeping it attached to slopes. Similar to move_and_slide().
As long as the snap vector is in contact with the ground, the body will remain attached to the surface. This means you must disable snap in order to jump, for example. You can do this by setting snap to (0, 0) or by using move_and_slide() instead.
可以看到,它比前者多了一个参数: snap 。它的作用是用于检测目村向量范围内是否有地面,如果有,就吸住它,从而解决抖动问题。因此替换Player的移动代码:

var snap = Vector2.ZERO if is_jumping else Vector2.DOWN * 16velocity = move_and_slide_with_snap(velocity, snap, Vector2.UP)snap值根据是否跳跃进行判断,如果在跳跃,那么值为ZERO,意味着不要吸住,不然就跳不起来了。如果不在跳跃,就吸住,而检测的距离为Vector2.DOWN * 16,也 就是向下乘16px。

再次运行后,可以看到即使向上移动,抖动也不那么明显,且隔帧产生的下坠没有了。

这时将平台改为水平移动,又发现另一个问题。

水平方向上的跳跃

在平台水平移动时,如果跳起来,会发现,角色会落在原地,显然这不太正常,我们需要让角色落回起跳的平台位置,想想一下在火车上。

这里将使用到 get_floor_velocity() 函数,它返回站在的平台上的移动向量。

因此,我们在按下跳跃键时记录下当前平台的移动速度,之后赋给角色的x向量,那么角色即可随着平台一起做一点水平的移动。

首先申明一个变量:

var floor_velectiry_x = 0接着在按下跳跃键的位置,添加获取平台移动速度的代码:

if Input.is_action_just_pressed("jump") and !is_jumping: velocity.y -= 500 if get_floor_velocity().x != 0: floor_velectiry_x = get_floor_velocity().x最后在移动前,将它赋给角色:

if floor_velectiry_x != 0: velocity.x += floor_velectiry_x保存运行测试:

虽然这时仍然会出现向前跳的问题,是因为平台的移动有缓动,即起跳后,平台可能加速或是减速。当然,调整再所难免,毕竟各项数值并不理想。

多个移动平台

好了,有了一个移动平台的场景,要在一个关卡里添加多个移动的平台,只需要将平台场景拖到主场景中,并分别为它们设置move_to和speed的值,即可实现不同平台不同的移动方式。

结论

平台的移动还有很多的情况,本文只是介绍Godot的一些基本思路与实现,再复杂的情况也是通过此延生出来,所以在此基础上扩展一下吧。

DEMO



关键词:平台,教程,移动

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭