godot.bk4:how to make NPC roam and attack player with global variable‘s usage

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值