十分鐘制作橫版動(dòng)作游戲|Godot 4 教程《勇者傳說》#0

《勇者傳說?#0》教程筆記
設(shè)置窗口:
像素風(fēng)設(shè)置:
1、項(xiàng)目設(shè)置 =》打開高級設(shè)置 =》 顯示 =》 窗口


場景:
- 新建2D場景并重命名為World
- 添加一個(gè)子節(jié)點(diǎn)TileMap
- 在TileMap右側(cè)檢查器中Tile Set屬性中選擇新建TileSet
- 點(diǎn)擊TileSet,展開Physics Layer,點(diǎn)擊添加元素
- 切換到底部的TileSet面板
- 把事先準(zhǔn)備好的素材圖片拖入圖塊,彈窗選擇否(是否在不透明紋理區(qū)創(chuàng)建)
- 在基礎(chǔ)圖塊中選擇自己想要使用的圖塊
- 切換到繪制選項(xiàng),選擇物理層0,對圖塊涂抹,即可設(shè)置好碰撞區(qū)域

9.切換到下方的TileMap面板,選擇圖塊進(jìn)行繪制
- 左鍵繪制
- 右鍵刪除
- 安裝shift是畫直線
- 按住crtl+shift是畫矩形
10.保存當(dāng)前場景
11.選擇其他節(jié)點(diǎn)新建場景
12.新建節(jié)點(diǎn)CharacterBody2D,改名為Player,添加子節(jié)點(diǎn)Sprite2D(用來顯示圖像)
13.將事先準(zhǔn)備好的玩家動(dòng)畫圖片拖入Sprite2D,圖片放大后默認(rèn)比較模糊
14.在項(xiàng)目=》項(xiàng)目設(shè)置=》渲染=》紋理=》默認(rèn)紋理過濾 改為 Nearest

15.在右側(cè)Region中勾選Enable,點(diǎn)擊編輯區(qū)域,吸附模式修改為柵格吸附,步長設(shè)置為56*56像素,圈起第一行的6幀動(dòng)畫
16.在右側(cè)Animation中,修改Hframes(水平幀數(shù))為6

17.調(diào)整角色最下中點(diǎn)到原點(diǎn)
18.在根節(jié)點(diǎn)下添加CollisionShape2D節(jié)點(diǎn),定義碰撞形狀,在右側(cè)Shape屬性中新建RectangleSharp2D,并調(diào)整大概位置覆蓋角色主體
19.添加AnimationPlayer節(jié)點(diǎn),用來定義動(dòng)畫,新建動(dòng)畫命名為idle

20.設(shè)置總長度為0.6秒,打開循環(huán)
21.切換到Sprite2D節(jié)點(diǎn),點(diǎn)擊右側(cè)Region的Rect屬性右側(cè)的鑰匙符號添加關(guān)鍵幀,點(diǎn)擊Hframes添加關(guān)鍵幀,F(xiàn)rame添加關(guān)鍵幀,因?yàn)橛?幀動(dòng)畫,所以要添加6個(gè)Frame關(guān)鍵幀

22.按照上面的做法再添加running動(dòng)畫

23.再制作jump動(dòng)畫

24.保存當(dāng)前場景
25.在Player場景的根節(jié)點(diǎn)添加腳本控制角色的行為

26.編寫腳本
extends CharacterBody2D # 獲取引擎給的重力加速度 var gravty := ProjectSettings.get("physics/2d/default_gravity") as float func _physics_process(delta: float) -> void: velocity.y += gravty * delta move_and_slide()
27.在World場景的根節(jié)點(diǎn)實(shí)例化角色


28. 在項(xiàng)目=》項(xiàng)目設(shè)置=》輸入映射添加3個(gè)按鍵
- move_left(A)
- move_right(D)
- jump(空格)

29. 完整腳本
extends CharacterBody2D @onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var sprite_2d: Sprite2D = $Sprite2D const RUN_SPEED := 200.0 # 是負(fù)數(shù)的原因是因?yàn)樵?D空間中y軸向上為負(fù) const JUMP_VELOCITY := -300.0 # 獲取引擎給的重力加速度 var gravty := ProjectSettings.get("physics/2d/default_gravity") as float # 每個(gè)物理幀調(diào)用一次 func _physics_process(delta: float) -> void: # 獲取按鍵輸入 var direction := Input.get_axis("move_left","move_right") # 修改速度向量 velocity.x = direction * RUN_SPEED velocity.y += gravty * delta # 如果在地板上并且按下了jump鍵,那么就修改角色y坐標(biāo)變?yōu)樘S值 if is_on_floor() and Input.is_action_just_pressed("jump"): velocity.y = JUMP_VELOCITY # 如果在地板上,沒有移動(dòng)則播放idle動(dòng)畫,有移動(dòng)則播放running動(dòng)畫,如果不在地板上則播放jump動(dòng)畫 if is_on_floor(): if is_zero_approx(direction): animation_player.play("idle") else: animation_player.play("running") else: animation_player.play("jump") # 如果在移動(dòng),并且是向左移動(dòng),那么將角色水平翻轉(zhuǎn) if not is_zero_approx(direction): sprite_2d.flip_h = direction < 0 move_and_slide()