1.为什么会有重力的影响:因为CharacterBody2D默认的代码是重力影响的,删掉即可

只需要添加
extends CharacterBody2D
const SPEED = 200.0
var direction
func _physics_process(delta):
direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
if direction.x == 0 or direction.y == 0 :
pass
velocity = direction * SPEED
move_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 = false
func 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 * delta
move_and_slide()
func _on_timer_timeout():
move = !move
dir = 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 CharacterBody2D
const SPEED = 500.0
var direction
func _physics_process(delta):
direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
if direction.x == 0 or direction.y == 0 :
pass
velocity = direction * SPEED * delta
move_and_slide()
#position += direction * SPEED * delta
为什么不直接position += direction * SPEED * delta,因为这样会缺少碰撞逻辑
4.敌人追逐注意事项
1.玩家位置必须更新,敌人如何拿到:通过全局变量:点击项目--项目设置--自动加载,自己创建一个Global.gd文件,不要挂载到任何一个节点,放到自动加载里头:
写入:
extends Node
var pos = Vector2(0, 0)
2.为什么敌人一直向左上角走:因为创建节点的时候,节点的位置和sprite2D的位置是不一样的;position拿到的是节点的位置不是精灵的位置;创建节点的时候,必须先把节点的位置和sprite2D的位置统一起来

如图,1,2,3分别表示node节点的位置,用户感知的精灵sprite的位置和参与现实碰撞的位置,尤其注意节点位置,不要忘记
3.知道上述之后,做出追逐的方法其实就有很多了,这里列举最简单的一种(Global.gd在上面已经贴过)
1)玩家,把位置数据同步到全局变量
extends CharacterBody2D
const SPEED = 3000.0
var direction
func _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 :
pass
velocity = direction * SPEED * delta
move_and_slide()
#position += direction * SPEED * delta
func _process(delta):
Global.pos = global_position
2)敌人,拿到全局变量,往那个方向跑
extends CharacterBody2D
const SPEED = 1500.0
var is_atttack
func _physics_process(delta):
if is_atttack:
position += (Global.pos - position) / SPEED
func _on_area_2d_body_entered(body):
if body.is_in_group("player"): #没有这一行,开局就会和map碰撞,直接卡死
is_atttack= true
pass
func _on_area_2d_body_exited(body):
is_atttack= false
pass

被折叠的 条评论
为什么被折叠?



