该添加人物了
添加CharacterBody2D,在CharacterBody2D下添加Sprite2D(用于显示玩家),CollisionShape2D(碰撞箱)
你的场景树应该是这样的

先添加玩家的贴图吧
选中Sprite2D,将准备好的素材拖进Texture属性中

因为我们的素材是4列2行
所以将Texture下方的Animation设置成
Hframes为4(水平方向帧数)
Vframes为2(垂直方向帧数)

这样玩家的贴图应该就有了,修改frame属性可以设置使用哪一帧
接着我们来设置碰撞箱
选中CollisionShape,为其添加Shape

这里我选择的是CapsuleShape,也就是胶囊型碰撞箱
这种碰撞箱能增强平台跳跃视角游戏的手感,具体表现在不容易卡脚。
利用手柄进行调整

我把碰撞箱大概调成了这样

显然我们的玩家是不会移动的,现在我们来为其添加脚本吧
首先是你不知道的事情,比如我们可以直接拿到重力
var gravity := ProjectSettings.get_setting("physics/2d/default_gravity") as float
:=
运算符可以在首次赋值时固定变量类型,如果变量类型固定可以方便编辑器补全
as
关键字用于强制转换类型
然后我们需要为移动添加相应的按键映射

然后使用_unhandle_input
……吗?
_unhandle_input
虽然对于处理输入方便,但是移动是一个由三个动作事件组成的事件,跳跃是对y轴的还好说,但向左向右移动显然是有直接的联系,玩家是可能在同一刻进行这两个动作事件,如果用_unhandle_input
显然就需要用置标记符等奇技淫巧,但这显然麻烦又不符合直觉。
这里我们用Input类,这是一个可以在@GlobalScope可查的单例实体(单例的意思是整个项目运行时无论如果这个类只有一个实例)。因为所有的事件动作检测全部在同一刻进行,这里我们的入口函数就由void _unhandled_input(event: InputEvent)
变为了void _physics_process(delta: float)

我们查阅一下Input类的文档

这个方法和上面检测鼠标的那个相似

这个检测移动刚刚好
之后就是移动,我们再看看CharacterBody2D里面有什么能用的
velocity
和
move_and_slide
,刚刚好
那么我们的代码差不多就是这样子
extends CharacterBody2D
const SPEED = 300 # 移动速度
const JUMP_FORCE = -500 # 跳跃力,godot的2d,y轴向上为负
var gravity := ProjectSettings.get_setting("physics/2d/default_gravity") as float
func _physics_process(delta: float) -> void:
velocity.x = Input.get_axis("move_left", "move_right") * SPEED # get_axis只是移动的单位向量,需要乘以速度
if Input.is_action_pressed("jump"):
velocity.y = JUMP_FORCE
else :
velocity.y += gravity * delta
move_and_slide()
代码写完了,让我们运行看一看效果
