嘿伙计们,所以我在这个开始屏幕上有一个名为Warning: Invalid argument supplied for foreach()...
Warning: Illegal string offset 'profile_first_name'...
的影片剪辑是另一个名为startScreen
的影片剪辑,在mcOptions中你可以点击按钮来选择你的选项。我希望能够点击嵌套按钮但没有注册。以下是我设置的方法:
mcOptions
没有任何内容可追溯。难道我做错了什么?任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
未经测试(此处没有AS3编译器),但您可以尝试:
startScreen.mcOptions.mcPlay.name = "mc_Play";
startScreen.mcOptions.mcStore.name = "mc_Store";
startScreen.mcOptions.addEventListener(MouseEvent.CLICK, onTap);
private function onTap(e:MouseEvent):void
{
if (e.currentTarget.name == "mc_Play" )
{
trace("PLAY OPTION TRUE");
}
else if (e.currentTarget.name == "mc_Store" )
{
trace("PLAY OPTION TRUE");
}
}
如果您设置为e.currentTarget
(无论是原始代码还是我的版本),e.target.currentTarget
也可能效果更好。
答案 1 :(得分:0)
鼠标事件是一个冒泡事件(请在此处阅读:Event Bubbling, and Stop Propagation),因此 e.currentTarget 和 e.target 可能是不同的对象。属性 e.currentTarget 将始终指向您订阅方法的对象,在您的情况下为 startScreen.mcOptions 。如果您想在一个瓶颈容器中收集来自不同对象的事件,您应该使用 e.target 来了解哪个是哪个。
请注意, e.target 将是用于触发鼠标事件的最具鼠标功能的显示对象: SimpleButton 或 TextField ,或精灵或 MovieClip 或任何其他 InteractiveObject mouseChildren 属性设置为 false
startScreen.mcOptions.addEventListener(MouseEvent.CLICK, onTap);
private function onTap(e:MouseEvent):void
{
trace("Event from:", e.target, e.target.name);
switch (e.target.name)
{
case "mcPlay":
trace("PLAY OPTION TRUE");
break;
case "mcStore":
trace("STORE OPTION TRUE");
break;
}
}
UPD:我这样做是为了回答另一个问题,但它可以正常运行,因为您希望代码也能正常运行。我不清楚你的理由究竟是什么错,因为我对这个理论没有错。
package
{
import flash.display.Sprite;
import flash.geom.Point;
import flash.events.MouseEvent;
import flash.events.Event;
public class Snap extends Sprite
{
private var Circus:Vector.<Sprite>;
private var Dots:Vector.<Point>;
public function Snap()
{
Dots = new Vector.<Point>;
Circus = new Vector.<Sprite>;
// Create snap points, put them on stage and keep their coordinates.
for (var i:int = 1; i * 100 < stage.stageWidth; i++)
{
for (var j:int = 1; j * 100 < stage.stageHeight; j++)
{
var aDot:Sprite = new Sprite;
var aPos:Point = new Point(i * 100, j * 100);
aDot.graphics.beginFill(0xFF0000, 0.3);
aDot.graphics.drawCircle(0, 0, 4);
aDot.x = aPos.x;
aDot.y = aPos.y;
addChild(aDot);
Dots.push(aPos);
}
}
var aCircas:int = 2 + 3 * Math.random();
// Add random number of draggable objects.
while (Circus.length < aCircas)
{
Circus.push(addCirca());
}
// Hook the mouse interaction.
addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
}
// This method adds a draggable circle of random radius, color, position.
private function addCirca():Sprite
{
var result:Sprite = new Sprite;
result.name = "Circa";
result.graphics.lineStyle(0, 0);
result.graphics.beginFill(0x1000000 * Math.random(), 0.5);
result.graphics.drawCircle(0, 0, 20 + 20 * Math.random());
result.x = stage.stageWidth * Math.random();
result.y = stage.stageHeight * Math.random();
addChild(result);
result.buttonMode = true;
result.useHandCursor = true;
return result;
}
// *** DRAGGING AN ITEM ** //
// Snap radius.
private var toleRance:int = 20
// Mouse offset.
private var offx:Number = 0;
private var offy:Number = 0;
// Dragged object.
private var TheDrag:Sprite;
private function startDragging(e:MouseEvent):void
{
// Get the dragged object reference.
TheDrag = e.target as Sprite;
trace("Try dragging:", TheDrag, TheDrag.name);
if (TheDrag.name != "Circa") return;
// Bring it to front.
setChildIndex(TheDrag, numChildren - 1);
// Record the mouse offset. If you comment the next 2 lines
// the object will just snap to mouse by its center.
offx = TheDrag.x - mouseX;
offy = TheDrag.y - mouseY;
// Watch the object position every frame.
addEventListener(Event.ENTER_FRAME, onFrame);
// Subscribe for certain events that mean the end of dragging.
stage.addEventListener(Event.MOUSE_LEAVE, stopDragging);
stage.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}
private function onFrame(e:Event):void
{
// Get new object (x,y) according to the mouse position.
var aPos:Point = new Point;
aPos.x = mouseX + offx;
aPos.y = mouseY + offy;
// Browse through the list of snap points.
for (var i:int = 0; i < Dots.length; i++)
{
// Snap to a point within tolerance pixels radius.
if (Point.distance(aPos, Dots[i]) < toleRance)
{
aPos = Dots[i];
break;
}
}
TheDrag.x = aPos.x;
TheDrag.y = aPos.y;
}
private function stopDragging(e:Event):void
{
TheDrag = null;
// Stop monitoring.
removeEventListener(Event.ENTER_FRAME, onFrame);
// Stop waiting for events to cancel dragging.
stage.removeEventListener(Event.MOUSE_LEAVE, stopDragging);
stage.removeEventListener(MouseEvent.MOUSE_UP, stopDragging);
}
}
}