上一部分添加了Jumper
和Circle
这一部分我们完成基本的游戏玩法:只要不错过圆圈就一直生成圆圈
场景节点
在主场景中删除之前测试建立的两个节点,新建两个节点
Node
(Main)
Position2D
(StartPosition)Camera2D
将摄像机放到适当位置并修改y
偏移-200
,勾选current
属性
适当修改StartPosition
的位置
场景脚本
jumper.gd
定义信号
signal captured
当箭头击中一个圆圈时发送信号
func _on_Jumper_area_entered(area):
# 连接area_entered信号 检测与圆圈碰撞 让箭头停止
target = area
velocity = Vector2.ZERO
#当箭头击中一个圆圈时发送信号
emit_signal("captured",area)
circle.gd
使init()
函数接收位置参数
# 删除之前的ready()函数
func init(_position,_radius=radius):
position=_positionfunc init(_position,_radius=radius):
position=_position
////
为Main
场景添加Main.gd
extends Node
# 预加载 场景
var Circle = preload("res://objects/circle.tscn")
var Jumper = preload("res://objects/jumper.tscn")
var player
func _ready():
randomize()
new_game()
func new_game():
# 相机位置为起始点位置
$Camera2D.position = $StartPosition.position
# 实例化玩家
player = Jumper.instance()
player.position = $StartPosition.position
# 将玩家添加到场景中
add_child(player)
# 连接信号
# (如果箭头与圆圈产生碰撞就发送信号 执行_on_Jumper_captured函数)
player.connect("captured", self, "_on_Jumper_captured")
spawn_circle($StartPosition.position)
# 生成圆圈
func spawn_circle(_position=null):
var c = Circle.instance()
if !_position:
var x = rand_range(-150, 150)
var y = rand_range(-500, -400)
_position = player.target.position + Vector2(x, y)
add_child(c)
c.init(_position)
# 移动摄像机 并产生新的圆圈
func _on_Jumper_captured(object):
$Camera2D.position = object.position
call_deferred("spawn_circle")
测试1
可以看到箭头不会从落点开始旋转,所以
在jumper.gd
中的_on_Jumper_area_entered()
添加以下代码
使其可以在落点位置继续旋转
target.get_node("Pivot").rotation = (position - target.position).angle()
在circle.gd
中的init()
添加以下代码
让其随机顺或逆时针旋转,增加趣味性
rotation_speed *= pow(-1, randi() % 2)
测试2
尾巴效果
添加以下节点
Node
(Trail)
Line2D
(Points)
修改Points
节点的属性 为其添加渐变色
在jumper.gd
中添加以下脚本
onready var trail = $Trail/Points
var trail_length = 25
func _physics_process(delta):
if trail.points.size() > trail_length:
trail.remove_point(0)
trail.add_point(position)
#到达圆上就让其绕圆旋转
if target:
transform = target.orbit_position.global_transform
# 否则就按直线行走
else:
position += velocity * delta
测试3
圆圈动画
给Circle
添加一个AnimationPlayer
节点
添加implode
动画
属性/关键帧 | 0s | 0.5s |
---|---|---|
scale | 1,1 | 0,0 |
modulate-A | 255 | 0 |
复制Circle
中的Sprite
,并重命名为SpriteEffect
,并将其设置为不可见
在AnimationPlayer
中添加一个名为capture
的动画
属性/关键帧 | 0s | 0.5s |
---|---|---|
visible | true | / |
scale | 1,1 | 0,0 |
modulate-A | 0 | 150 |
下面添加脚本让动画生效
circle.gd
func capture():
# 播放动画
$AnimationPlayer.play("capture")
func implode():
if !$AnimationPlayer.is_playing():
$AnimationPlayer.play("implode")
yield($AnimationPlayer, "animation_finished")
queue_free()
jumper.gd
func jump():
target.implode()
target = null
velocity = transform.x * jump_speed
Main.gd
func _on_Jumper_captured(object):
$Camera2D.position = object.position
object.capture()
call_deferred("spawn_circle")
测试4
这时我们会发现摄像机是突然移动过去的,所以我们要给摄像机添加平滑过渡的效果
勾选此项并选择合适的速度
修正后效果