2012-11-01 31 views
0

晚上好,添加对象的单个实例到舞台

我似乎无法让我的代码只添加一个对象的实例到舞台上。它似乎增加了至少3个对象的阶段。添加的对象是r2,r3和r4。

stop(); 

import flash.events.Event; 
stage.focus=stage; 
var upKeyDown5:Boolean = false; 
var rightKeyDown5:Boolean = false; 
var downKeyDown5:Boolean = false; 
var leftKeyDown5:Boolean = false; 
var enterkey:Boolean = false; 
var interaction:Boolean = false; 
p5.addEventListener(Event.ENTER_FRAME, moveChar5); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown5); 
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp5); 
Mouse.hide(); 
function moveChar5(e:Event):void{ 
if(downKeyDown5 && !upKeyDown5 && !rightKeyDown5 && !leftKeyDown5) 
{ 
    p5.gotoAndStop("walk_down"); 
    if(p5.y < 492.75) 
     p5.y += 6; 
} 
if(upKeyDown5 && !downKeyDown5 && !rightKeyDown5 && !leftKeyDown5) 
{ 
    p5.gotoAndStop("walk_up"); 
    if(p5.y > 202.85) 
     p5.y -= 6; 
} 
if(rightKeyDown5 && !upKeyDown5 && !downKeyDown5 && !leftKeyDown5) 
{ 
    p5.gotoAndStop("walk_right"); 
    if(p5.x < 871.5) 
     p5.x += 6; 
} 
if(leftKeyDown5 && !upKeyDown5 && !rightKeyDown5 && !downKeyDown5) 
{ 
    p5.gotoAndStop("walk_left"); 
    if(p5.x > 203.65) 
     p5.x -= 6; 
} 
if(enterkey && interaction && p5.hitTestObject(c1)){ 
    if (!(Boolean(stage.getChildByName('r2')))) { 
     var rat2:r2; 
     rat2 = new r2(); 
     addChild(rat2); 
     rat2.y=38; 
     rat2.x=32; 
    } 
} 
if(enterkey && interaction && p5.hitTestObject(c2)){ 
    if (!(Boolean(stage.getChildByName('r3')))) { 
     var rat3:r3; 
     rat3 = new r3(); 
     addChild(rat3); 
     rat3.y=38; 
     rat3.x=32; 
    } 
} 
if(enterkey && interaction && p5.hitTestObject(c3)){ 
    if (!(Boolean(stage.getChildByName('r4')))) { 
     var rat4:r4; 
     rat4 = new r4(); 
     addChild(rat4); 
     rat4.y=38; 
     rat4.x=32; 
    } 
} 
} 


function checkKeysDown5(event:KeyboardEvent):void{ 
if(event.keyCode == 87){ 
    upKeyDown5 = true; 
} 
if(event.keyCode == 68){ 
    rightKeyDown5 = true; 
} 
if(event.keyCode == 83){ 
    downKeyDown5 = true; 
} 
if(event.keyCode == 65){ 
    leftKeyDown5 = true; 
} 
if (event.keyCode == 13){ 
    enterkey = true; 
} 
} 


function checkKeysUp5(event:KeyboardEvent):void{ 
if(event.keyCode == 87){ 
    upKeyDown5 = false; 
    p5.gotoAndStop("still_up"); 
} 

if(event.keyCode == 68){ 
    rightKeyDown5 = false; 
    p5.gotoAndStop("still_right"); 
} 

if(event.keyCode == 65){ 
    leftKeyDown5 = false; 
    p5.gotoAndStop("still_left"); 
} 

if(event.keyCode == 83){ 
    downKeyDown5 = false; 
    p5.gotoAndStop("still_down"); 
} 

if (event.keyCode == 13){ 
    enterkey = false; 
} 

if(p5.hitTestObject(c1) || p5.hitTestObject(c2) || p5.hitTestObject(c3)){ 
    p5.gotoAndStop("interaction"); 
    interaction = true; 
} 
else 
    interaction = false; 
} 

在此先感谢

回答

2

这将是更有效和更清洁的使用switch语句,而不是所有的if语句(如果您只想唯一要满足这些条件之一者)

你是我认为跟踪你的老鼠的方式 - 例如。使用stage.getChildByName
下面是一个例子,以及一些其他潜在问题的注释。

switch(true){ 
    case (enterkey && interaction && p5.hitTestObject(c1)): 
     if (!(Boolean(stage.getChildByName('r2')))) { //your not giving your rat a name so this will always return false, plus you're not adding the rat to the stage but to this class 
      var rat2:r2; 
      rat2 = new r2(); 
      addChild(rat2); //use stage.addChild if you want the above check (stage.getChildByName) to work 
      rat2.y=38; 
      rat2.x=32; 
      rat2.name = "r2"; //if you want the above check to work 

      break; //break out of the switch if you don't want any of the others evaluate since this rat got added 
     } 

    //do a case for your other blocks 
} 

这将是最好不要使用stage.getChidByName可言,而是创造这样的方法:

function checkRatExists(ratClass:Class):Boolean { 
    var tmp:DisplayObject; 
    var i:int = numChildren; 
    while(i--){ 
     tmp = getChildAt(i); 
     if(tmp is ratClass){ 
      return true; 
     } 
    } 
    return false; 
} 

然后使用,而不是stage.getChildByName新功能:

if (!checkRatExists(r2)) //r2 is the class of rat you want to check 

从您的问题顺便说一句,这将是更清洁的创建方法/功能做你的RA牛逼的定位和添加,而不是过去,一遍又一遍重复的代码...

function addRat(rat:RatCommonBaseClass, ratName:String):void { 
     addChild(rat); 
     rat.y=38; 
     rat.x=32; 
     rat.name = ratName; 
} 

//now you can just do this for all your rats: 
addRat(new r2(),"r2);  
+0

很好的答案 - 不是像我一样只是直接回答问题,而是走上了一步,给了他有用的提示和提示。 –

+0

@LondonDrugs_MediaServices谢谢:)这工作完美 – Crossman

0

您不必为您的语句的其他条件,你添加的对象,所以最有可能发生的情况是,所有的陈述都立即满足条件。添加一个else语句应该避免这种情况发生:

if(enterkey && interaction && p5.hitTestObject(c1)){ 
    if (!(Boolean(stage.getChildByName('r2')))) { 
     var rat2:r2; 
     rat2 = new r2(); 
     addChild(rat2); 
     rat2.y=38; 
     rat2.x=32; 
    } 
} 
else if(enterkey && interaction && p5.hitTestObject(c2)){ 
    if (!(Boolean(stage.getChildByName('r3')))) { 
     var rat3:r3; 
     rat3 = new r3(); 
     addChild(rat3); 
     rat3.y=38; 
     rat3.x=32; 
    } 
} 
else if(enterkey && interaction && p5.hitTestObject(c3)){ 
    if (!(Boolean(stage.getChildByName('r4')))) { 
     var rat4:r4; 
     rat4 = new r4(); 
     addChild(rat4); 
     rat4.y=38; 
     rat4.x=32; 
    } 
} 

这样,它会先检查,看看是否P5已经达到C1且仅当它没有将它检查是否已经达到C2,然后同样的事情为c3。

+0

我试过这个解决方案之前,我发布的问题,但它不工作,但谢谢你试图帮助。可能在不同的环境下工作。 – Crossman