1

J'essaie de développer un jeu Snake de base qui implique des cinématiques inverses et des machines d'état. J'essaie de l'obtenir quand le premier segment du serpent interagit avec une certaine "souris", il disparaît. Cependant, quand je le fais, cela ne fonctionne pas et je finis par obtenir ArgumentError: Erreur # 2025: Le DisplayObject fourni doit être un enfant de l'appelant.ArgumentError: Suppression d'un enfant de l'étape

Voici mon code:

package 
 
{ 
 
\t import agent.Agent; 
 
\t import flash.display.Sprite; 
 
\t import flash.display.StageAlign; 
 
\t import flash.display.StageScaleMode; 
 
\t import flash.events.Event; 
 
\t import flash.events.MouseEvent; 
 
\t import flash.events.KeyboardEvent; 
 
\t import flash.geom.Point; 
 
\t public class Main extends Sprite 
 
\t { 
 
\t \t private var Agents:Vector.<Agent>; 
 
\t \t \t \t private var segments:Array; 
 
\t \t private var numSegments:uint = 150; 
 
\t \t private var player:Point = new Point (15, 15) 
 
\t \t public function Main():void 
 
\t \t { 
 
\t \t \t if (stage) init(); 
 
\t \t \t else addEventListener(Event.ADDED_TO_STAGE, init); 
 
\t \t } 
 
\t \t 
 
\t \t private function init(e:Event = null):void 
 
\t \t { 
 
\t \t \t stage.align = StageAlign.TOP_LEFT; 
 
\t \t \t stage.scaleMode = StageScaleMode.NO_SCALE; 
 
\t \t \t segments = new Array(); 
 
\t \t \t for(var i:uint = 0; i < numSegments; i++) 
 
\t \t \t { 
 
\t \t \t \t var segment:Segment = new Segment (5, 10); 
 
\t \t \t \t addChild(segment); 
 
\t \t \t \t segments.push(segment); 
 
\t \t \t } 
 
\t \t \t //updatePoint(); 
 
\t \t \t addEventListener(Event.ENTER_FRAME, onEnterFrame); 
 

 
\t \t \t removeEventListener(Event.ADDED_TO_STAGE, init); 
 
\t \t \t stage.scaleMode = StageScaleMode.NO_SCALE; 
 
\t \t \t stage.align = StageAlign.TOP_LEFT; 
 
\t \t \t // entry point 
 
\t \t \t graphics.beginFill(0xeeeeee); 
 
\t \t \t graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); 
 
\t \t \t 
 
\t \t \t Agents = new Vector.<Agent>(); 
 
\t \t \t addEventListener(Event.ENTER_FRAME, gameloop); 
 
\t \t \t for (var x:int = 0; x < 10; x++) 
 
\t \t \t { 
 
\t \t \t \t var a:Agent = new Agent(); 
 
\t \t \t \t addChild(a); 
 
\t \t \t \t Agents.push(a); 
 
\t \t \t \t a.x = Math.random() * 10; 
 
\t \t \t \t a.y = Math.random() * 10; 
 
\t \t \t } 
 
\t \t \t stage.addEventListener(MouseEvent.CLICK, createAgent); 
 
\t \t } 
 
\t \t 
 
\t \t private function createAgent(e:MouseEvent):void 
 
\t \t { 
 
\t \t \t var a:Agent = new Agent(); 
 
\t \t \t stage.addChild(a); 
 
\t \t \t Agents.push(a); 
 
\t \t \t a.x = mouseX; 
 
\t \t \t a.y = mouseY; 
 
\t \t } 
 
\t \t 
 
\t \t private function gameloop(e:Event):void 
 
\t \t { 
 
\t \t \t for each (var a: Agent in Agents) { 
 
\t \t \t \t a.update(); 
 
\t \t \t \t trace ("Follow me on Twitter."); 
 
\t \t \t \t for each(var target: Segment in segments) 
 
\t \t \t \t { 
 
\t \t \t \t \t if (target.hitTestPtarget.x, a.y + target.y, true)) 
 
\t \t \t \t \t { 
 
\t \t \t \t \t \t stage.removeChild(a); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t } 
 
\t \t } 
 
\t \t private function onEnterFrame(event:Event):void 
 
\t \t { 
 
\t \t \t drag(segments[0], player.x, player.y); 
 
\t \t \t stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
 

 
\t \t \t for(var i:uint = 1; i < numSegments; i++) 
 
\t \t \t { 
 
\t \t \t \t var segmentA:Segment = segments[i]; 
 
\t \t \t \t var segmentB:Segment = segments[i - 1]; 
 
\t \t \t \t drag(segmentA, segmentB.x, segmentB.y); 
 
\t \t \t } 
 
\t \t } 
 
\t \t private function keyDown (evt: KeyboardEvent): void { 
 
\t \t \t //87=w 68=d 83=s 65=a 
 
\t \t \t if (evt.keyCode == 87) 
 
\t \t \t { 
 
\t \t \t \t player.y-=50; 
 
\t \t \t } 
 
\t \t \t else if (evt.keyCode == 83) 
 
\t \t \t { 
 
\t \t \t \t player.y+=50; 
 
\t \t \t } 
 
\t \t \t else if (evt.keyCode == 68) 
 
\t \t \t { 
 
\t \t \t \t player.x+=50; 
 
\t \t \t } 
 
\t \t \t else if (evt.keyCode == 65) 
 
\t \t \t { 
 
\t \t \t \t player.x-=50; 
 
\t \t \t } 
 
\t \t \t trace (player.x + " " + player.y); 
 
\t \t } 
 
\t \t private function drag(segment:Segment, xpos:Number, ypos:Number):void 
 
\t \t { 
 
\t \t \t 
 
\t \t \t var dx:Number = xpos - segment.x; 
 
\t \t \t var dy:Number = ypos - segment.y; 
 
\t \t \t var angle:Number = Math.atan2(dy, dx); 
 
\t \t \t segment.rotation = angle * 180/Math.PI; 
 
\t \t \t 
 
\t \t \t var w:Number = segment.getPin().x - segment.x; 
 
\t \t \t var h:Number = segment.getPin().y - segment.y; 
 
\t \t \t segment.x = xpos - w; 
 
\t \t \t segment.y = ypos - h; 
 
\t \t } 
 

 
\t \t 
 
\t } 
 
}

J'ai essayé de regarder d'autres postes avec le même sujet, mais je ne comprends pas ce que je fais mal. Toute aide serait grandement appréciée!

Répondre

2

Vous ajoutez des Agents et des Segments localement (dans Main) et plus tard vous essayez de les supprimer de la scène (qui est le niveau supérieur du swf et est un autre objet d'affichage). Ou step.addChild (...) dans votre fonction init ou (ceci est une meilleure option imo) remplacez stage.removeChild (...) par un removeChild (...) partout ailleurs - cela maintiendra les objets dans un espace principal local (qui sait, peut-être que vous voudriez vous déplacer plus tard autour de votre Main, tout rendre invisible à la fois etc).