【轉(zhuǎn)】Godot3游戲引擎入門(mén)之十四:RigidBody2D剛體節(jié)點(diǎn)的應(yīng)用以及簡(jiǎn)單的FSM狀態(tài)機(jī)介紹

一旷太、前言

時(shí)間飛逝,距離上次更新已經(jīng)有半年之久批旺!這幾個(gè)月里我只有三分之一的時(shí)間很忙幌陕,相反其他時(shí)間是比較閑的,但是由于空閑時(shí)間非称螅“碎片化”搏熄,導(dǎo)致我一直沒(méi)有集中精力搞自己喜歡的“小游戲”了。首先對(duì)我的讀者表示非常抱歉暇赤!嗯心例,從本篇開(kāi)始,我會(huì)陸陸續(xù)續(xù)更新一些新的文章翎卓,盡管更新的頻率可能會(huì)變得“佛系”契邀,不過(guò)我肯定不會(huì)放棄 Godot 的,哈哈失暴。 ?

不知不覺(jué)坯门, Godot 3.1 正式版都已經(jīng)發(fā)布好幾個(gè)月了微饥,現(xiàn)在最新的穩(wěn)定版本是 3.1.1 ,不知道大家有沒(méi)有感受到新版本中的一些新特性所帶來(lái)的開(kāi)發(fā)樂(lè)趣呢古戴?關(guān)于新特性這里我先不討論欠橘,在今天要介紹的這個(gè)小游戲制作過(guò)程中,我要告訴大家一個(gè)“很不幸”的消息:新版本中的 RigidBody2D fails with a bug! ? 對(duì)现恼,你沒(méi)看錯(cuò)肃续,我遇到 Bug 了,而且還不算個(gè)小問(wèn)題叉袍,它直接導(dǎo)致了我的游戲不能正常地“好好玩耸济”!

話(huà)又說(shuō)回來(lái)喳逛,我所要講述的這個(gè)游戲是一個(gè)非常無(wú)聊的小游戲瞧捌,僅用來(lái)作為示例演示而別無(wú)他意,我會(huì)在文章中指出新版本 Bug 出在哪润文,如何解決等姐呐。另外,游戲中包括的一些圖片文件典蝌、音樂(lè)素材曙砂、甚至不少源代碼都是來(lái)自或者參考了 Chris Bradfield 的一個(gè)名為 Space Rocks 的示例游戲,他的這個(gè)項(xiàng)目是開(kāi)源的骏掀,地址在此: https://github.com/kidscancode/Godot-Game-Engine-Projects 鸠澈。

我想通過(guò)本篇主要講述以下幾個(gè)小部分:

介紹 RigidBody2D 剛體節(jié)點(diǎn)的基本屬性
剛體節(jié)點(diǎn)的基本應(yīng)用以及注意點(diǎn)
游戲場(chǎng)景的結(jié)構(gòu)關(guān)系與核心代碼說(shuō)明
最簡(jiǎn)單的 FSM 有限狀態(tài)機(jī)介紹和應(yīng)用
新版本中存在的 Bug 以及解決方法
主要內(nèi)容: RigidBody2D 剛體節(jié)點(diǎn)的應(yīng)用以及簡(jiǎn)單的 FSM 狀態(tài)機(jī)介紹
閱讀時(shí)間: 12 分鐘
永久鏈接: http://liuqingwen.me/blog/2019/07/20/introduction-of-godot-3-part-14-make-a-game-with-rigidbody2d-node-and-the-fsm-introduction
系列主頁(yè): http://liuqingwen.me/blog/introduction-of-godot-series/
二、正文

本篇目標(biāo)

了解剛體節(jié)點(diǎn)的基本屬性和作用
操控剛體節(jié)點(diǎn)的正確姿勢(shì)
剛體節(jié)點(diǎn)的碰撞檢測(cè)與響應(yīng)處理
簡(jiǎn)單的 FSM 機(jī)制實(shí)現(xiàn)
版本更新帶來(lái)的代碼更新
游戲的主要場(chǎng)景

