上一部分添加了JumperCircle

这一部分我们完成基本的游戏玩法:只要不错过圆圈就一直生成圆圈

场景节点

在主场景中删除之前测试建立的两个节点,新建两个节点

Node(Main)

  • Position2D(StartPosition)
  • Camera2D

将摄像机放到适当位置并修改y偏移-200,勾选current属性

image-20200810231845170

适当修改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动画

属性/关键帧0s0.5s
scale1,10,0
modulate-A2550

复制Circle中的Sprite,并重命名为SpriteEffect,并将其设置为不可见

AnimationPlayer中添加一个名为capture的动画

属性/关键帧0s0.5s
visibletrue/
scale1,10,0
modulate-A0150

下面添加脚本让动画生效

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

这时我们会发现摄像机是突然移动过去的,所以我们要给摄像机添加平滑过渡的效果

勾选此项并选择合适的速度

修正后效果

Last modification:August 11th, 2020 at 01:15 am