国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 如何制作移動的平臺-Godot3-2D教程

如何制作移動的平臺-Godot3-2D教程

時間:2023-06-26 23:45:01 | 來源:網(wǎng)站運營

時間:2023-06-26 23:45:01 來源:網(wǎng)站運營

如何制作移動的平臺-Godot3-2D教程:

目錄

平臺的移動看上去很簡單,但仔細一想,就會發(fā)現(xiàn)它其實并沒有想像中那么容易。好在Godot已經(jīng)為我們提供了一些相關(guān)的方法來處理,所以本期我們就來看看使用Godot如何制作移動的平臺。

創(chuàng)建平臺

首先,使用Node2D節(jié)點創(chuàng)建一個新場景,命名為 MovingPlatform ,添加子節(jié)點 KinematicBody2D 節(jié)點,命名為 Platform

接著為 Platform 節(jié)點添加子節(jié)點,可以使用 Sprite 節(jié)點,也可以使用 TileMap 節(jié)點。本文將使用TileMap節(jié)點,因為素材是現(xiàn)成。關(guān)于如何使用TileMap節(jié)點,可以看看之前的文章。

跟著再為 Platform 節(jié)點添加 CollisionShape2D 節(jié)點,將它覆蓋到TileMap上。如圖:

移動平臺

本文為了移動更平滑,將使用 Tween 方法,所以,首先為 MovingPlatform 節(jié)點添加 Tween 子節(jié)點,命名為 MoveTween ,并選中兩個 Repeat ,并將 Playback Proce mode 設(shè)置為 Physics 。

然后為 MoveingPlatform 節(jié)點添加腳本。仍然從變量開始:

首先就是將 PlatformMoveTween 節(jié)點引用進來。

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 ,目的是方便在屬性里設(shè)置。

move_to 是一個向量,它有x和y兩個方向,所以想要向任何一個方向移動,移動多遠都是可以設(shè)置的。

然后來到 _ready() 函數(shù),使用 Tween 節(jié)點的 interpolate_property() 函數(shù)來實現(xiàn)移動,可以先看看它的定義:

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.
說明一下第八個參數(shù) delay ,在前面,我們定義了一個空閑時間,其實就是為delay賦值,這個時間會在運動停止后開始計時,它并不包含運動時間,這一點很重要。

第五個參數(shù) duration 是持續(xù)時間,因為移動的距離不總是相同,所以它是一個計算結(jié)果值,即用移動距離除以速度得到。

那么來到_ready函數(shù),首先,計算出 duration 值,并調(diào)用 interpolate_property() 函數(shù)和start()函數(shù):

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 場景拖入主場景中,運行測試。

可以看到,平臺可以正常往后移動目標(biāo)距離。但是同時也看到,它在移動結(jié)束后,會 的一下回到開始的位置,這說明,沒有移回來這一步,那么要解決這個問題,只需要在它移到位置后,再將它移回來即可,于是再調(diào)用一次 interpolate_proerpty 方法,這次從目標(biāo)位置移回起點位置。

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方法,并不是一個執(zhí)行完另一個再執(zhí)行,它們會一起運行,錯開它們的就靠 delay 參數(shù)。意思是第一個方法將平臺移動到位置后,第二個方法因為delay參數(shù)才開始執(zhí)行,所以,只要將delay時間設(shè)置好,它就總是能在正確的時間去執(zhí)行。

于是我們看看第二個方法的delay參數(shù)值: duration + delay * 2 。

那么,運行測試一下。

站在平臺上移動

站在平臺上移動,這里要區(qū)分一下水平和垂直,斜向移動則包含兩種情況。首先,我們先看垂直移動,因為受到的影響是最大的,如圖:

垂直方向上的抖動

可以看到,平臺在向上移動時,角色的腳陷進平臺了,而向下移動時,角色的腳又離開平臺,像是飛了起來。

這是因為平臺的移動是通過position控制的,而角色是在重力或是碰撞的影響下往下或往上移動,那么勢必會產(chǎn)生不同幀移動,所以出現(xiàn)了上面的情況。

解決這個問題非常簡單,將平臺的 platform 節(jié)點的 Motion -> Sync to Physics 屬性勾上。

再次運行游戲:

感覺好多了(仍然有些抖動是因為像素的問題)。但它仍然有一個問題,就是向上移動的時候,角色始終會隔幀產(chǎn)生一個下墜的速度,這有什么問題呢,這會倒置角色站在平臺上,平臺向上移動時,跳躍會因為有些幀檢查是否站在地面上失敗,而無法起跳。

解決這個問題,Godot提供了一個類 move_and_slide 函數(shù): move_and_slide_with_snap 函數(shù),先看看它的定義:

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.
可以看到,它比前者多了一個參數(shù): snap 。它的作用是用于檢測目村向量范圍內(nèi)是否有地面,如果有,就吸住它,從而解決抖動問題。因此替換Player的移動代碼:

var snap = Vector2.ZERO if is_jumping else Vector2.DOWN * 16velocity = move_and_slide_with_snap(velocity, snap, Vector2.UP)snap值根據(jù)是否跳躍進行判斷,如果在跳躍,那么值為ZERO,意味著不要吸住,不然就跳不起來了。如果不在跳躍,就吸住,而檢測的距離為Vector2.DOWN * 16,也 就是向下乘16px。

再次運行后,可以看到即使向上移動,抖動也不那么明顯,且隔幀產(chǎn)生的下墜沒有了。

這時將平臺改為水平移動,又發(fā)現(xiàn)另一個問題。

水平方向上的跳躍

在平臺水平移動時,如果跳起來,會發(fā)現(xiàn),角色會落在原地,顯然這不太正常,我們需要讓角色落回起跳的平臺位置,想想一下在火車上。

這里將使用到 get_floor_velocity() 函數(shù),它返回站在的平臺上的移動向量。

因此,我們在按下跳躍鍵時記錄下當(dāng)前平臺的移動速度,之后賦給角色的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保存運行測試:

雖然這時仍然會出現(xiàn)向前跳的問題,是因為平臺的移動有緩動,即起跳后,平臺可能加速或是減速。當(dāng)然,調(diào)整再所難免,畢竟各項數(shù)值并不理想。

多個移動平臺

好了,有了一個移動平臺的場景,要在一個關(guān)卡里添加多個移動的平臺,只需要將平臺場景拖到主場景中,并分別為它們設(shè)置move_to和speed的值,即可實現(xiàn)不同平臺不同的移動方式。

結(jié)論

平臺的移動還有很多的情況,本文只是介紹Godot的一些基本思路與實現(xiàn),再復(fù)雜的情況也是通過此延生出來,所以在此基礎(chǔ)上擴展一下吧。

DEMO



關(guān)鍵詞:平臺,教程,移動

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