iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
SideProject30

初探 Godot系列 第 3

[DAY 3] 移動 (position, Vector2)

  • 分享至 

  • xImage
  •  

今日目標:移動物件


事前準備(詳細作法如 Day2)

  1. 像昨天一樣建立一個 Sprite2D 節點,並將 icon 放到屬性面板,儲存成一個 scene。
  2. 建立一個新場景建立一個 Node 節點,儲存成 main 場景。
  3. 在 main 場景的 Node 節點上附加腳本
  4. 專案 -> 專案設定 -> 輸入映射,將上下左右鍵各自綁定到:“click_up”、“click_down”、“click_left”、“click_right”
    https://ithelp.ithome.com.tw/upload/images/20230918/20162875n5UJya02dt.png

出發

直接進入正題 coding 的環節

  • 首先暴露出 PackedScene 到屬性面板,儲存後將 icon 的 scene 放到 main scene node上腳本的屬性面板
@export var to_be_created:PackedScene
  • 這次我們在 ready 時(Node 進入 Scene 時會執行一次)直接生成([DAY 2])我們的物件
func _ready():
	godot = to_be_created.instantiate()
	add_child(godot)
  • 接著在 process 中(每個 frame 會執行一次)定義我們的變化量並初始化成 0
    Vector2 是一個具有兩個屬性的類別: x 和 y ,對應的就是在 2d 場景中的座標位置
var transform_position = Vector2.ZERO
  • 監聽我們的四個按鈕,以「上」為例:
	if Input.is_action_pressed("click_up"):
        # 觸發後要執行的邏輯
  • 觸發後我們要將剛剛定義的變化量在 y 軸減一
    (根據 2D 的頁面可以看到座標軸是 x 往右為正, y 往下為正)
	if Input.is_action_pressed("click_up"):
		transform_position.y -= 1
  • 最後再將這個變化量附加到原始位置上
    godot.position += transform_position

此時播放後即可透過方向鍵讓物件向上移動

  • 我們再將其他方向也更新
	if Input.is_action_pressed("click_down"):
		transform_position.y += 1
	if Input.is_action_pressed("click_left"):
		transform_position.x -= 1
	if Input.is_action_pressed("click_right"):
		transform_position.x += 1

完成! 現在可以透過方向鍵自由移動我們的 godot icon

最後小優化

以上面的方法來操作當我們同時按住了兩軸的,例如上和右這時會一次性的移動根號2的單位距離(上1、右1),要改善這個問題的話我們使用正規化的方式來統一一次能移動的距離。

	if transform_position.length() > 0:
        # t_p = t_p/t_p.length()
		transform_position = transform_position.normalized()

最後的最後如果想要移動快一點,我們再暴露一個 speed 變數來放大一次移動的距離

# 前面新增變數
@export var speed:float=1
# process 更新
	if transform_position.length() > 0:
		transform_position = transform_position.normalized() * speed

現在可以透過腳本的屬性面板調整 speed 變數改變移動距離

執行

Yes

完成!

完整檔案

extends Node

@export var to_be_created:PackedScene
@export var speed:float=1
var godot:Node
# 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):
	var transform_position = Vector2.ZERO
	if Input.is_action_pressed("click_up"):
		transform_position.y -= 1
	if Input.is_action_pressed("click_down"):
		transform_position.y += 1
	if Input.is_action_pressed("click_left"):
		transform_position.x -= 1
	if Input.is_action_pressed("click_right"):
		transform_position.x += 1
		
	if transform_position.length() > 0:
		transform_position = transform_position.normalized() * speed
	godot.position += transform_position

:)


上一篇
[DAY 2] 生成 (add_child)
下一篇
[DAY 4] 移動 (move_toward, lerp)
系列文
初探 Godot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言