iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
SideProject30

初探 Godot系列 第 27

[DAY 27] 優化 (clamp, Fonts)

  • 分享至 

  • xImage
  •  

今日目標:優化


▍事前準備

目前整體遊戲架構接近完整了,接著開始做一些遊戲優化,讓整個遊戲體驗更流暢。

  • 介紹 clamp

    Variant clamp(value: Variant, min: Variant, max: Variant)

    Clamps the value, returning a Variant not less than min and not more than max. Any values that can be compared with the less than and greater than operators will work.

      這個方法可以幫我們限制住數值保持在設定的最小值及最大值之間。
    

▍出發

  • 現在我們的角色是會不小心移動到畫面外,為了避免這個狀況我們現在來限制角色能移動的範圍。
    1. 宣告我們的碰撞框向量,以及與中心的位移:透過除 2 的方式獲得。
    var player_size:Vector2
    var player_offset_x
    var player_offset_y
    
    func _ready():
        # ...
        player_size = $CollisionShape2D.shape.size
        player_offset_x = player_size.x/2
        player_offset_y = player_size.y/2
    
    https://ithelp.ithome.com.tw/upload/images/20231012/20162875g70CJDgLcs.png
    紅色:player_size.x
    藍色:player_size.y
    紫色:player.position 能移動到的邊界。
    粉紅:player_offset_x
    水藍:player_offset_y
    
    1. 接著就可以更新我們移動的邏輯,建立一個計算的方法。
    func update_pos(player):
        # 先取得原始位移後位置。
        var pos = player.position + direction*speed
        # 限制 x 軸最小只能到角色的一半寬,最大只能到畫面寬減去角色一半寬。
        pos.x = clamp(pos.x, player_offset_x, get_viewport_rect().size.x - player_offset_x)
        # 限制 y 軸最小只能到角色的一半高,最大只能到畫面寬減去角色一半。
        pos.y = clamp(pos.y, player_offset_y, get_viewport_rect().size.y - player_offset_y)
        # 正式更新位置。
        player.position = pos
    
    1. 最後將方法寫到 process 中。
    func _process(delta):
        match game_state:
            GAME_STATE.START:
                if dragged:
                    update_pos(player)
                handle_player_state()
    
  • 現在我們來嘗試修改字體,這次使用開源的繁中字體 芫荽 / iansui 字體示範。
    1. 到開源字體的 github 頁面,在右邊的 release 中選擇 zip 檔案下載。
      https://ithelp.ithome.com.tw/upload/images/20231012/20162875DbMRweqGKj.png
    2. 解壓縮後取得 .tff 檔,將檔案放到 fonts 資料夾中。
    3. 回到我們 HUD 場景中選擇 labelbutton 節點,在右邊屬性面板中 ThemeOverridesFonts 點擊下拉選單選擇載入,選擇我們的字體檔案。
      https://ithelp.ithome.com.tw/upload/images/20231012/20162875DzutCGBLMp.png

▍執行

Yes

▍完成

角色檔案修改及新增的整合

extends CharacterBody2D

# ...

# player shape
var player_size:Vector2
var player_offset_x
var player_offset_y

# Called when the node enters the scene tree for the first time.
func _ready():
	# ...

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	match game_state:
		GAME_STATE.START:
			if dragged:
				update_pos(player)
			handle_player_state()

func _input(event):
	# ...
func handle_player_state():
	# ...
    
# handle state
func handle_invincible_state():
	# ...
func _on_invincible_timeout():
	# ...
func handle_slow_state():
	# ...
func _on_slow_timeout():
	# ...
func handle_stop_state():
	# ...
func _on_stop_timeout():
	# ...
func handle_end_state():
	# ...
func set_shader_para( mode: int, color: Vector4 =Vector4.ZERO, speed: float = 0):
	# ...
	
# game state
func start():
	# ...
func stop():
	# ...
func end():
	# ...
	
# player move logic
func update_pos(player):
	var pos = player.position + direction*speed
	pos.x = clamp(pos.x, player_offset_x, get_viewport_rect().size.x - player_offset_x)
	pos.y = clamp(pos.y, player_offset_y, get_viewport_rect().size.y - player_offset_y)
	player.position = pos

:)


上一篇
[DAY 26] 分數設置 (get_ticks_msec)
下一篇
[DAY 28] 暫停功能
系列文
初探 Godot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言