ETH官方钱包

前往
大廳
主題 達人專欄

【Godot 教學】製作你的第一個 2D 遊戲:敵人子彈- EP8

Muryan | 2023-10-22 20:00:05 | 巴幣 2002 | 人氣 523

前言


上一回我們做好了敵人主體。
這次我們要來完成敵人最後的零件(子彈),讓它可以攻擊我們。
內容上跟之前飛船的子彈很類似,也可以自己先挑戰看看。
重點在於 ShootTimer 計時到的時候,發射子彈。


開始之前還是讓我再稍微宣傳一下。
Godot 開拓者交流互助公會 無論是新手還是有經驗的 Godot 使用者,都歡迎你的參與。
因為我這個菜鳥也需要老手幫忙。

開拓者交流互助公會




子彈


跟飛船子彈一樣,我們會用到的 Node 有這些。


Sprite2D 我使用的 TextureEnemy_projectile (16 x 16).png


CollisionShape2D 很直覺就是使用 CircleShape2D


VisibleOnScreenNotifier2D 不需要額外調整設定。
最後子彈外觀完成的樣子。


完成了 Node 部分,再來我們要新增子彈的腳本。
因為比較簡單我先給全部的程式碼。

extends Area2D

@export var speed = 150


func start(pos: Vector2) -> void:
    position = pos


func _process(delta: float) -> void:
    position.y += speed * delta


func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
    queue_free()


func _on_area_entered(area: Area2D) -> void:
    if area.name == "Player":
        queue_free()

基本上看了都能理解在做什麼。
要注意的是最後兩個 func 有連接 signal



到這裡子彈本體完成了,接著要讓敵人開始發射子彈了。



發射子彈


接著我們回到敵人的腳本。
先新增變數,讓它載入子彈。

...
var speed = 0
var bullet_scene = preload("res://scenes/enemy_bullet/enemy_bullet.tscn")

...

上回我們是不是有先留了一個空的 func shoot()。
這時候我們就要用上它了。

func shoot() -> void:
    var bullet_scene_instance = bullet_scene.instantiate()
    get_tree().root.add_child(bullet_scene_instance)
    bullet_scene_instance.start(position)
    shoot_timer.wait_time = randf_range(4, 20)
    shoot_timer.start()

簡單解釋這段程式碼的意思。
前半是我們要把子彈加到遊戲裡,
後半則是重新決定下次發射的等待時間,然後開始計時。


影片內容更正

可以把 shoot() 裡面最後兩行程式碼刪掉。
讓 shoot() 的功能更單純,只管子彈的部分。

因為我們原本就有在計時器時間到的時候,重設計時器。
所以遊戲本身不會受影響。

func _on_shoot_timer_timeout() -> void:
    shoot()
    reset_shoot_timer()

不如說上次不小心兩邊都加了計時器重置,
所以這兩邊本來就有其中一邊需要刪掉,否則會重複計時。



做到這裡已經很有遊戲的樣子了(?


製作進入尾聲,下回我們要來完成 UI 和分數的計算。

當然最後我還是要再次宣傳我們的公會。

開拓者交流互助公會

創作回應

微笑的貘
請問一下,signal是gdscript獨有的功能嗎?
他的作用類似觀察者模式嗎?
2023-10-23 09:27:44
Muryan
signal是Godot的功能,但沒有限定GDScript才能用。
作用類似沒錯。同樣的功能,以Unity來說就類似於Event。
2023-10-23 12:58:14
追蹤 創作集

作者相關創作

相關創作

更多創作