这一节我们主要学习敌人死亡后随机掉落金币,主人公可以进行拾取功能。
一、新建金币场景
新建场景,节点选择CharacterBody2D,命名为Coins,将场景保存到Scenes目录下。
1.新建节点
为根节点依次添加CollisionShape2D节点,表示金币本身碰撞体;AnimatedSprite2D节点,命名为AnimaS用于播放金币的动画;
Area2D节点,命名为PickBox,用于与主人公发生碰撞,实现金币收集功能,该节点下添加CollisionShape2D,表示碰撞形状。
节点如下:
2.配置节点属性
第一AnimaS节点设置。选中AnimaS节点,在其检查器中Animation->Sprite Frames属性下拉框中选择SpriteFrames,如下图:
在动画帧面板中default动画中单击从精灵表中添加帧按钮,选择我们准备好的金币图片素材,在选择帧对话框中水平设置为8,垂直设置为1,全选帧,然后单击添加帧按钮,这样就把8帧图片添加到default动画里面了,如下:
在动画帧面板中将动画速度设为10FPS,开启动画循环和自动播放功能,如下:
这样我们的动画就设置完成了。
第二PickBox节点配置。为该节点添加CollisionShape2D子节点,命名为pickcollision,然后选中该节点,在其检查器中Shape属性选择CircleShape2D圆形碰撞,大小调整比金币大一些,用于收集金币碰撞。
第三CollisionShape2D节点配置。在其检查器中Shape属性选择CircleShape2D圆形碰撞,大小调整和金币大小相同即可。
3.编写代码
选择根节点,为其添加代码,保存至Scenes下,命名为Coins,编写如下代码:
extends CharacterBody2D
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var isPick=false
func _ready():
#爆金币特效
var tween = get_tree().create_tween() #创建间补动画
tween.tween_property(self,"velocity",Vector2(randi_range(-100,100),randi_range(-100,-200)),0.5)
tween.tween_property(self,"velocity",Vector2(0,300),0.3)
tween.tween_callback(velocityZero)
#设置X速度0.3秒到达-150
pass
func _physics_process(delta):
move_and_slide()
pass
func pickUp(): #拾取金币动画
if isPick:
var tween = get_tree().create_tween() #创建间补动画
tween.tween_property(self,"velocity",Vector2(0,-200),0.5) #设置X速度0.3秒到达-150
tween.parallel().tween_property(self,"modulate:a",0,0.5) #0.3秒对象变为透明
tween.tween_callback(self.queue_free) #播放完间补动画,自动释放金币
pass
func velocityZero():
velocity = Vector2.ZERO
isPick=true
func _on_pick_box_body_entered(body):
pickUp()
pass # Replace with function body
上述代码,_ready函数定义了金币初始状态,爆金币特效;pickUp()函数定义了拾取金币特效。
三、敌人场景设置
切换到Enemy场景代码,添加新函数coin_spawn,该函数主要是在主场景根目录下生成一个金币。代码如下:
func coin_spawn():
var coin = coinpre.instantiate()
coin.position = self.position
Globals.duplicate_node.add_child(coin)
该代码运行前还需要预先载入金币,代码如下:
var coinpre = preload("res://Scenes/Coins.tscn")
然后修改death_state函数,实现敌人死亡随机爆出1至6个金币,代码如下:
func death_state():
Globals.animation_scene_obj.run_animation({
"box":Globals.duplicate_node,
"ani_name":"Dealth",
"position":self.global_position,
"scale":Vector2(1,1)
})
for i in randi_range(1,6):
coin_spawn()
self.queue_free()
三、最终效果
这样我们就实现敌人死亡后随机调取金币并进行了拾取功能,演示如下: