PDA

Volledige versie bekijken : The supplied DisplayObject must be a child of the caller


simie55
%Europe/Berlin %425 %2010, 11:12
Afgesplitst van: http://www.flashfocus.nl/forum/showthread.php?t=50456

Om een oud topic maar even nieuw leven in te blazen

Ik heb ong het zelfde probleem als hier, hij verwijderd de enemy wel maar onzichtbaar bestaat hij toch?
En ik krijg dus de melding:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at ParallaxDemo/onTick()
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
at flash.utils::Timer/flash.utils:Timer::tick()hier de code van de .as waar de enemy verwijderd word:

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;

public class ParallaxDemo extends MovieClip
{
public var car:Car;
public var road:Road;
public var road2:Road;
public var roadContainer:MovieClip;
public var roadBreadth:Number;
public var hills:Hills;
public var hills2:Hills;
public var hillsBreadth:Number;
public var hillsContainer:MovieClip;
public var mountains:Mountains;
public var mountains2:Mountains;
public var mountainsBreadth:Number;
public var mountainsContainer:MovieClip;
public var sky:Sky;
public var skyContainer:MovieClip;
public var tree:Tree;
public var treeBreadth:Number;
public var treeContainer:MovieClip;
public var army:Array;
public var enemy:Enemy;
public var avatar:Avatar;
public var gameTimer:Timer;


public function ParallaxDemo()
{

car = new Car();
road = new Road();
road2 = new Road();
roadBreadth = 653.7;

hills = new Hills();
hills2 = new Hills();
hillsBreadth = 890.5;

mountains = new Mountains();
mountains2 = new Mountains();
mountainsBreadth = 751.5;

sky = new Sky();

tree = new Tree();
treeBreadth = 1000.0;

car.x = 275.0;
car.y = 250.0;
road.x = 0.0;
road.y = 294.0;
road2.x = road.x + roadBreadth;
road2.y = road.y;

hills.x = 0;
hills.y = 14.5;
hills2.x = hills.x + hillsBreadth;
hills2.y = hills.y;

mountains.x = 0;
mountains.y = 63.0;
mountains2.x = mountains.x + mountainsBreadth;
mountains2.y = mountains.y;

sky.x = 0;
sky.y = 0;

tree.x = 780.0;
tree.y = 175.0;

roadContainer = new MovieClip();
roadContainer.addChild( road );
roadContainer.addChild( road2 );
roadContainer.addChild( car );

hillsContainer = new MovieClip();
hillsContainer.addChild( hills );
hillsContainer.addChild( hills2 );

mountainsContainer = new MovieClip();
mountainsContainer.addChild( mountains );
mountainsContainer.addChild( mountains2 );

skyContainer = new MovieClip();
skyContainer.addChild( sky );

treeContainer = new MovieClip();
treeContainer.addChild( tree );

stage.addChild( skyContainer );
stage.addChild( mountainsContainer );
stage.addChild( hillsContainer );
stage.addChild( roadContainer );
army = new Array();
var newEnemy = new Enemy( 500, 350 );
stage.addChild( newEnemy );
army.push( newEnemy );
stage.addChild( treeContainer );


gameTimer = new Timer( 25 );
gameTimer.addEventListener( TimerEvent.TIMER, onTick );
gameTimer.start();

addEventListener( Event.ENTER_FRAME, onEnterFrame );
}

public function onTick( timerEvent:TimerEvent ):void
{

if ( Math.random() < 0.02 )
{
var randomY:Number = Math.random() * 150 + 300;
var newEnemy:Enemy = new Enemy( 550, randomY );
army.push( newEnemy );
stage.addChild( newEnemy );
}

for each ( var enemy:Enemy in army )
{
enemy.moveDownABit();
if ( car.hitTestObject( enemy ) )
{
stage.removeChild( enemy );
//hier zou ik dan army.splice() moeten gebruiken?
}
}
}

public function onEnterFrame( evt:Event ):void
{
car.x = car.x + 10;
roadContainer.x = 275 - car.x;
if ( road.x + roadBreadth + roadContainer.x < 0 )
{
road.x = road.x + (2 * roadBreadth);
}
if ( road2.x + roadBreadth + roadContainer.x < 0 )
{
road2.x = road2.x + (2 * roadBreadth);
}

hillsContainer.x = (275 - car.x) * 1/5;
if ( hills.x + hillsBreadth + hillsContainer.x < 0 )
{
hills.x = hills.x + (2 * hillsBreadth);
}
if ( hills2.x + hillsBreadth + hillsContainer.x < 0 )
{
hills2.x = hills2.x + (2 * hillsBreadth);
}

mountainsContainer.x = (275 - car.x) * 1/16;
if ( mountains.x + mountainsBreadth + mountainsContainer.x < 0 )
{
mountains.x = mountains.x + (2 * mountainsBreadth);
}
if ( mountains2.x + mountainsBreadth + mountainsContainer.x < 0 )
{
mountains2.x = mountains2.x + (2 * mountainsBreadth);
}

treeContainer.x = (275 - car.x) * 3;
if ( tree.x + treeBreadth + treeContainer.x < 0 )
{
tree.x = tree.x + (2 * treeBreadth);
}

if (leftDown==true) {
car.x-=8;
}
if (upDown==true) {
car.y-=speed;
}
if (rightDown==true) {
car.x+=speed;
}
if (downDown==true) {
car.y+=speed;
}


if ( car.y < 170 + ( car.height / 2 ) )
{
car.y = 170 + ( car.height / 2 );
}
if ( car.y > 370 - ( car.height / 2 ) )
{
car.y = 370 - ( car.height / 2 );
}

}
}
}Als de auto nu de enemy raakt blijven deze even hangen, omdat hij blijkbaar blijft proberen de enemy te verwijderen terwijl dit al gebeurt is?
Hopelijk is dit makkelijk op te lossen met een Array.splice()

