@export var to_be_created:PackedScene
var godot:Node
func _ready():
godot = to_be_created.instantiate()
add_child(godot)
首先先定義一下這次和 Day3 的差別:
這次要達到的目標是能讓物件左轉及右轉,像車子移動的感覺。
# 透過 rotation 可以取得到物件的弧度值
# 透過更改此值旋轉:正為順時針旋轉、負值為逆時針旋轉
godot.rotation += 0.1
func _process(delta):
if Input.is_action_pressed("click_left"):
godot.rotation -= 0.1
if Input.is_action_pressed("click_right"):
godot.rotation += 0.1
現在可以在播放時測試左右旋轉的狀態。
這邊如果直接使用 Day3 的方法(如下)會沒辦法離開 y 軸,因為 position 取得的是畫面的 y 軸而不是物件旋轉後的前後方。
# 錯誤寫法
if Input.is_action_pressed("click_up"):
godot.y -= 1
if Input.is_action_pressed("click_down"):
godot.y += 1
# 因為我們希望前進的方向初始時是物件的上方因此設置為 Vector2.UP
var rotated_vector:Vector2 = Vector2.UP
接著我們需要在旋轉物件時同時旋轉我們的向量,這邊要介紹一個新的 Vector2 方法。
Vector2 rotated(angle: float) const
Returns the result of rotating this vector by angle (in radians). See also @GlobalScope.deg_to_rad().
這個方法讓我們可以透過設定 angle 取得旋轉 angle 弧度後的向量。
func _process(delta):
if Input.is_action_pressed("click_left"):
godot.rotation -= 0.1
# 新增此行
rotated_vector = rotated_vector.rotated(-0.1)
if Input.is_action_pressed("click_right"):
godot.rotation += 0.1
# 新增此行
rotated_vector = rotated_vector.rotated(0.1)
if Input.is_action_pressed("click_up"):
# 將現在位置加上朝前的向量前進
godot.position += rotated_vector
if Input.is_action_pressed("click_down"):
# 將現在位置減去朝前的向量後退
godot.position -= rotated_vector
現在播放便能完整的操作選轉了!
目前的程式碼:
extends Node
@export var to_be_created:PackedScene
var godot:Node
var rotated_vector:Vector2 = Vector2.UP
# Called when the node enters the scene tree for the first time.
func _ready():
godot = to_be_created.instantiate()
add_child(godot)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Input.is_action_pressed("click_left"):
godot.rotation -= 0.1
rotated_vector = rotated_vector.rotated(-0.1)
if Input.is_action_pressed("click_right"):
godot.rotation += 0.1
rotated_vector = rotated_vector.rotated(0.1)
if Input.is_action_pressed("click_up"):
godot.position += rotated_vector
if Input.is_action_pressed("click_down"):
godot.position -= rotated_vector
extends Node
@export var to_be_created:PackedScene
# 新增速度變數方便隨時調整
@export var speed:float = 10
# 新增選轉弧度變數方便隨時調整
@export var rotate_radians:float = 0.1
var godot:Node
var rotated_vector:Vector2 = Vector2.UP
# Called when the node enters the scene tree for the first time.
func _ready():
godot = to_be_created.instantiate()
add_child(godot)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Input.is_action_pressed("click_left"):
# 用變數取代數值
godot.rotation -= rotate_radians
rotated_vector = rotated_vector.rotated(-rotate_radians)
if Input.is_action_pressed("click_right"):
# 用變數取代數值
godot.rotation += rotate_radians
rotated_vector = rotated_vector.rotated(rotate_radians)
if Input.is_action_pressed("click_up"):
# 增加速度
godot.position += rotated_vector * speed
if Input.is_action_pressed("click_down"):
# 增加速度
godot.position -= rotated_vector * speed
:)