基本上我要做的是制作一个非常简单的垂直子弹射弹系统(子弹以一致的速度移动,子弹可以应用hitTestObject等),但是我在将某些东西放在一起时遇到了困难。
我的代码就是:
// define timer
var myTimer:Timer = new Timer(15);
// define array [list]
var list:Array = new Array();
myTimer.addEventListener(TimerEvent.TIMER, timerListener);
myTimer.start();
function timerListener(e:TimerEvent):void
{
var Create:Bullet = new Bullet();
addChild(Create);
// Starting position
Create.x = 150;
Create.y = 150;
// Push into list
list.push(Create);
}
for (var i:int; i <= 10; i++){
list[i].x + 10;
i++;
if (i > 10){
i = 0;
}
}
问题是当我尝试引用list [i] .x并让所有对象以一致的速度移动时,包括#1010错误,我一直在使用for / while / etc时遇到各种各样的问题。
如果有人知道更好的方法来做我正在寻找的东西,或修复我当前的代码,我将非常感激。 :)
答案 0 :(得分:1)
当您移动项目符号列表时,需要正确索引列表。你得到#1010&#39; undefined&#39;错误是因为list [i]并不总是被定义。您还应该删除已移出屏幕的所有项目符号。我使用300像素作为任意截止点。你应该在一个计时器上调用moveBullets(),可能在你的15ms计时器上。
试试这个:
function moveBullets():void{
var target:Bullet;
for(var i:int=0;i<list.length;i++){
target = Bullet(list[i]);
target.x +=10;
if(target.x > 300){
removeChild(target);
list.splice(i,1);
i--;
}
}
}
答案 1 :(得分:0)
在向舞台添加任何项目之前运行for
循环。
for
循环的函数应该是这样的:
// define timer
var myTimer:Timer = new Timer(15);
// define array [list]
var list:Array = new Array();
myTimer.addEventListener(TimerEvent.TIMER, timerListener);
myTimer.start();
function timerListener(e:TimerEvent):void
{
var Create:Bullet = new Bullet();
addChild(Create);
// Starting position
Create.x = 150;
Create.y = 150;
// Push into list
list.push(Create);
}
// the for loop functionality:
addEventListener ( Event.ENTER_FRAME, handleEnterFrame );
function handleEnterFrame ( e : Event )
{
// for (var i:int; i <= 10; i++) -> why 10?
var length_i:uint = list.length;
var bulletMC:Bullet;
for (var i:uint; i <= length_i; i++)
{
bulletMC = list[i];
// list[i].x + 10; -> almost :)
bulletMC.x += 10;
// i++; -> you do need to do this the for loop automaticaly increases the i variable.
// then you need to check if you still need the bullet ( is it of of the stage )
if ( bulletMC.x > stage.stageWidth ) // here can be some other parameter
{
list.splice(i,1)
list.removeChild ( bulletMC );
i--; // since we removed one bullet from the array
length_i = list.length // updating the lenght of the array
}
}
}
答案 2 :(得分:0)
在你的代码中,第二个for循环(负责移动项目符号的循环)在创建单个项目符号之前运行。这就是您获得空指针异常的原因:Flash Player正在尝试移动不存在的对象(尚未)。在调用它们之前,必须始终确保对象存在。
此外,像这样的for循环只会迭代列表中的项目符号,但它不会考虑随时间运动。当然,您可以将其循环放在另一个for循环等等,以使其反复运行 - 但所有这一切都会冻结您的计算机,因为您不允许屏幕刷新运动之间。
简而言之:动作循环必须位于您定期调用的功能中。
另外,使用计数器变量迭代数组是很乏味的 - 你可以使用for... in
而忘记长度等等。
var createTimer : Timer = new Timer ( 15 );
var maxBullets : uint = 10;
var moveSpeed : uint = 10;
var list : Array = [];
createTimer.addEventListener ( TimerEvent.TIMER, onCreationTimer );
createTimer.start ();
addEventListener ( Event.ENTER_FRAME, onEnterFrame ); // <= this will call the
// motion loop each
// time the screen
// refreshes.
function onEnterFrame ( event : Event ) : void
{
for each ( var bullet : Bullet in list) // <= move bullets and remove if off-screen
if ((bullet.x += moveSpeed) > stage.stageWidth)
removeChild ( list.splice ( list.indexOf ( bullet ), 1 )[0] );
}
function onCreationTimer ( e : TimerEvent ) : void
{
if (list.length >= maxBullets) return;
var bullet : Bullet = new Bullet ();
list.push ( addChild ( bullet ) );
bullet.x = bullet.y = 150;
}