1

Я пытаюсь разработать базовую игру Snake, которая включает в себя некоторые обратные кинематические и государственные машины. Я пытаюсь это сделать, когда первый сегмент змеи взаимодействует с определенной «мышью», он исчезает. Однако, когда я это делаю, он не работает, и я получаю ArgumentError: Ошибка # 2025: поставляемый DisplayObject должен быть дочерним элементом вызывающего.ArgumentError: Удаление ребенка с этапа

Вот мой код:

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 } 
 
}

Я пытался смотреть на другие должности с той же теме, но я просто не понимаю, что я делаю неправильно. Любая помощь будет принята с благодарностью!

ответ

2

Вы добавляете агенты и сегменты локально (в основном), а затем вы пытаетесь удалить их со сцены (что является верхним уровнем swf и является другим экранным объектом).

Либо сделайте stage.addChild (...) в своей функции init или (это лучший вариант imo) замените stage.removeChild (...) на removeChild (...) всюду - это будет сохраняться объекты в локальном Главном пространстве (кто знает, может быть, вам захочется передвигаться по Майну позже, сделать все невидимым сразу и т. д.).

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