一、坦克结构组成:
坦克由三个基本部件组成:主体,炮管和雷达。
- 主体:可进行移动或旋转动作。
- 炮管:可进行旋转和开火动作,开火可控制子弹的能量范围。
- 雷达:可进行旋转和探测敌人的动作。当坦克停止移动时,雷达会被关闭,玩家可以通过手动调用 scan方法开启雷达。
雷达射线可以在界面的设置面板中设置是否开启,取消雷达射线显示可以得到更好的性能。
二、坐标系
codetank 的坐标系如下:
三、坦克参数说明
- 坦克,雷达,火炮旋转速度:6 度/帧。
- 坦克初始能量:100
- 坦克最大移动速度:8px/帧(当坦克快完成指定位移时,会作一个减速运动)
- 火炮冷却速度:0.1/帧
- 火炮热度增加计算:3+(发射子弹的能量 / 5)
- 子弹能量范围:1-3
- 子弹速度:12px/帧
- 坦克被击中能量损耗计算:4*子弹能量,如果子弹能量大于 1,则再加上 2*(子弹能量-1)的伤害
- 击中敌人获得的能量奖励:3*子弹能量
- 撞墙能量损耗:速度值/2
- 撞击其他 robot 的能量损耗:6
四、坦克的运动
坦克的运动入口为 run方法,该方法启动坦克的运动,例如我们可以使用如下代码使坦克在前进50px之后,雷达旋转90度:
1 2 3 4 5 6 |
run:function(){ this.say("运动入口run方法"); this.ahead(50);//向前走100像素 this.turnRadarLeft(90);//雷达向左转90度 } |
正如你们所看到的,坦克在 run方法里的运动结束之后,就会停止。
如果我们想运动多次地执行,我们只需要一个 for 循环。例如下面的代码将使坦克进行三次的来回运动
1 2 |
run:function(){ for(var i=0;i |
查看 demo
有时候可能多次的循环运动还不足够,如果我们想让运动无限地循环执行,可以调用robot的loop方法,使坦克的行为无限循环。 以下代码使用 loop方法,使坦克做不断做一个矩形的运动:
1 2 3 4 5 6 7 |
run:function(){ this.loop(function(){//循环执行 this.say("矩形轨迹运动"); this.ahead(100);//向前走100像素 this.turnLeft(90);//向左转90度 }); } |
由于坦克包括雷达,炮管,主体三个部分,默认情况下,炮管和雷达跟随坦克的旋转而进行旋转。
但是某些情况下,我们可能希望主体只产生独立的旋转,炮管和雷达不跟随主体产生旋转。因此 robot提供三种方法让玩家使坦克作出理想的旋转运动:
1 2 3 4 5 |
run:function(){ this.setAdjustGunForRobotTurn(true);//炮管独立于坦克的旋转 this.setAdjustRadarForGunTurn(true);//雷达独立于炮管的旋转 this.setAdjustRadarForRobotTurn(true);//雷达独立于坦克的旋转 } |
六、动作完成的回调
当一个动作完成之后,玩家可以指示 Robot进行怎样的回调操作。
例如,我们可以使用下面的方法,利用回调函数改变坦克的运动轨迹:
1 2 3 4 5 6 7 8 9 |
var dir=1; run:function(){ this.loop(function(){ this.ahead(40*dir); this.turnLeft(90*dir,function(){ dir*=-1; }); }) } |
在上面的方法中,首先前进 40px 后转左 90 度,然后在旋转完成的回调函数中,把 dir 变量进行反向,那么 robot 在下一次的行动中,行动轨迹将会变成先后退 40px,再转右 90 度,周而复始。
七、多个动作并行执行
在上面的动作中,robot必须先执行完一个动作,才能开始执行下一个动作,但是如果我们需要多个动作一起执行呢?
Robot 提供多动作同时执行的API,形式为:setXXX。
例如如果我们需要 robot进行一个圆周运动,那么我们就可以让前进和旋转的运动同时执行,首先调用setAhead和setTurn方法设置需要并行执行的两个行为:
1 2 |
this.setAhead(10000); this.setTurn(36000); |
当设置好并行执行的两个行为之后,我们就可以调用 execute方法,同时执行之前订制的行为:
1 |
this.execute(); |
需要注意的是,setXX预设的行为并不一定通过execute方法来执行,任何会具有执行特性的方法都会触发之前预设的行为,例如,通过turn方法同样可以使之前预设的ahead值并行执行,robot也会进行一个圆周运动:
1 2 |
this.setAhead(10000); this.turn(36000); |
八、事件
CodeTank 提供多个事件,常用的事件有onScannedRobot,onHitWall等,玩家在实现自己的坦克的时候,可以重写这些事件处理程序从而使自己的坦克具有更多个性化的行为。
事件的优先级一览:
- scannedRobot:10
- bulletMissed:60
- bulletHit:50
- hitWall:30
- bulletHitBullet:50
- hitByBullet:40,
- hitRobot:20
- death:100
- win:100
- robotDeath:70
优先级高的事件会中断优先级低的事件。每个事件处理程序中的事件对象都具有某些特定的方法,获取处理该事件的时候需要访问的参数,例如:
1 2 |