
新手引导--- 3 生成与标记
2025-07-05 发布78 浏览 · 0 点赞 · 0 收藏
本篇主要简单介绍对象生成以及标记。
以4.4为例。
这是一个具有碰撞区域和精灵图片的节点。接下来要将它变成一颗子弹。
本篇要实现的是角色和敌人相互发射子弹,并且子弹是同一种子弹。最终效果如下:
这是主场景内容:
思路如下:
子弹虽然是同一种,但又有敌我两种模式,或者其他更多模式。
所以需要预留一个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)
输入映射使用方法:
点击项目设置。
面板如下:
在“添加新动作”位置命名,回车或单击“添加”按钮添加命名。
添加好的名称右边的“+”绑定输入按钮。
之后会跳出实时监听按钮事件的面板,想绑定哪个按键就按哪个按键,注意切换成英文输入法。4.4目前除了单个按键,还支持捆绑多种热键,具体内容可以自行尝试。
敌人每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)
以此做拓展,其实敌人也可以被生成。可以看到,说一千道一万,其实生成器就是固定时间间隔,在特定位置,生成特定物品。对象标记无非是对某对象预留变量,以在后续根据变量的值做类型区分。
请前往 登录/注册 即可发表您的看法…