【Godot4自学手册】第二十一节掉落金币和收集

这一节我们主要学习敌人死亡后随机掉落金币,主人公可以进行拾取功能。

一、新建金币场景

新建场景,节点选择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()

三、最终效果

这样我们就实现敌人死亡后随机调取金币并进行了拾取功能,演示如下:
请添加图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游戏自学

生活不易,打赏随意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值