新手引导--- 3 生成与标记

新手引导--- 3 生成与标记

ahunziinwuxi

2025-07-05 发布78 浏览 · 0 点赞 · 0 收藏

本篇主要简单介绍对象生成以及标记。
以4.4为例。

image.png
这是一个具有碰撞区域和精灵图片的节点。接下来要将它变成一颗子弹。

本篇要实现的是角色和敌人相互发射子弹,并且子弹是同一种子弹。最终效果如下:
000.gif

这是主场景内容:
image.png

思路如下:
子弹虽然是同一种,但又有敌我两种模式,或者其他更多模式。
所以需要预留一个type变量。

boom的代码如下:

extends Node2D

var type_:int = 1
var target:Vector2



func _ready() -> void:
	print(get_tree().root.get_node("node").get_children())
	if type_ == 1:
		for i in get_tree().root.get_node("node").get_children():
			print(i.global_position)
			if i.name == "enemy":
				print(i.global_position)
				target = i.global_position
				pass
			else:
				pass
			pass
		pass
	if type_ == 2:
		for i in get_tree().root.get_node("node").get_children():
			print(i.global_position)
			if i.name == "char":
				print(i.global_position)
				target = i.global_position
			else:
				pass
	pass


var get_time_ = Time.get_ticks_msec()
func _physics_process(delta: float) -> void:
	#两秒后自动销毁子弹
	if Time.get_ticks_msec() - get_time_ > 2000:
		self.queue_free()
	$".".global_position = global_position.move_toward(target, 10)
	#move_and_slide()


#碰撞后的处理
func _on_area_2d_body_entered(body: Node2D) -> void:
	if type_ == 1:
		if body.name =="enemy":
			body.hp -= 10
			self.queue_free()
			pass
	if type_ == 2:
		if body.name =="char":
			body.hp -= 10
			self.queue_free()
			pass
	pass

角色可以控制移动并每0.5秒发射一颗子弹,角色代码如下:

extends CharacterBody2D
class_name  char

var hp = 10


#更新键盘移动
func update_kmove():
	var m = Vector2()
	var m0 = Vector2(0,0)
	if Input.is_action_pressed("a"):
		m += Vector2(-1, 0)
		m0 += Vector2(1, 1)
	if Input.is_action_pressed("d"):
		m += Vector2(1, 0)
		m0 += Vector2(1, 1)
	if Input.is_action_pressed("w"):
		m += Vector2(0, -1)
		m0 += Vector2(1, 1)
	if Input.is_action_pressed("s"):
		m += Vector2(0, 1)
		m0 += Vector2(1, 1)
	if m0!=Vector2(0,0):
		m = m/m0
	#print($".".global_position)
	return m


var get_time_ = Time.get_ticks_msec()
func _physics_process(delta: float) -> void:
	velocity = update_kmove() * 300
	move_and_slide()#不要忘记了
	
	if Time.get_ticks_msec() - get_time_ > 500:
		get_time_ = Time.get_ticks_msec()
		var boom = load("res://boom.tscn").instantiate()
		boom.type_ = 1
		add_child(boom)

输入映射使用方法:
image.png
点击项目设置。
image.png
面板如下:
image.png
在“添加新动作”位置命名,回车或单击“添加”按钮添加命名。
image.png
添加好的名称右边的“+”绑定输入按钮。
之后会跳出实时监听按钮事件的面板,想绑定哪个按键就按哪个按键,注意切换成英文输入法。4.4目前除了单个按键,还支持捆绑多种热键,具体内容可以自行尝试。
image.png

敌人每0.5秒发射一颗子弹,敌人代码如下:

extends CharacterBody2D

var hp = 10


var get_time_ = Time.get_ticks_msec()
func _physics_process(delta: float) -> void:
	if Time.get_ticks_msec() - get_time_ > 500:
		get_time_ = Time.get_ticks_msec()
		var boom = load("res://boom.tscn").instantiate()
		boom.type_ = 2
		add_child(boom)

以此做拓展,其实敌人也可以被生成。可以看到,说一千道一万,其实生成器就是固定时间间隔,在特定位置,生成特定物品。对象标记无非是对某对象预留变量,以在后续根据变量的值做类型区分。

请前往 登录/注册 即可发表您的看法…