我之前已經(jīng)介紹過(guò)幾個(gè)小游戲了:

金幣收集小游戲
太空射擊小游戲
平臺(tái)小游戲
相比之前的游戲截驮,本篇中我要介紹的這個(gè)太空飛船小游戲算比較簡(jiǎn)單的一個(gè)款侵,游戲中的元素類(lèi)型少、操作也相對(duì)簡(jiǎn)單侧纯,但最重要的一點(diǎn)是,在本游戲制作中甲脏,我重點(diǎn)使用了 RigidBody2D 剛體節(jié)點(diǎn)眶熬,這與之前討論的 KinematicBody2D 有著很大的區(qū)別,后續(xù)我們會(huì)討論块请,這里先預(yù)覽一下游戲中的所有場(chǎng)景結(jié)構(gòu)吧:

唯一一個(gè)要注意的地方我已經(jīng)在上圖中作了標(biāo)注: Rock.tscn 巖石場(chǎng)景中的子節(jié)點(diǎn) CollisionShape2D 碰撞圖形沒(méi)有定義實(shí)質(zhì)的形狀娜氏。這是因?yàn)槲覀冃枰谟螒蛑袆?dòng)態(tài)生成不同尺寸的巖石,所以選擇在代碼中根據(jù)其大小創(chuàng)建對(duì)應(yīng)的碰撞圖形:

func _ready():
randomize()

# 設(shè)置位置和質(zhì)量(在Player.gd中設(shè)置位置是在_integrate_forces方法中)
self.position = _position
self.mass = _radius * density

# 設(shè)置圖片尺寸和爆炸粒子尺寸與傳遞的參數(shù)相匹配
_sprite.scale = Vector2(1, 1) * self.size * scaleFactor
_explosion.scale = Vector2(1, 1) * self.size * scaleFactor

# 給巖石一個(gè)碰撞體形狀墩新,和傳遞的參數(shù)半徑相匹配
var shape = CircleShape2D.new()
var textureSize = _sprite.texture.get_size()
shape.radius = (textureSize.x + textureSize.y) / 2.0 * _radius * scaleFactor
_collisionShape.shape = shape

# 省略其他代碼……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
我省略了一些代碼贸弥,有需要的話(huà)可以參考D我的項(xiàng)目源碼,這里我就不全部貼出來(lái)了海渊,其他的部分我也視情況作了一些注釋?zhuān)嘈糯蠹乙谎劬湍芸炊??

FSM 簡(jiǎn)介與實(shí)現(xiàn)

FSM 即 Finite State Machine 有限狀態(tài)機(jī)的縮寫(xiě)绵疲,相信很多游戲開(kāi)發(fā)者都聽(tīng)過(guò)或者在項(xiàng)目中使用過(guò)這種模型哲鸳。在 中文維基百科 中是這樣描述的:有限狀態(tài)自動(dòng)機(jī),簡(jiǎn)稱(chēng)狀態(tài)機(jī)盔憨,是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型徙菠。

上圖來(lái)自 Chris Bradfield 的一本書(shū)[《 Godot Engine Game Development Projects 》],圖中每一個(gè)圓圈表示玩家的一種狀態(tài)郁岩,在某種情況下婿奔,比如鍵盤(pán)輸入、被攻擊问慎、超時(shí)等原因萍摊,玩家會(huì)從當(dāng)前狀態(tài)沿著箭頭切換到另一種狀態(tài)。如上圖如叼,舉個(gè)例子:玩家處于空閑狀態(tài)( IDLE )下冰木,如果按下按鍵( key )則進(jìn)入跑步( RUN )狀態(tài),如果玩家速度為 0 ( speed=0 )則從跑步狀態(tài)切回空閑狀態(tài)薇正。

關(guān)于狀態(tài)機(jī)我了解的并不多片酝,但是我在網(wǎng)上找到了一篇關(guān)于游戲設(shè)計(jì)模式之狀態(tài)模式的文章,內(nèi)容介紹非常詳盡挖腰,我已經(jīng)把它翻譯了出來(lái)雕沿,有興趣的朋友可以參考,當(dāng)做擴(kuò)展閱讀吧猴仑,文章鏈接:【翻譯】游戲設(shè)計(jì)模式之狀態(tài)機(jī)审轮。 ?

