我正在AS3制作太空游戏 - 我有一个名为EnemyShip的敌人类。
我已经注册了Event.ENTER_FRAME并且它正常工作 - 问题是我的变量类型为Array的rowXY在模式中报告null和非null值..
如何防止这种情况发生(或者是否有更简单的方法可以让船只在Flash Professional中移动?)。
package
{
import flash.display.Sprite;
import flash.events.Event;
public class EnemyShip extends Sprite
{
internal var id:int;
internal var rowOrder:int;
internal var rowXY:Array;
private var dirUp:Boolean = false;
public function EnemyShip()
{
// add event listeners
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
addEventListener(Event.ENTER_FRAME, update);
}
private function update(e:Event):void
{
moveUpAndDown();
trace(rowXY);
function moveUpAndDown():void
{
if (dirUp)
y -= C.ENEMY_SPEED;
else
y += C.ENEMY_SPEED;
}
}
private function onAddedToStage(e:Event):void
{
// get row XY
if (rowOrder == 1)
rowXY = C.ENEMY_ROW_1;
if (rowOrder == 2)
rowXY = C.ENEMY_ROW_2;
if (rowOrder == 3)
rowXY = C.ENEMY_ROW_3;
// set XY position
x = rowXY[0];
y = rowXY[1];
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
internal function destroy():void
{
rowOrder = null;
rowXY = null;
// remove event listeners
removeEventListener(Event.ENTER_FRAME, update);
// remove from display list
parent.removeChild(this);
}
}
}
package
{
// C stands for constants
public class C
{
// ship constants
public static const FIRE_DELAY:int = 500; // milliseconds
// laser constants
public static const LASER_SPEED:int = 30;
public static const POINTS_KILL:int = 10;
// mcScore constants
public static const SCORE_LOC_X:Number = 345;
public static const SCORE_LOC_Y:Number = -120;
// enemy ship constants
public static const ENEMY_ROW_1:Array = [485, -45];
public static const ENEMY_ROW_2:Array = [485, 25];
public static const ENEMY_ROW_3:Array = [485, 95];
public static const ENEMY_SPEED:int = 5; // 5 pixels
public static const ENEMY_Y_MIN:int = -10;
public static const ENEMY_Y_MAX:int = 10;
}
}
答案 0 :(得分:1)
如果您尝试使用Flash Professional制作动画,我会利用其内置的Motion Tween功能。您还可以利用Tween类为您的代码制作动画。
答案 1 :(得分:1)
我使用此SharedPreferences
循环重现了您的行为(您可以通过实例化3个对象并将3个其他对象直接插入舞台来获得相同的结果):
for
在这里我们可以非常清楚地看到for(var i:int = 1; i < 7; i++){
var enemy:EnemyShip = new EnemyShip();
enemy.rowOrder = i;
addChild(enemy);
}
在4,5或6的位置,i
将是rowOrder
,这也会为所有具有此问题的实例触发一些#1009错误null
比这一行更大3:
rowOrder
为了避免这种情况,您可以将x = rowXY[0];
的值限制在1到3之间,例如:
rowOrder
您也可以在enemy.rowOrder = 1 + int(Math.random()*3);
类本身内设置该值。
...
希望可以提供帮助。
答案 2 :(得分:0)
据我所知,事件Event.ENTER_FRAME只传递给舞台上的对象,但事实并非如此。
问题出在我的EnemyShip类的构造函数方法中 - 舞台上和舞台外实例正在监听ENTER_FRAME事件 - 没有为场外实例分配rowXY(这发生在事件ADDED_TO_STAGE中)
旧代码:
新守则:
那么这里要学到的教训是什么?
无论对象是否显示,都会发生Event.ENTER_FRAME。
答案 3 :(得分:0)
在您发布的屏幕截图中,您有以下代码:
if(rowOrder > 3)
rowOrder = 0;
但是当您在rowOrder
中检查onAddedToStage()
时,您没有0的情况 - 只有1,2或3.因此rowXY
永远不会被rowOrder
设置是0。
更改该代码以将rowOrder
设置为1而不是0,或将其他代码更改为零索引。