the code below is basically a code i created for a turret on stage that fires a “laser beam”.
if the “laser beam” hits a wall / object / obstacle, it will stop right there and no longer progress…
it works great, except for one thing…
var radians:Number;
var begX:Number;
var begY:Number;
var endX:Number;
var endY:Number;
var maxDist:Number = 500;
var laserIsOn:Boolean = false;
stage.addEventListener(Event.ENTER_FRAME, runEnterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, fireGun);
stage.addEventListener(MouseEvent.MOUSE_UP, stopGun);
function runEnterFrame(event:Event):void
{
radians = Math.atan2(mouseY - turret.y, mouseX - turret.x);
var degrees:Number = radians * 180 / Math.PI;
turret.barrel.rotation = degrees;
if(laserIsOn)
{
while(laserEmptyMC.numChildren)
{
laserEmptyMC.removeChildAt(0);
}
var ld:Sprite = new Sprite();
ld.graphics.lineStyle(1, 0xFF0000);
// determine start point for laser
begX = Math.cos(radians) * 61 + turret.x;
begY = Math.sin(radians) * 61 + turret.y;
ld.graphics.moveTo(begX, begY);
// determine end point for laser
for(var i:Number = 0; i < maxDist; i++)
{
endX = Math.cos(radians) * i + turret.x;
endY = Math.sin(radians) * i + turret.y;
if(wallsMC.getChildAt(4).hitTestPoint(endX, endY))
{
break;
}
if(wallsMC.getChildAt(3).hitTestPoint(endX, endY))
{
break;
}
if(wallsMC.getChildAt(2).hitTestPoint(endX, endY))
{
break;
}
if(wallsMC.getChildAt(1).hitTestPoint(endX, endY))
{
break;
}
if(wallsMC.getChildAt(0).hitTestPoint(endX, endY))
{
break;
}
}
ld.graphics.lineTo(endX, endY);
laserEmptyMC.addChild(ld);
}
}
function fireGun(event:MouseEvent):void
{
laserIsOn = true;
}
function stopGun(event:MouseEvent):void
{
while(laserEmptyMC.numChildren)
{
laserEmptyMC.removeChildAt(0);
}
laserIsOn = false;
}
the code works great… however, i’m trying to replace all those repetitive “if” statements into a simple “for loop”… but i’m not getting the same result…
this is the code with the “for loop” version…
var radians:Number;
var begX:Number;
var begY:Number;
var endX:Number;
var endY:Number;
var maxDist:Number = 500;
var laserIsOn:Boolean = false;
stage.addEventListener(Event.ENTER_FRAME, runEnterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, fireGun);
stage.addEventListener(MouseEvent.MOUSE_UP, stopGun);
function runEnterFrame(event:Event):void
{
radians = Math.atan2(mouseY - turret.y, mouseX - turret.x);
var degrees:Number = radians * 180 / Math.PI;
turret.barrel.rotation = degrees;
if(laserIsOn)
{
while(laserEmptyMC.numChildren)
{
laserEmptyMC.removeChildAt(0);
}
var ld:Sprite = new Sprite();
ld.graphics.lineStyle(1, 0xFF0000);
// determine start point for laser
begX = Math.cos(radians) * 61 + turret.x;
begY = Math.sin(radians) * 61 + turret.y;
ld.graphics.moveTo(begX, begY);
// determine end point for laser
for(var i:Number = 0; i < maxDist; i++)
{
endX = Math.cos(radians) * i + turret.x;
endY = Math.sin(radians) * i + turret.y;
for(var j:Number = 0; j < (wallsMC.numChildren - 1); j++)
{
if(wallsMC.getChildAt(j).hitTestPoint(endX, endY))
{
break;
}
}
}
ld.graphics.lineTo(endX, endY);
laserEmptyMC.addChild(ld);
}
}
function fireGun(event:MouseEvent):void
{
laserIsOn = true;
}
function stopGun(event:MouseEvent):void
{
while(laserEmptyMC.numChildren)
{
laserEmptyMC.removeChildAt(0);
}
laserIsOn = false;
}
so what the hell am i doing wrong and what is the right way of doing this?