本游戲中,我參考了 Chris Bradfield 的《 Godot Engine Game Development Projects 》一書(shū)中 Space Rocks 小游戲的設(shè)計(jì)辽俗,下圖同樣來(lái)自此書(shū):

可以看到疾渣,玩家即太空飛船具有以下四個(gè)狀態(tài):

INIT 即初始狀態(tài),這種狀態(tài)下飛船不可見(jiàn)崖飘,也不會(huì)發(fā)生碰撞事件榴捡,等待游戲開(kāi)始
ALIVE 即正常狀態(tài),初始狀態(tài)下點(diǎn)擊開(kāi)始按鈕即進(jìn)入該狀態(tài)朱浴,飛船恢復(fù)正常并接受相關(guān)事件
INVULN 無(wú)敵狀態(tài)吊圾,這種情況是飛船被攻擊時(shí)進(jìn)入的狀態(tài),一小段時(shí)間后自動(dòng)恢復(fù)到正常狀態(tài)
DEAD 死亡狀態(tài)翰蠢,生命值耗光后進(jìn)入該狀態(tài)项乒,即游戲結(jié)束,隨后自動(dòng)進(jìn)入 INIT 狀態(tài)
結(jié)合狀態(tài)圖梁沧,代碼中實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單檀何,相關(guān)地方我也做了注釋?zhuān)韵率侵饕a部分:

func _changeState(newState) -> void:
if _state == newState:
return

# 更改飛船的狀態(tài),注意設(shè)置飛船的可見(jiàn)性
match newState:
    states.INIT:
        # _collisionShape.disabled = true # 這在 Godot 3.1 版本中不能正常運(yùn)行
        _collisionShape.set_deferred('disabled', true) # 新版本適用,禁用碰撞檢測(cè)
        _sprite.hide()
    states.ALIVE:
        _collisionShape.set_deferred('disabled', false)
        _sprite.show()                        # 顯示
    states.INVULNERABLE:
        _collisionShape.set_deferred('disabled', true)
        _animationPlayer.play('invulnerable') # 無(wú)敵狀態(tài)動(dòng)畫(huà)
        _invulnerabilityTimer.start()         # 無(wú)敵狀態(tài)計(jì)時(shí)器
    states.DEAD:
        _collisionShape.set_deferred('disabled', true)
        self.linear_velocity = Vector2.ZERO   # 線速度歸零
        self.angular_velocity = 0.0           # 角速度歸零
        _sprite.hide()                        # 隱藏
        _exhaustParticles.emitting = false    # 停止粒子播放
        _engineAudio.stop()                   # 停止聲音播放
_state = newState

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
一個(gè)方法實(shí)現(xiàn)了 FSM 频鉴,并沒(méi)有所謂的高大上嘛栓辜,嗯……但是,這畢竟只是一個(gè)簡(jiǎn)單砚殿、非常簡(jiǎn)單的小游戲啃憎,而且,使用這種思路避免了代碼中多個(gè) bool 布爾類(lèi)型和 if...else... 多層嵌套的混亂局面似炎。

剛體的屬性及使用

在之前的文章中我已經(jīng)介紹過(guò)了 Godot 中的三種主要物理節(jié)點(diǎn)的功能特點(diǎn)和使用場(chǎng)景: KinematicBody2D/StaticBody2D/RigidBody2D 辛萍,其中 KinematicBody2D 是我們最重要的主角,關(guān)于它的介紹也擴(kuò)展了不少羡藐,比如: Godot3游戲引擎入門(mén)之十二:Godot碰撞理論以及KinematicBody2D的兩個(gè)方法贩毕。但是,對(duì)于 RigidBody2D 剛體節(jié)點(diǎn)仆嗦,相反我僅做了使用場(chǎng)景的一個(gè)簡(jiǎn)單介紹和比較辉阶,所以,在本次小游戲中瘩扼,我們撇開(kāi) KinematicBody2D 轉(zhuǎn)而把精力集中到 RigidBody2D 上谆甜,重點(diǎn)介紹其使用和相關(guān)注意事項(xiàng)等。

