iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
SideProject30

初探 Godot系列 第 7

[DAY 7] 放大縮小 (scale)

  • 分享至 

  • xImage
  •  

今日目標:放大縮小物件


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

  1. 建立 main 場景和一個 Sprite2D (godot_icon) 場景。
  2. 將上下鍵綁定到 “click_up”、“click_down”。
  3. 在 main 場景的 Node 節點上附加腳本。
@export var to_be_created:PackedScene

var godot:Node

func _ready():
	godot = to_be_created.instantiate()
    # 將位置移動到畫面中央方便觀察
	godot.position = get_viewport().size / 2
	add_child(godot)

出發

  • 介紹比例(scale)
    Vector2 scale [預設: Vector2(1, 1)]

    set_scale(數值) setter
    get_scale() getter

    The node's scale. Unscaled value: (1, 1).

    透過設置這個屬性可以改變物件的比例,當值為負數時會產生反轉的效果。

  • 接著直接在 process 中加入點擊上鍵時增加、點擊下鍵時減少的邏輯。

    func _process(delta):
        if Input.is_action_pressed("click_up"):
            godot.scale += Vector2(0.1, 0.1)
        if Input.is_action_pressed("click_down"):
            godot.scale -= Vector2(0.1, 0.1)
    

執行

Yes

完成!

完整檔案

extends Node

@export var to_be_created:PackedScene
var godot

# Called when the node enters the scene tree for the first time.
func _ready():
	godot = to_be_created.instantiate()
	godot.position = get_viewport().size / 2
	add_child(godot)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	if Input.is_action_pressed("click_up"):
		godot.scale += Vector2(0.1, 0.1)
	if Input.is_action_pressed("click_down"):
		godot.scale -= Vector2(0.1, 0.1)

延伸

現在我們可以試著將昨天Timer 加入,做出自動縮放的效果。

回到我們的事前準備狀態,重新開始。

  • 我們使用在 Day4 介紹過的方法:lerp 來做這次縮放的變化。

    先在最前面宣告一個變化目標以及暴露出變化權重。

    var target = Vector2(5, 5)
    @export var weight = 0.05
    

    接著在 process 中增加我們的變化邏輯並使用剛剛宣告的變數作為目標。

    func _process(delta):
        godot.scale = godot.scale.lerp(target, weight)
    

    這時候播放就會得到放大的效果。

  • 接著我們定義一個方法來讓 Timer 定時改變我們的目標。
    首先在前面宣告一個布林值作為是否放大的判斷。

    var is_scale_up = true
    

    接著新增 timeout 要觸發的方法。

    func _on_scale_timeout():
        # 如果原本是放大則改成縮小,反之亦然。
        is_scale_up = !is_scale_up
        if is_scale_up:
            target = Vector2(5, 5)
        else:
            target = Vector2(1, 1)
    
  • 新增完成後,可以設定我們的 Timer 了。
    因為這次的物件只會有一個並且是在 ready 時產生,因此 Timer 也同樣在直接寫在 ready 中,這次並沒有設定 one_hit 參數而是直接使用預設值結束時重新開始計時,達到重複縮放的效果。

        var timer = Timer.new()
        timer.wait_time = 1
        timer.timeout.connect(_on_scale_timeout)
        godot.add_child(timer)
        timer.start()
    

    這樣一來每次倒數結束就可以觸發更改目標的函數。

執行

Yes

完成!

完整檔案

extends Node

@export var to_be_created:PackedScene
@export var weight = 0.05
var godot
var target = Vector2(5, 5)
var is_scale_up = true

# Called when the node enters the scene tree for the first time.
func _ready():
	godot = to_be_created.instantiate()
	godot.position = get_viewport().size / 2
	add_child(godot)
	
	var timer = Timer.new()
	timer.wait_time = 1
	timer.timeout.connect(_on_scale_timeout)
	godot.add_child(timer)
	timer.start()
	
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	godot.scale = godot.scale.lerp(target, weight)

func _on_scale_timeout():
	is_scale_up = !is_scale_up
	if is_scale_up:
		target = Vector2(5, 5)
	else:
		target = Vector2(1, 1)

:)


上一篇
[DAY 6] 自動消滅 (Timer)
下一篇
[DAY 8] 接觸 Part.1 (CharacterBody2D, CollisionShape2D)
系列文
初探 Godot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言