【问题标题】:ArgumentError: Removing Child from StageArgumentError:从舞台中移除子级
【发布时间】:2016-11-22 21:18:23
【问题描述】:

我正在尝试开发一个包含一些逆运动学和状态机的基本 Snake 游戏。我试图得到它,所以当蛇的第一段与某个“鼠标”交互时,它就会消失。但是,当我这样做时,它不起作用,我最终得到 ArgumentError: Error #2025: The provided DisplayObject must be a child of the caller.

这是我的代码:

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

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

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

		
	}
}

我曾尝试查看具有相同主题的其他帖子,但我只是不明白我做错了什么。任何帮助将不胜感激!

【问题讨论】:

    标签: actionscript-3 actionscript inverse-kinematics kinematics


    【解决方案1】:

    您正在本地添加代理和段(在 Main 中),稍后您尝试将它们从舞台(这是 swf 的顶层并且是另一个显示对象)中删除。

    在您的 init 函数中执行 stage.addChild(...) 或(这是一个更好的选择 imo)在其他任何地方用 removeChild(...) 替换 stage.removeChild(...) - 这将保持本地 Main 空间中的对象(谁知道呢,也许您稍后会想在 Main 周围移动,让所有东西立即不可见等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多