其實(shí)在很多場(chǎng)景下 RigidBody2D 都是非常實(shí)用的集绰,比如规辱,想象一下,用 Godot 做一個(gè)類(lèi)似憤怒的小鳥(niǎo)游戲栽燕,那么場(chǎng)景中肯定會(huì)有很多剛體節(jié)點(diǎn)罕袋,只要輕松一點(diǎn),各種物體相互碰撞到處亂飛碍岔,相反浴讯,你完全不用自己去編寫(xiě)太多關(guān)于物理碰撞理論的代碼就實(shí)現(xiàn)了游戲的相關(guān)特性,是不是很爽蔼啦?這就是剛體節(jié)點(diǎn)在游戲中的應(yīng)用場(chǎng)景之一榆纽。

  1. 剛體的一些屬性

剛體和我們現(xiàn)實(shí)生活中的物體非常相似,所以一些這些物體的共有特性在 RigidBody2D 節(jié)點(diǎn)中也有所提現(xiàn)捏肢。首先掠河,最重要的一點(diǎn)就是剛體和萬(wàn)有引力那密不可分的關(guān)系,在 Godot 中設(shè)置重力( Gravity )對(duì)剛體的影響主要有兩種方式:一是在項(xiàng)目中設(shè)置全局引力值猛计;二是在剛體屬性中設(shè)置引力的縮放系數(shù)。

項(xiàng)目中的設(shè)置參考下圖爆捞,具體在 Project Settings -> General -> Physics -> 2d 中找到 Default Gravity 即默認(rèn)引力值配置奉瘤,在本游戲中,由于處于外太空的所有物體都不受重力影響,所以可以在這里進(jìn)行全局配置盗温,把默認(rèn)引力值設(shè)置為 0 藕赞。

另一種方式則是設(shè)置剛體屬性中的 Gravity Scale 引力縮放系數(shù)值,它表示物體受重力的影響大小卖局,本游戲中沒(méi)必要進(jìn)行設(shè)置斧蜕。其他剛體的一些常見(jiàn)屬性有:

Mass/Weight :質(zhì)量和重量, G = mg 重力公式說(shuō)明了重量和質(zhì)量砚偶、引力三者的關(guān)系
Contacts Reported/Contact Monitor/Can Sleep :是否響應(yīng)碰撞以及響應(yīng)碰撞體個(gè)數(shù)批销、能否休眠
Linear/Angular/Applied Forces :分別設(shè)置線性速度和阻力、角速度和阻力染坯、受力和扭矩力
Friction/Bounce :碰撞材質(zhì)相關(guān)屬性均芽,設(shè)置剛體的摩擦力和彈性系數(shù)等
最后一組屬性的設(shè)置之前,你必須創(chuàng)建一個(gè)新的 PhysicsMaterial 即碰撞材質(zhì)单鹿,這與老版本 Godot 中剛體屬性設(shè)置稍微不同掀宋。另外,剛體還有一些其他的屬性這里并沒(méi)有完全列出來(lái)仲锄,比如 Mode 剛體模式或者 Custom Integrator 自定義碰撞響應(yīng)等劲妙,我們暫時(shí)不討論,在之后的文中如果用到再介紹吧儒喊。 ?

上圖是玩家和巖石節(jié)點(diǎn)的屬性镣奋,他們都是剛體節(jié)點(diǎn),但是設(shè)置還是有差別的澄惊∷敉荆可以看到,我給 Rock 巖石剛體覆蓋了默認(rèn)的材質(zhì)屬性掸驱,設(shè)置摩擦阻力為 0 并添加了一定的彈性力肛搬,這樣讓巖石在太空中碰撞起來(lái)后的響應(yīng)更有趣;而玩家 Player 即飛船剛體屬性配置中毕贼,最重要的是我勾選開(kāi)啟了 Contact Monitor 屬性(默認(rèn)關(guān)閉)靴迫,這對(duì)游戲的正常運(yùn)行非常關(guān)鍵,否則我們無(wú)法檢測(cè)到宇宙飛船和其他任何敵人(巖石)之間的碰撞俭驮。

  1. 剛體的碰撞測(cè)試