Iemand die me hier even verder kan helpen? alvast bedankt!

Dauntless
%Europe/Berlin %488 %2010, 12:43
Aangezien je zelf zegt dat het een erg oud topic is, heb ik het even afgesplitst. Je maakt in dat geval best een nieuw topic met een verwijzing naar het oude topic :).

Daarnaast hoort AS code in [as] tags thuis.

Dauntless
%Europe/Berlin %492 %2010, 12:48
//hier zou ik dan army.splice() moeten gebruiken?Jup :)

Het is daarnaast niet mooi om items rechtstreeks aan de stage toe te voegen. Voeg de sprites aan 'this' toe en voeg de classe zelf dan ook aan de displaylist toe (wat je waarschijnlijk al gedaan hebt)

simie55
%Europe/Berlin %510 %2010, 13:15
Bedankt voor het aanpassen van de post :)

En hoe gebruik ik deze army.splice() want ik gok dat alleen toevoegen de truc niet zal doen.

had al even wat info over splice opgezocht:

Array.splice(start,deleten,waarden);
Start = waar hij moet beginnen met editen.
Deleten = hier geeft je aan hoeveel hij er moet gaan deleten.
Waarden = deze kan je weg laten en dan zal hij hem deleten uit de array maar als je wel wat invoert hier zal hij de vorige waarden veranderen in de waarden die hier staat.


Wat geef ik dan aan als start?

Dauntless
%Europe/Berlin %512 %2010, 13:18
Maak van je for each loop een gewone for loop die loopt van 0 tot army.length en dan kan je de loop index gebruiken als start. Het tweede argument is 1, want je wil maar 1 enemy verwijderen.

simie55
%Europe/Berlin %549 %2010, 14:10
Mijn probleem is op magische wijze opgelost door het gebruik van een ander CollisionDetection systeem inplaats van hitTest :)

Zal in iedergeval nog even kijken naar het toevoegen van de items, bedankt!