ETH官方钱包

前往
大廳
主題 達人專欄

【Godot 教學】製作你的第一個 2D 遊戲:發射子彈- EP6

Muryan | 2023-10-09 19:00:02 | 巴幣 2102 | 人氣 614

前言


上一回內容基本上都是放在影片裡。
那我觀察到實際會去點開影片看的人並不多。
所以我覺得文章可以再做調整。

保留一些文字內容,完整操作過程放在影片。
如果只看一邊,也能有一定了解。



開拓者交流互助公會







上一回我們做好了子彈。
簡單回顧子彈的內容有什麼。
我們讓子彈會往前跑,碰到敵人讓它爆炸,然後刪掉自己。
跑到畫面外,也會刪掉自己。

這一回就要讓飛船可以「發射」子彈。
首先打開 PlayerScript
增加幾個變數。

@onready var gun_cooldown_timer: Timer = $GunCooldownTimer

@export var cooldown = 0.25
@export var bullet_scene: PackedScene

var can_shoot = true

接著跟子彈一樣設置 start(),然後放在 _ready()
確保遊戲開始時,飛船在初始位置。

func _ready() -> void:
   
start()

func start() -> void:
    position = Vector2(screensize.x / 2, screensize.y - 64)
    gun_cooldown_timer.wait_time = cooldown

然後我們新增 shoot()

func shoot() -> void:
    if not can_shoot:
        return
    can_shoot = false
    gun_cooldown_timer.start()
    var bullet_scene_instance = bullet_scene.instantiate()
    get_tree().root.add_child(bullet_scene_instance)
    bullet_scene_instance.start(position + Vector2(0, -8))

如果 can_shootfalse,會 return 不執行後面的動作。
如果是 true 會把 can_shoot 設為 false,開始冷卻時間的計時。
接著我們把子彈實際加到遊戲裡。
然後讓它出現的位置是在飛船上方。

下一個部分我們在 position.clamp() 底下加入兩行。
當我們按下設好的 shoot 鍵,會執行 shoot()

func _process(delta) -> void:
    ...
    ...
    position = position.clamp((ship_size / 2), screensize - (ship_size / 2))

    if Input.is_action_pressed("shoot"):
        shoot()


最後按照前面連接 Signal 的方式。


連接 timeout() 後,在出現的 func 裡簡單加上這行。

func _on_gun_cooldown_timer_timeout() -> void:
    can_shoot = true

冷卻計時器時間到,可以發射子彈。
我們就完成了程式部分。

最後一步記得我們前面設的 bullet_scene 變數。
記得把 子彈 Scene 拖過去。
不然執行的時候,會出現錯誤。


都做完可以執行看看,飛船能發射子彈了。




這回飛船可以發射子彈了。
下一回我們要做的是遊戲背景和敵人。

文字和影片都有,大家可以選擇比較習慣的方式觀看。
有任何錯誤或是建議,歡迎在底下留言。


開拓者交流互助公會


創作回應

追蹤 創作集

作者相關創作

相關創作

更多創作