在我們之前的游戲中翘悉,碰撞檢測(cè)一般是 Area2D 的專(zhuān)項(xiàng),在我們這個(gè)游戲中也有 Area2D 節(jié)點(diǎn)的使用待秃,比如 Laser.tscn 子彈場(chǎng)景拜秧。然而我們還需要響應(yīng)太空飛船和巖石之間的碰撞,他們都是剛體章郁,如何響應(yīng)呢枉氮?前面我已經(jīng)說(shuō)明了開(kāi)啟碰撞檢測(cè)的屬性志衍,除此之外,我們還要在需要主動(dòng)檢測(cè)碰撞的剛體中設(shè)置 Contacts Reported 屬性值聊替,即碰撞體檢測(cè)數(shù)量楼肪,這里我們?cè)O(shè)置為 1 對(duì)于這個(gè)游戲已經(jīng)足夠,那么碰撞響應(yīng)處理的代碼如下:

func _on_Player_body_entered(body):
if body.is_in_group('rock') && body.has_method('explode'):
# 與巖石碰撞惹悄,調(diào)用巖石的爆炸方法春叫,傳遞飛船速度(也就是碰撞方向)
body.explode(self.linear_velocity)
# 計(jì)算傷害
_damage(body.size)
1
2
3
4
5
6
除了開(kāi)啟碰撞,我們有時(shí)候還需要暫時(shí)關(guān)閉碰撞檢測(cè)功能泣港,比如飛船進(jìn)入無(wú)敵狀態(tài)的時(shí)候就不應(yīng)該和其他任何物體發(fā)生碰撞了暂殖,和之前的游戲一樣,我們的思路是:直接禁用飛船的碰撞圖形 CollisionShape2D 即可爷速,代碼 _collisionShape.disabled = true 一行搞定央星。

當(dāng)你覺(jué)得一切就緒的時(shí)候,“詭異”的事情發(fā)生了:飛船在禁用了碰撞圖形后惫东,居然還能與其他碰撞體進(jìn)行正常的碰撞響應(yīng)莉给!其實(shí)這在 Godot 3.1 之前的版本中是不會(huì)出現(xiàn)的,一切正常廉沮,但是從 3.1 的版本開(kāi)始:

In 3.1 Godot doesn’t let you change the physics state during the physics processing stage. This change ($CollisionShape2D.set_deferred("disabled", true)) to the code tells it to disable the shape as soon as physics processing is complete.
這是我在遇到這個(gè)問(wèn)題后從 KidsCanCode 博主那里得到的解答颓遏,大致意思是:我們不能在物理模型碰撞檢測(cè)發(fā)生的過(guò)程中直接操作碰撞圖形,相反應(yīng)該使用 set_deferred 方法滞时,這就是告訴引擎叁幢,在物理碰撞處理完階段再進(jìn)行設(shè)置。修改 _collisionShape.disabled = true 如下即可:

_collisionShape.disabled = true # 這在 Godot 3.1 版本中不能正常運(yùn)行

_collisionShape.set_deferred('disabled', true) # 新版本適用坪稽,禁用碰撞檢測(cè)
1
2
除了這一點(diǎn)需要注意之外曼玩,其他的和之前我們介紹的 KinematicBody2D 的處理幾乎一樣。 ?

  1. 使用代碼控制運(yùn)動(dòng)

實(shí)際上剛體的物理碰撞檢測(cè)和響應(yīng)都是交給引擎自動(dòng)完成的窒百,所以我們很多時(shí)候沒(méi)必要插手剛體的運(yùn)動(dòng)黍判,但是在本游戲中,我們的太空飛船并不適用篙梢,我們?nèi)匀恍枰O(jiān)聽(tīng)并控制它的一舉一動(dòng):不能飛出屏幕之外顷帖、設(shè)置其角速度和線速度、飛船的位置和角度重置等渤滞。

