简介
本文以你的第一个 2D 游戏 — Godot Engine (4.5) 简体中文文档为蓝本撰写,godot-rust提供了该教程的一个rust的实现dodge-the-creeps,与本文方法会稍有不同。如果你对rust、godot等内容比较生疏或感到疑惑,可以先阅读godot-rust入门文档。
本文搭建在godot-rust(gdext)创建项目的基础之上,如果你对该部分内容感到生疏,可以先阅读这部分内容,为接下来的操作做好准备。
注意,本文使用的godot版本为4.5.1,godot版本的变化可能会导致一些内容失效。
本文操作均在Windows上执行。
正文
创建玩家场景
让我们进入rust,创建玩家Player对象,你可以直接在lib.rs中编写,也可以分文件编写,只需要记住在lib.rs中用mod进行声明。
use godot::{
classes::{Area2D, IArea2D},
prelude::*,
};
#[derive(GodotClass)] // 将Player注册为godot中的类
#[class(base=Area2D)] // 指定Player继承于Area2D
struct Player {
base: Base<Area2D>, // 用组合方式提供访问Player的父类实例的入口,即Area2D实例
}
#[godot_api] // 告知gdext接下来impl的内容供godot使用
impl IArea2D for Player { // 使用IArea2D trait模拟继承Area2D
fn init(base: Base<Area2D>) -> Self { // 重写init方法
Self { base }
}
}
#[class(base=T)]和base: Base<T>的T必须保持一致base: Base<Area2D>不是必须字段,但缺少该字段将无法使用self访问父类对象#[class(base=Area2D)]不是必须的,不指定时,默认父类为RefCountedIArea2D的init方法形式可参考文档。若不显式编写该方法,编译器会提示Player需要init的错误。
编译rust项目:
cargo build
回到godot编辑器,在左上角场景选项卡中点击其他节点:
在弹出的对话框中搜索player,会发现一个在Area2D节点下的子类型节点Player,创建它:
你已经成功地将你编写的Player节点添加到了godot中。这时你会注意到节点后面有一个黄色警告,提示你节点需要一个形状来检测碰撞或重叠,不用担心,后面会逐一解决。
选中Player节点,点击工具栏里的编组所选节点图标,让Player及其子节点进行编组。
确保不会通过点击Player和其子节点来意外移动它们或调整它们的大小
点击场景->保存,或者使用ctrl + s保存player.tscn场景。
此时在godot的文件系统选项卡中结构应该像这样:
选中Player节点,有三种方法来添加子节点。使用ctrl + a,或者右键点击Player->添加子节点,或者点击场景选项卡中左上角的+号图标。
添加一个AnimatedSprite2D节点来处理Player的外观和动画。选中AnimatedSprite2D节点,在godot编辑器的右边检查器选项卡中找到Sprite Frames属性,点击新建SpriteFrames。
在检查器选项卡中点击你刚刚创建的SpriteFrames,godot编辑器的下方会弹出 "SpriteFrames" 面板。
重命名default为walk,使用添加动画按钮,再创建一个名为up的动画。
在文件系统选项卡中的art文件夹下拖动图片到动画帧中:
playerGrey_walk1和playerGrey_walk2用于walkplayerGrey_up1和playerGrey_up2用于up
在godot编辑器2D面板中观察,图片相对窗口来说有点过大,需要缩小它们。点击AnimatedSprite2D节点,在检查器Node2D标签中,将Scale属性设置x = 0.5, y = 0.5。
向Player节点添加CollisionShape2D子节点,用来确定Player的碰撞范围。选中CollisionShape2D,在检查器中Shape属性选择CapsuleShape2D。
在2D场景编辑器面板中使用两个控制柄,调整到合适的大小。
这时,你的场景面板中应该像这样:
警告已经消失,点击场景->保存,或者使用ctrl + s保存player.tscn场景。