1.为什么会有重力的影响:因为CharacterBody2D默认的代码是重力影响的,删掉即可
只需要添加
extends CharacterBody2Dconst SPEED = 200.0
var directionfunc _physics_process(delta):direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")if direction.x == 0 or direction.y == 0 :passvelocity = direction * SPEEDmove_and_slide()
因为现在的图像是静止的,所以这样直接就完成了:move_and_slide()和位置直接+的区别是:一个参与碰撞,位置直接加不参与碰撞
2.直接在player节点下面挂一个相机,并且把相机和屏幕放到一起,就会跟随角色,zoom越大,相机越小
3.敌人闲逛注意事项
1.地图1152*648太大了,我把图片缩小到0.08
2.代码实现:
敌人:
extends CharacterBody2D@onready var timer = $Timer
var SPEED = 300
var dir = Vector2.RIGHT
var move = falsefunc random_something(arr): #获取一个随机数arr.shuffle()return arr.front()func _physics_process(delta):if timer.is_stopped(): return if !timer:timer.set_wait_time(random_something([1, 0.5, 0])) timer.start()if move:#dir = random_something([Vector2.RIGHT, Vector2.LEFT, Vector2.UP, Vector2.DOWN])velocity = dir * SPEED * deltamove_and_slide()func _on_timer_timeout():move = !movedir = random_something([Vector2.RIGHT, Vector2.LEFT, Vector2.UP, Vector2.DOWN])pass # Replace with function body.
注意的是,为什么一直抖动,这是最重要的:
dir = random_something([Vector2.RIGHT, Vector2.LEFT, Vector2.UP, Vector2.DOWN])
因为move为true的话,我们一直在改变方向导致的,所以放到了定时器被执行的时候才改变方向并且只设置一次
我方:
extends CharacterBody2Dconst SPEED = 500.0
var directionfunc _physics_process(delta):direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")if direction.x == 0 or direction.y == 0 :passvelocity = direction * SPEED * deltamove_and_slide()#position += direction * SPEED * delta
为什么不直接position += direction * SPEED * delta,因为这样会缺少碰撞逻辑
4.敌人追逐注意事项
1.玩家位置必须更新,敌人如何拿到:通过全局变量:点击项目--项目设置--自动加载,自己创建一个Global.gd文件,不要挂载到任何一个节点,放到自动加载里头:
写入:
extends Nodevar pos = Vector2(0, 0)
2.为什么敌人一直向左上角走:因为创建节点的时候,节点的位置和sprite2D的位置是不一样的;position拿到的是节点的位置不是精灵的位置;创建节点的时候,必须先把节点的位置和sprite2D的位置统一起来
如图,1,2,3分别表示node节点的位置,用户感知的精灵sprite的位置和参与现实碰撞的位置,尤其注意节点位置,不要忘记
3.知道上述之后,做出追逐的方法其实就有很多了,这里列举最简单的一种(Global.gd在上面已经贴过)
1)玩家,把位置数据同步到全局变量
extends CharacterBody2Dconst SPEED = 3000.0
var directionfunc _ready():add_to_group("player")func _physics_process(delta):direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")if direction.x == 0 or direction.y == 0 :passvelocity = direction * SPEED * deltamove_and_slide()#position += direction * SPEED * deltafunc _process(delta):Global.pos = global_position
2)敌人,拿到全局变量,往那个方向跑
extends CharacterBody2Dconst SPEED = 1500.0
var is_atttackfunc _physics_process(delta):if is_atttack:position += (Global.pos - position) / SPEEDfunc _on_area_2d_body_entered(body):if body.is_in_group("player"): //没有这一行,开局就会和map碰撞,直接卡死is_atttack= truepassfunc _on_area_2d_body_exited(body):is_atttack= falsepass