2013-12-10 4 views
0

Мой код работает нормально. Предположим, что вы набрали одно изображение, когда пользователь нажимает 1 и заменяет его другим, когда он/она нажимает 2. Но когда я нажимаю 1 или 2 после того, как ранее нажимаю либо тот же номер, я получаю ошибку # 2025. Пример: нажатие 1 и повторное нажатие 1.ActionScript 3: Ошибка # 2025

ArgumentError: Ошибка # 2025: поставляемый объект DisplayObject должен быть дочерним элементом вызывающего. в flash.display :: DisplayObjectContainer/RemoveChild() в warren_fla :: MainTimeline/reportKeyDown2()

Код

import flash.events.KeyboardEvent; 

var bdata = new image1(stage.stageWidth, stage.stageHeight); 
var bdata2 = new image2(stage.stageWidth, stage.stageHeight); 
var bmp = new Bitmap(bdata); 
var bmp2 = new Bitmap(bdata2); 

function reportKeyDown(event:KeyboardEvent):void 
{ 
if (event.keyCode == 49) { 
    //trace("1 is pressed"); 
    bmp.x = 230; 
    bmp.y = 150; 
    addChild(bmp); 
} 
if (contains(bmp2)) { 
    removeChild(bmp2); 
    } 
} 

function reportKeyDown2(event:KeyboardEvent):void 
{ 
if (event.keyCode == 50) { 
    //trace("2 is pressed"); 
    bmp2.x = 230; 
    bmp2.y = 150; 
    addChild(bmp2); 
    removeChild(bmp); 
} 

} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown2); 

ответ

6

Вы удаляете bmp без проверки, если это уже ребенок.

function reportKeyDown2(event:KeyboardEvent):void 
{ 
    if (event.keyCode == 50) { 
     //trace("2 is pressed"); 
     bmp2.x = 230; 
     bmp2.y = 150; 
     addChild(bmp2); 
     if(contains(bmp)) 
      removeChild(bmp); 
    } 
} 

Кроме того, ваш код может быть переработан в этой простой версии:

import flash.events.KeyboardEvent; 
import flash.ui.Keyboard; 

var bdata = new image1(stage.stageWidth, stage.stageHeight); 
var bdata2 = new image2(stage.stageWidth, stage.stageHeight); 
var bmp = new Bitmap(bdata); 
var bmp2 = new Bitmap(bdata2); 

function reportKeyDown(event:KeyboardEvent):void 
{ 
    if (event.keyCode == Keyboard.NUMBER_1) { 
     swapBitmaps(bmp, bmp2);    
    } else if (event.keyCode == Keyboard.NUMBER_2) { 
     swapBitmaps(bmp2, bmp);    
    } 
} 

function swapBitmaps(first:Bitmap, second:Bitmap):void 
{ 
     first.x = 230; 
     first.y = 150; 
     addChild(first); 
     if(contains(second)) {   
      removeChild(second); 
     } 
} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); 
+0

Спасибо. +1 для эффективности – Warren

0

Вы потенциально добавив несколько раз ВМР в. То же самое с удалением, но если вы попытаетесь удалить ребенка, который не находится в списке отображения, вы получите сообщение об ошибке, которое вы видите. Попробуйте использовать этот код во всех случаях, когда вы добавляете или удаления:

if (!contains(bmp)) { addChild(bmp); } // or bmp2 

if (contains(bmp)) { removeChild(bmp); } // or bmp2 

----------- редактировать -------------

ОК, в то время как, очевидно, вы можете добавитьChild без проверки (поскольку addChild удалит объект из дерева отображения), эффективнее выполнить проверку. На самом деле, похоже, примерно в 3 раза быстрее. Этот тест:

var clip = new MovieClip(); 
var i,j,tin,dur; 
var tries = 100000; 

for (j=0; j<5; j++) { 
    trace("-------------------"); 

    tin = new Date().time; 
    for (i=0; i<tries; i++) { if (!contains(clip)) { addChild(clip); } } 
    dur = new Date().time - tin; 
    trace("Check Adding: "+dur); 

    removeChild(clip); 

    tin = new Date().time; 
    for (i=0; i<tries; i++) { addChild(clip); } 
    dur = new Date().time - tin; 
    trace("Just Adding: "+dur); 
} 

выходы:

 
------------------- 
Check Adding: 9 
Just Adding: 25 
------------------- 
Check Adding: 8 
Just Adding: 25 
------------------- 
Check Adding: 9 
Just Adding: 24 
------------------- 
Check Adding: 9 
Just Adding: 24 
------------------- 
Check Adding: 9 
Just Adding: 25 
2

В reportKeyDown(), попробуйте подвигать:

if (contains(bmp2)) { 
    removeChild(bmp2); 
} 

Внутри если утверждение, что проверяет код ключа:

function reportKeyDown(event:KeyboardEvent):void 
{ 
    if (event.keyCode == 49) { 
     //trace("1 is pressed"); 
     bmp.x = 230; 
     bmp.y = 150; 
     addChild(bmp); 

     if (contains(bmp2)) { 
      removeChild(bmp2); 
     } 
    } 
} 

И в reportKeyDown2 проверьте, чтобы bmp был ребенком перед его удалением:

function reportKeyDown2(event:KeyboardEvent):void 
{ 
    if (event.keyCode == 50) { 
     //trace("2 is pressed"); 
     bmp2.x = 230; 
     bmp2.y = 150; 
     addChild(bmp2); 

     if(contains(bmp)) 
     { 
      removeChild(bmp); 
     } 
    } 
} 
+0

Спасибо. Отлично работает. – Warren

Смежные вопросы