self.position = Vector2.ZERO
self.rotation = 0.0

func _physics_process(delta):
self.position += velocity.rotated(self.rotation);
self.linear_velocity = velocity
# ......
1
2
3
4
5
6
7
以上代碼使我們常用的設(shè)置贬墩,但是不幸的是,這并不適用于 RigidBody2D 妄呕,這在 Godot 官方文檔中有說(shuō)明:

Note: You should not change a RigidBody2D’s position or linear_velocity every frame or even very often. If you need to directly affect the body’s state, use _integrate_forces, which allows you to directly access the physics state.
嗯陶舞,如果你想操作 RigidBody2D ,需要改用 _integrate_forces 方法:

func _integrate_forces(state):
# 計(jì)算前進(jìn)動(dòng)力和旋轉(zhuǎn)扭矩绪励,并應(yīng)用給飛船剛體(沖量)
var force = Vector2(_thrustForceInput * thrustForce, 0).rotated(self.rotation)
var torque = _rotateDirection * rotateSpeed
state.apply_central_impulse(force)
state.apply_torque_impulse(torque)

# 設(shè)置飛船的位置吊说,origin為飛船位置论咏,xform.x為飛船主軸轉(zhuǎn)向,不要直接設(shè)置position
var xform = state.transform
if _needReset:
    xform.origin = _resetPosition
    xform.x = Vector2(1, 0)
    _needReset = false

# 控制飛船在窗口邊緣的位置颁井,形成一個(gè)閉合區(qū)間
if xform.origin.x > _screenSize.x:
    xform.origin.x = 0
elif xform.origin.x < 0:
    xform.origin.x = _screenSize.x
if xform.origin.y > _screenSize.y:
    xform.origin.y = 0
elif xform.origin.y < 0:
    xform.origin.y = _screenSize.y

# 更新?tīng)顟B(tài)
state.transform = xform

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
通過(guò) state 可以自由設(shè)置剛體的位置,比如上面的代碼主要是控制飛船在窗口邊緣的位置蠢护,另外雅宾,這里還有一個(gè)設(shè)置,由于玩家死亡后葵硕,我沒(méi)有刪除其引用而是將其隱身眉抬,那么飛船的位置是不固定的,游戲恢復(fù)重新開(kāi)始后需要重置其位置為初始位置懈凹,這里同樣地需要在 _integrate_forces 方法中進(jìn)行設(shè)置蜀变,如上代碼的注釋我已經(jīng)做了說(shuō)明。

最后再啰嗦一句:對(duì)于剛創(chuàng)建(比如使用 instance 方法)的剛體物體介评,直接設(shè)置其 position 位置屬性是沒(méi)問(wèn)題的库北,注意別混淆了。 ?

新版本中剛體的問(wèn)題

游戲開(kāi)發(fā)過(guò)程也就是學(xué)習(xí)的過(guò)程们陆,也是填坑的過(guò)程寒瓦,前面我們已經(jīng)了解到了 Godot 3.1 新版本中的一個(gè)細(xì)節(jié)問(wèn)題了:如何正確設(shè)置剛體的碰撞圖形屬性,需要使用 set_deferred 方法坪仇。然而在本游戲的制作過(guò)程中杂腰,我還遇到了另一個(gè) 3.1.1 穩(wěn)定版本中尚未解決的 Bug ,而這個(gè) Bug 居然在 Godot 3.0 中也是存在的:如果你一開(kāi)始禁用剛體的碰撞圖形椅文,然后再經(jīng)過(guò)過(guò)一段時(shí)間再啟用喂很,那么你的剛體變成了真正的直男——嗯,只能前進(jìn)不能旋轉(zhuǎn)皆刺!如下代碼少辣,第二行會(huì)失效:

state.apply_central_impulse(force) # 線性沖量,有效芹橡。
state.apply_torque_impulse(torque) # 扭矩沖量毒坛,無(wú)效!
1
2
可以簡(jiǎn)單地通過(guò)下面的代碼重現(xiàn)這個(gè) Bug :

