1

好吧,想想 Space Invaders 和 Galaga。我在屏幕顶部有一个敌方中队。他们作为一组在屏幕上左右移动。不时有敌方战士离开队伍并攻击玩家的船。做一些贝塞尔曲线,试图攻击玩家的船。如果敌方战斗机未命中,他 (1) 飞离屏幕底部,隐藏,移动到屏幕顶部,出现并飞回其在中队的位置。问题是敌方战斗机飞回了它离开中队的位置,而不是它当前的位置。

  1. 设置变量 new_pos
  2. 延迟调用动作函数来处理贝塞尔飞行路径,例如

action ((bezier), (延迟 5 秒), (隐藏敌方战机), (延迟 1 秒), (将敌方战机移动到屏幕顶部), (显示敌方战机), (callfunc 获取敌方战机的新位置中队),(贝塞尔回到新位置)

CallFunc 似乎在调用父函数后立即被调用。不是在延迟之后。我所期待的可能吗?

var epos = 0;

if (enemy_fly_out_from == 0)
    this.runAction(cc.Sequence.create(cc.DelayTime.create(enemy_fly_out_duration), cc.CallFunc.create(this.reduce_flied_out, this), cc.MoveTo.create(1, cc.p(ship_pos.x-25, -25)), cc.Hide.create(), cc.MoveTo.create(0, cc.p(ship_pos.x-25, 610)), cc.Show.create(), cc.CallFunc.create(this.get_enemy_pos(which_enemy), this), cc.BezierTo.create(5, [cc.p(ship_pos.x-25, 600), cc.p(pos.x, 600), cc.p(epos.x,epos.y)]), cc.CallFunc.create(this.end_fly_out(which_enemy), this)));   

else
    this.runAction(cc.Sequence.create(cc.DelayTime.create(enemy_fly_out_duration), cc.CallFunc.create(this.reduce_flied_out, this), cc.MoveTo.create(1, cc.p(ship_pos.x+25, -25)), cc.Hide.create(), cc.MoveTo.create(0, cc.p(ship_pos.x+25, 610)), cc.Show.create(), cc.CallFunc.create(this.get_enemy_pos(which_enemy), this), cc.BezierTo.create(5, [cc.p(ship_pos.x+25, 600), cc.p(pos.x-100, 600), cc.p(epos.x, epos.y)]), cc.CallFunc.create(this.end_fly_out(which_enemy), this)));
},
end_fly_out:function(which_enemy)
{
     enemies_array[which_enemy].flied_out = 0;
},
    get_enemy_pos:function(which_enemy)
{
    epos = enemies_array[which_enemy].getPosition();
},
reduce_flied_out:function()
{
    enemies_flied_out = 0;
}
4

1 回答 1

0

我已经解决了这个问题(1)基于飞出中队的敌方战斗机创建一个新的精灵(2)隐藏敌方战斗机(3)显示新的精灵(4)新的精灵充当敌方战斗机(5 ) 隐藏精灵 (6) 显示敌方战斗机

感谢您抽出宝贵时间@Sebastian Vansteenkiste。如果精灵没有被防守方射击,即精灵完成了它的飞行,那么它通过底部的 cc.MoveTo.create(1, cc.p(ship_pos.x + 25, -25)) 飞出屏幕。然后它在屏幕顶部重新出现在屏幕外 cc.MoveTo.create(1, cc.p(ship_pos.x + 25, 610))。然后它飞回中队的位置。

于 2014-08-02T00:27:57.370 回答