完成
你已經(jīng)創(chuàng)造了一個(gè)有效可玩的游戲,但它仍然可以讓你感覺更刺激一些掂咒。游戲開發(fā)者使用術(shù)語(yǔ)juicy來(lái)描述讓游戲感覺良好的東西。juicy可以包括聲音,視覺效果或任何其他添加物民珍,增加玩家的樂趣襟士,而不必改變游戲的本質(zhì)。
在本節(jié)中嚷量,你將添加一些小的juicy且有趣的功能來(lái)完成游戲陋桂。
視覺效果
當(dāng)你拿起硬幣時(shí),它們就會(huì)消失蝶溶,這不是很吸引人嗜历。添加視覺效果將使收集大量硬幣時(shí)更加令人滿足。
首先將Tween節(jié)點(diǎn)添加到Coin場(chǎng)景抖所。
什么是tween?
tween(補(bǔ)間)是一種使用特定函數(shù)隨時(shí)間(從起始值到結(jié)束值)內(nèi)插入(逐漸改變)某個(gè)值的方法梨州。例如,您可以選擇一個(gè)穩(wěn)定更改值的函數(shù)田轧,或者一個(gè)開始緩慢但速度加快的函數(shù)暴匠。補(bǔ)間有時(shí)也稱為easing(緩沖)。
在Godot中使用Tween節(jié)點(diǎn)時(shí)傻粘,可以指定它來(lái)更改節(jié)點(diǎn)的一個(gè)或多個(gè)屬性每窖。在這種情況下,你將增加硬幣的圖形比例弦悉,并使用Modulate屬性使其產(chǎn)生淡出效果窒典。
將此行添加到Coin的_ready()
函數(shù):
$Tween.interpolate_property($AnimatedSprite, 'scale',
$AnimatedSprite.scale,
$AnimatedSprite.scale * 3, 0.3,
Tween.TRANS_QUAD,
Tween.EASE_IN_OUT)
interpolate_property()
函數(shù)使Tween更改節(jié)點(diǎn)的屬性。有七個(gè)參數(shù):
- 要影響的節(jié)點(diǎn)
- 要改變的屬性
- 該屬性的初始值
- 該屬性的結(jié)束值
- 持續(xù)時(shí)間(以秒為單位)
- 使用的功能
- 方向
當(dāng)玩家拿起硬幣時(shí)警绩,補(bǔ)間應(yīng)該開始播放崇败。替換pickup()
函數(shù)中的queue_free()
:
func pickup():
monitoring = false
$Tween.start()
將monitoring設(shè)置為false可確保在補(bǔ)間動(dòng)畫期間玩家觸摸硬幣時(shí)不會(huì)發(fā)出area_enter()
信號(hào)。
最后肩祥,當(dāng)動(dòng)畫結(jié)束時(shí)應(yīng)刪除硬幣后室,因此連接Tween節(jié)點(diǎn)的tween_completed()
信號(hào):
func _on_Tween_tween_completed(object, key):
queue_free()
現(xiàn)在,當(dāng)你運(yùn)行游戲時(shí)混狠,你應(yīng)該看到硬幣在被拿起時(shí)變大了岸霹。這很好,但是當(dāng)同時(shí)應(yīng)用于多個(gè)屬性時(shí)将饺,補(bǔ)間會(huì)更有效贡避。您可以添加另一個(gè)interpolate_property()
,這次更改精靈的不透明度予弧。這是通過(guò)更改modulate屬性(一個(gè)Color對(duì)象)并將其alpha通道從1(不透明)更改為0(透明)來(lái)完成的刮吧。請(qǐng)參閱以下代碼:
$Tween.interpolate_property($AnimatedSprite, 'modulate',
Color(1, 1, 1, 1),
Color(1, 1, 1, 0), 0.3,
Tween.TRANS_QUAD,
Tween.EASE_IN_OUT)
文檔
tween
聲音
聲音是最重要但經(jīng)常被忽視的游戲設(shè)計(jì)之一。良好的聲音設(shè)計(jì)可以為您的游戲增加大量的 juice掖蛤,只需很少的付出杀捻。聲音可以給予玩家反饋,將他們情感連接到角色蚓庭,甚至成為游戲玩法的一部分致讥。
對(duì)于這個(gè)游戲仅仆,你將添加三個(gè)聲音效果。在Main場(chǎng)景中垢袱,添加三個(gè)AudioStreamPlayer節(jié)點(diǎn)墓拜,并將它們命名為CoinSound,LevelSound和EndSound请契。將每個(gè)聲音從audio文件夾(您可以在FileSystem中的資源下找到)拖動(dòng)到每個(gè)節(jié)點(diǎn)的相應(yīng)Stream屬性中咳榜。
要播放聲音,請(qǐng)調(diào)用play()
函數(shù)姚糊。將$CoinSound.play()
添加到_on_Player_pickup()
函數(shù)贿衍,將$EndSound.play()
添加到game_over()
函數(shù),將$LevelSound.play()
添加到spawn_coins()`函數(shù)救恨。
能力提升 - 道具
新場(chǎng)景將與您已創(chuàng)建的Coin場(chǎng)景非常相似贸辈,因此請(qǐng)單擊您的Coin場(chǎng)景并選擇Scene | Save Scene As將其另存為Powerup.tscn。將根節(jié)點(diǎn)的名稱更改為Powerup肠槽,然后單擊清除腳本按鈕刪除腳本(下方截圖)擎淤。在Groups選項(xiàng)卡中,通過(guò)單擊刪除按鈕(它看起來(lái)像垃圾桶)刪除硬幣組秸仙,然后將其添加到名為powerups的新組中嘴拢。
在AnimatedSprite中,將圖像從硬幣更改為powerup寂纪,您可以在res://assets/pow/文件夾中找到該圖像席吴。
單擊以添加新腳本并從Coin.gd腳本中復(fù)制代碼。連接area_entered信號(hào)捞蛋。請(qǐng)記住孝冒,此功能名稱將由信號(hào)連接窗口自動(dòng)選擇。
接下來(lái)拟杉,添加名為Lifetime的Timer節(jié)點(diǎn)庄涡。這將限制對(duì)象保留在屏幕上的時(shí)間。將Wait time設(shè)置為2搬设,將One Shot和Autostart都設(shè)置為On穴店。連接其超時(shí)信號(hào),以便在該時(shí)間段結(jié)束時(shí)將其刪除:
func _on_Lifetime_timeout():
queue_free()
現(xiàn)在拿穴,轉(zhuǎn)到Main場(chǎng)景并添加另一個(gè)名為PowerupTimer的Timer節(jié)點(diǎn)泣洞。將其One Shot屬性設(shè)置為On。您可以使用另一個(gè)AudioStreamPlayer添加音頻文件夾中的Powerup.wav聲音默色。
連接timeout()
信號(hào)并添加以下代碼以生成Powerup:
func _on_PowerupTimer_timeout():
var p = Powerup.instance()
add_child(p)
p.screensize = screensize
p.position = Vector2(rand_range(0, screensize.x),
rand_range(0, screensize.y))
需要通過(guò)添加變量來(lái)鏈接Powerup場(chǎng)景斜棚,然后將場(chǎng)景拖動(dòng)到Inspector中的屬性中,就像之前使用Coin場(chǎng)景一樣:
export (PackedScene) var Powerup
道具的出現(xiàn)應(yīng)該是不可預(yù)測(cè)的该窗,因此每當(dāng)您開始新的關(guān)卡時(shí)弟蚀,都需要設(shè)置PowerupTimer的等待時(shí)間。使用spawn_coins()
生成新硬幣后酗失,將其添加到_proces()
函數(shù):
$PowerupTimer.wait_time = rand_range(5, 10)
$PowerupTimer.start()
現(xiàn)在你的道具出現(xiàn)了义钉,最后一步是在收集一個(gè)道具時(shí)給玩家一些獎(jiǎng)勵(lì)時(shí)間。目前规肴,玩家腳本假設(shè)它遇到的任何東西都是硬幣或障礙物捶闸。更改Player.gd中的代碼以檢查已擊中的對(duì)象類型:
func _on_Player_area_entered( area ):
if area.is_in_group("coins"):
area.pickup()
emit_signal("pickup", "coin")
if area.is_in_group("powerups"):
area.pickup()
emit_signal("pickup", "powerup")
if area.is_in_group("obstacles"):
emit_signal("hurt")
die()
請(qǐng)注意,現(xiàn)在你使用命名對(duì)象類型的附加參數(shù)發(fā)出拾取信號(hào)⊥先校現(xiàn)在可以更改Main.gd中的相應(yīng)函數(shù)以接受該參數(shù)并使用match語(yǔ)句來(lái)決定要采取的操作:
func _on_Player_pickup(type):
match type:
"coin":
score += 1
$CoinSound.play()
$HUD.update_score(score)
"powerup":
time_left += 5
$PowerupSound.play()
$HUD.update_timer(time_left)
match語(yǔ)句是if語(yǔ)句的有用替代語(yǔ)句删壮,尤其是當(dāng)您有大量可能的值要測(cè)試時(shí)。
嘗試運(yùn)行游戲并收集道具兑牡。確保聲音播放央碟,計(jì)時(shí)器時(shí)間增加了五秒鐘。
硬幣動(dòng)畫
當(dāng)你創(chuàng)建Coin場(chǎng)景時(shí)均函,曾添加了一個(gè)AnimatedSprite亿虽,硬幣動(dòng)畫顯示出光穿過(guò)硬幣表面的shimmer(閃爍)效果。如果所有硬幣同時(shí)顯示苞也,它看起來(lái)太有規(guī)律洛勉,因此每個(gè)硬幣在動(dòng)畫中需要一個(gè)小的隨機(jī)延遲。
首先如迟,單擊AnimatedSprite收毫,然后單擊Frames資源。確保將Loop設(shè)置為Off并將Speed設(shè)置為12*殷勘。
將Timer節(jié)點(diǎn)添加到Coin場(chǎng)景此再,并將此代碼添加到_ready()
:
$Timer.wait_time = rand_range(3, 8)
$Timer.start()
現(xiàn)在,連接Timer的timeout()信號(hào)并添加:
func _on_Timer_timeout():
$AnimatedSprite.frame = 0
$AnimatedSprite.play()
嘗試運(yùn)行游戲并觀察硬幣動(dòng)畫劳吠。只需很少的改動(dòng)就可以獲得很好的視覺效果引润。在專業(yè)游戲中你會(huì)注意到很多這樣的效果。雖然非常微妙痒玩,但視覺吸引力使得體驗(yàn)更加愉悅淳附。
前面的Powerup對(duì)象具有類似的動(dòng)畫,您可以以相同的方式添加蠢古。
障礙
最后奴曙,通過(guò)引入玩家必須避免的障礙,可以使游戲更具挑戰(zhàn)性草讶。碰觸到障礙將結(jié)束游戲洽糟。
為仙人掌創(chuàng)建一個(gè)新場(chǎng)景并添加以下節(jié)點(diǎn):
- Area2D (命名為Cactus)
- Sprite
- CollisionShape2D
將仙人掌紋理從FileSystem側(cè)邊欄拖動(dòng)到Sprite的Texture屬性。將RectangleShape2D添加到碰撞形狀并調(diào)整其大小,使其覆蓋圖像坤溃。還記得你在Palyer腳本中添加了area.is_in_group("obstacles")嗎拍霜?使用Node選項(xiàng)卡(Inspector旁邊)將Cactus主體添加到 obstacles組。
現(xiàn)在薪介,將Cactus實(shí)例添加到Main場(chǎng)景并將其移動(dòng)到屏幕上半部分的位置(遠(yuǎn)離Play產(chǎn)生的位置)祠饺。玩游戲,看看當(dāng)你遇到仙人掌時(shí)會(huì)發(fā)生什么汁政。
您可能已經(jīng)發(fā)現(xiàn)了一個(gè)問(wèn)題:硬幣會(huì)在仙人掌后面產(chǎn)生道偷,使它們無(wú)法拾取。放置硬幣時(shí)记劈,如果檢測(cè)到硬幣與障礙物重疊勺鸦,則需要移動(dòng)硬幣。連接硬幣的area_entered()信號(hào)并添加以下內(nèi)容:
func _on_Coin_area_entered( area ):
if area.is_in_group("obstacles"):
position = Vector2(rand_range(0, screensize.x), rand_range(0, screensize.y))
如果您添加了前面的Powerup對(duì)象目木,則需要對(duì)其area_entered信號(hào)執(zhí)行相同操作换途。