player script after simple completion of map and player scenes
重力和时间差 delta
的乘积来更新 velocity
的垂直方向上的速度
Main场景的script
extends CharacterBody2D # ProjectSettings.get("physics/2d/default_gravity") 拿到项目设置中的默认重力值 # as float 转换为浮点数 # := 是一种变量声明和赋值的操作符,通常被称为「分配运算符」或「绑定运算符」它用于在声明变量的同时为其赋值 var gravity := ProjectSettings.get("physics/2d/default_gravity") as float; # 参数 delta 表示上一帧到这一帧所经过的时间间隔 func _physics_process(delta: float) -> void: # velocity 是一个表示物体速度的变量, velocity.y 是一个用于表示物体在垂直方向上的速度的属性 # velocity.y += gravity * delta; 根据重力和时间差(delta)的乘积来更新物体在垂直方向上的速度 velocity.y += gravity * delta; move_and_slide();
将项目设置中的默认重力值获取并存储到变量
gravity
中,然后在_physics_process
函数中,根据重力和时间差delta
的乘积来更新velocity
的垂直方向上的速度。最后,调用move_and_slide()
函数来应用物体的运动和滑动
添加键盘映射 并控制玩家移动以及跳跃
键盘映射,A,D,Space
extends CharacterBody2D const RUN_SPEED := 200.0; const JUMP_VELOCITY := -300.0; var gravity := ProjectSettings.get("physics/2d/default_gravity") as float; # 可以按住 CTRL + 鼠标左键选择节点,拖动到代码块中 # sprite_2d 场景图层 # animation_player 动画 @onready var sprite_2d = $Sprite2D; @onready var animation_player = $AnimationPlayer; func _physics_process(delta: float) -> void: # Input.get_axis() 是一个用于获取输入轴值的方法,接收一个或多个参数,若你原地不动则一直是0,若向左走,则为 -1, 向右走则为 1 var direction := Input.get_axis("move_left", "move_right"); # 根据移动方向和一个预设的运行速度,设置角色在水平方向上的速度 velocity.x = direction * RUN_SPEED; velocity.y += gravity * delta; # is_on_floor() 是个判断玩家是否站在地板上的API # Input.is_action_just_pressed("jump"): 检测是否触发了 "jump" 动作 if is_on_floor() and Input.is_action_just_pressed("jump"): # 若当前角色在地板上,也正常触发了 Space键 则角色会向上以给定的垂直速度进行跳跃 velocity.y = JUMP_VELOCITY; if is_on_floor(): # 若玩家在地板上,且移动方向为0时,播放站立动画 # is_zero_approx() 是一个用于近似比较浮点数是否接近于零的方法 if is_zero_approx(direction): animation_player.play("idle"); # 若玩家在地板上,且移动方向不为0时,播放跑动动画 else: animation_player.play("running"); # 若玩家不在地板上,播放跳跃动画 else: animation_player.play("jump"); # 若移动方向不为0时 if not is_zero_approx(direction): # sprite_2d.flip_h 控制水平翻转 # 当移动方向值小于0时,水平翻转,大于零时,则不进行水平翻转 # sprite_2d.flip_h = true \ false; sprite_2d.flip_h = direction < 0; move_and_slide();
为玩家添加 Camera2D(摄像机) 节点, 并设置摄像机的垂直以及水平的交互
为
Player
节点添加子节点Camera2D
,并设置节点的Drag
内的Horizontal_Enabled
属性以及Vertical_Enabled
为Disabled
,如果
horizontal_enabled
被启用(true
),相机仅在达到水平(左及右
)拖动边距时才移动,如果为 false,相机会垂直移动而不管边距
当
vertical_enabled
启用(true
)时,相机仅在达到垂直(顶部及底部
)拖动边距时才移动,如果为 false,相机会垂直移动而不管边距
Camera2D
的Editor
属性内可以勾选Draw_Drag_Margin
属性,来在 2D 预览面板查看水平以及垂直拖动的限制距离,四个值分别为百分比,0
表示摄像机中心点位置,1
表示摄像机边缘位置
Camera2D
的Drag
属性内可以修改Left\Right\Top\Bottom
属性,修改摄像机水平垂直限制拖动的距离
Position_Smoothing
属性设置为True
,则相机会进行位置平滑,好处是不会显得死板
使相机节点触碰到场景边缘时停下来
Limit
属性,可修改摄像机最边缘停止的位置,比如地板底部边缘,当玩家下落时并不会看到地图外侧,Limit
属性内启用Smoothed
可以在玩家下落时,不僵硬的使摄像机方向边缘平滑的移动到限制距离手动计算你可以使用
x
y
坐标轴辅助线来进行测量
每次这样手动计算都会很麻烦,可以进行计算
在
World
根节点添加一个script
extends Node2D @onready var tile_map: TileMap = $TileMap @onready var camera_2d: Camera2D = $Player/Camera2D func _ready() -> void: # 场景初始化,先拿到们在 tilemap 上占用了多大范围 # tile_map.get_used_rect() 是一个用于获取 TileMap(瓷砖地图)中已使用的矩形区域的方法 # used 返回 [P: (-5, 5), S: (47, 9)], [左上角坐标,右上角坐标] var used := tile_map.get_used_rect(); # tile_map.tile_set.tile_size是一个属性,用于获取TileMap(瓷砖地图)所使用的瓷砖集合(TileSet)中每个瓷砖的尺寸 # tile_set是一个包含所有可用瓷砖的集合,而tile_size是其中的一个属性,表示每个瓷砖的尺寸,该属性返回的是一个二维向量(Vector2),其中x表示瓷砖的宽度,y表示瓷砖的高度 # 下面这个写法是拿到一个图块的大小 var tile_size := tile_map.tile_set.tile_size; # 算出上下左右的边距 camera_2d.limit_top = used.position.y * tile_size.y; camera_2d.limit_right = used.end.x * tile_size.x; camera_2d.limit_bottom = used.end.y * tile_size.y; camera_2d.limit_left = used.position.x * tile_size.x; print(used.position, used.end)
图层问题以及地形(简)
使地图边缘隐藏(缩小边缘可见度)
extends Node2D @onready var tile_map: TileMap = $TileMap @onready var camera_2d: Camera2D = $Player/Camera2D func _ready() -> void: # tile_map.get_used_rect().grow(-1) 对该矩形区域进行缩小操作 var used := tile_map.get_used_rect().grow(-1); var tile_size := tile_map.tile_set.tile_size; camera_2d.limit_top = used.position.y * tile_size.y; camera_2d.limit_right = used.end.x * tile_size.x; camera_2d.limit_bottom = used.end.y * tile_size.y; camera_2d.limit_left = used.position.x * tile_size.x; camera_2d.reset_smoothing();
截至目前预览DEMO
提取码:0621