func _ready():
_changeState(states.INIT)
yield(self.get_tree().create_timer(3), 'timeout')
_changeState(states.ALIVE)

func _integrate_forces(state):
state.apply_central_impulse(force)
state.apply_torque_impulse(torque)
# 省略代碼……
1
2
3
4
5
6
7
8
9

不過(guò)這個(gè) Bug 在 Godot 3.2 開(kāi)發(fā)版本中已經(jīng)得到了修復(fù)林说,關(guān)于開(kāi)發(fā)版本的構(gòu)建可以到這里下載: Unofficial Godot Engine builds 煎殷,關(guān)于這個(gè) Bug 我也在官方 Github 上開(kāi)了一個(gè) issue ,傳送門(mén): https://github.com/godotengine/godot/issues/30551 腿箩。不管怎樣豪直,這個(gè) Bug 肯定會(huì)在下一個(gè)穩(wěn)定版本中修復(fù)的,大家放心吧珠移。

嗯弓乙,如果想測(cè)試本篇中的這個(gè)小游戲末融,我建議還是要下載 Godot 3.2 的開(kāi)發(fā)版進(jìn)行項(xiàng)目導(dǎo)入和測(cè)試。

三暇韧、總結(jié)

小游戲算是基本完成了勾习,由于一些不可避免的問(wèn)題,使得我這個(gè)無(wú)聊的游戲開(kāi)發(fā)了很長(zhǎng)一段時(shí)間懈玻,不管怎樣巧婶,希望大家對(duì) RigidBody2D 節(jié)點(diǎn)有一個(gè)新的認(rèn)識(shí)吧,而關(guān)于 RigidBody2D 剛體節(jié)點(diǎn)的一些其他應(yīng)用場(chǎng)景涂乌,我也打算會(huì)在后續(xù)文章中再做一個(gè)簡(jiǎn)單的介紹艺栈,大家有什么意見(jiàn)和建議歡迎留言哦!嘿嘿湾盒!

本篇的 Demo 以及相關(guān)代碼已經(jīng)上傳到 Github 湿右,地址: https://github.com/spkingr/Godot-Demos ,后續(xù)繼續(xù)更新罚勾,原創(chuàng)不易毅人,希望大家喜歡! ?

原文鏈接:https://blog.csdn.net/SpkingR/article/details/97044572

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荧库,一起剝皮案震驚了整個(gè)濱河市堰塌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌分衫,老刑警劉巖场刑,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚪战,居然都是意外死亡牵现,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)邀桑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞎疼,“玉大人,你說(shuō)我怎么就攤上這事壁畸≡艏保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵捏萍,是天一觀的道長(zhǎng)太抓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)令杈,這世上最難降的妖魔是什么走敌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮逗噩,結(jié)果婚禮上掉丽,老公的妹妹穿的比我還像新娘跌榔。我一直安慰自己,他們只是感情好捶障,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布僧须。 她就那樣靜靜地躺著,像睡著了一般项炼。 火紅的嫁衣襯著肌膚如雪皆辽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天芥挣,我揣著相機(jī)與錄音,去河邊找鬼耻台。 笑死空免,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盆耽。 我是一名探鬼主播蹋砚,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摄杂!你這毒婦竟也來(lái)了坝咐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤析恢,失蹤者是張志新(化名)和其女友劉穎墨坚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體映挂,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泽篮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柑船。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帽撑。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞍时,靈堂內(nèi)的尸體忽然破棺而出亏拉,到底是詐尸還是另有隱情,我是刑警寧澤逆巍,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布及塘,位于F島的核電站,受9級(jí)特大地震影響蒸苇,放射性物質(zhì)發(fā)生泄漏磷蛹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一溪烤、第九天 我趴在偏房一處隱蔽的房頂上張望味咳。 院中可真熱鬧庇勃,春花似錦、人聲如沸槽驶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掂铐。三九已至罕拂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間全陨,已是汗流浹背爆班。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辱姨,地道東北人柿菩。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像雨涛,于是被迫代替她去往敵國(guó)和親枢舶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361