前言
上一回我們做好了敵人主體。
這次我們要來完成敵人最後的零件(子彈),讓它可以攻擊我們。
內容上跟之前飛船的子彈很類似,也可以自己先挑戰看看。
重點在於 ShootTimer 計時到的時候,發射子彈。
開始之前還是讓我再稍微宣傳一下。
Godot 開拓者交流互助公會 無論是新手還是有經驗的 Godot 使用者,都歡迎你的參與。
因為我這個菜鳥也需要老手幫忙。
子彈
跟飛船子彈一樣,我們會用到的 Node 有這些。
Sprite2D 我使用的 Texture 是 Enemy_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 和分數的計算。