2013-08-31 106 views
1

当SWF被加载时,有没有什么办法可以自动点击XY舞台坐标?Actionscript 3自动鼠标点击XY舞台坐标

编辑:顺便说一下,这是整个代码,它是一个指定的YouTube视频。只需要点击提示上的任意位置即可在SWF加载后自动播放它。

Security.allowDomain("www.youtube.com"); 


var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit); 
loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3")); 

function onLoaderInit(event:Event):void { 
    addChild(loader); 
    loader.content.addEventListener("onReady", onPlayerReady); 
    loader.content.addEventListener("onError", onPlayerError); 
    loader.content.addEventListener("onStateChange", onPlayerStateChange); 
    loader.content.addEventListener("onPlaybackQualityChange", 
     onVideoPlaybackQualityChange); 
} 

function onPlayerReady(event:Event):void { 

    trace("player ready:", Object(event).data); 


    player = loader.content; 

    player.setSize(300, 250); 
    player.cueVideoById("AfTCtRDsWVw",0); 
    player.mute(); 
} 



function onPlayerError(event:Event):void { 
    trace("player error:", Object(event).data); 
} 

function onPlayerStateChange(event:Event):void { 
    trace("player state:", Object(event).data); 
} 

function onVideoPlaybackQualityChange(event:Event):void { 
    trace("video quality:", Object(event).data); 
} 
+0

你究竟需要做什么?请描述更多 – Cherniv

+0

我刚刚在上面的问题中添加了整个代码。谢谢! – emotheraphy

回答

3

是的,你应该只手动调度的MouseEvent.CLICK事件到您的阶段:

var yourX:Number = 40; //Whatever you want 
var yourY:Number = 40; //Whatever you want 
//Make sure you have a link to the stage (usually after Event.ADDED_TO_STAGE event occured) 
stage.dispatchEvent(new MouseEvent(
    MouseEvent.CLICK, 
    true, 
    false, 
    yourX, 
    yourY); 

如果您需要一定的DisplayObject涉及到这个的MouseEvent,你应该通过一个附加参数的MouseEvent构造:

var yourX:Number = 40; //Whatever you want 
var yourY:Number = 40; //Whatever you want 
//Make sure you have a link to the stage (usually after Event.ADDED_TO_STAGE event occured) 
stage.dispatchEvent(new MouseEvent(
    MouseEvent.CLICK, 
    true, 
    false, 
    yourX, 
    yourY, 
    linkToYourRelatedDisplayObject); 

== == UPDATE

我们我已经做到了。有点“黑客”,就在这里。 您的YouTube播放器包含一个safeLoader对象,其中包含一个videoApplication,其中包含一个LargePlayerButton。这个LargePlayerButton有一个MouseEvent.CLICK事件监听器,所以我们需要将事件分派给这个按钮,而不是将它分派到舞台上。 下面是与autoClick模拟的完整代码:

import flash.events.MouseEvent; 
import flash.events.Event; 
import flash.display.DisplayObjectContainer; 

// The player SWF file on www.youtube.com needs to communicate with your host 
// SWF file. Your code must call Security.allowDomain() to allow this 
// communication. 
Security.allowDomain("www.youtube.com"); 

// This will hold the API player instance once it is initialized. 
var player:Object; 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit); 
loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3")); 

function onLoaderInit(event:Event):void { 
    addChild(loader); 
    loader.content.addEventListener("onReady", onPlayerReady); 
} 

function autoClick():void 
{ 
    //========================= 
    //Some nested children, we need to dig through a bit to get to the LargePlayButton 
    var safeLoader:DisplayObjectContainer = (loader.content as DisplayObjectContainer).getChildAt(0) as DisplayObjectContainer; 
    var videoApplication:DisplayObjectContainer = safeLoader.getChildAt(0) as DisplayObjectContainer; 
    var largePlayBtn:DisplayObjectContainer = videoApplication.getChildAt(6) as DisplayObjectContainer; 
    //========================= 
    //And finally dispatching our event to this button. It will think that a person has clicked it 
    largePlayBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK, 
             true, 
             true, 
             stage.stageWidth/2, 
             stage.stageHeight/2)); 

} 

function onPlayerReady(event:Event):void { 
    // Event.data contains the event parameter, which is the Player API ID 
    trace("player ready:", Object(event).data); 

    // Once this event has been dispatched by the player, we can use 
    // cueVideoById, loadVideoById, cueVideoByUrl and loadVideoByUrl 
    // to load a particular YouTube video. 
    player = loader.content; 
    // Set appropriate player dimensions for your application 
    player.setSize(300, 250); 
    player.cueVideoById("AfTCtRDsWVw",0); 
    //==================================================== 
    //As long as player is loaded we can call our function 
    autoClick(); 
} 

这是一个很好的锻炼,欢呼:)

+0

我刚才编辑了我的questin以显示整个代码。 – emotheraphy

+0

整洁,我不知道MouseEvent构造函数有多余的参数(以及更多)。 –

+0

我应该如何将此代码合并到上面的代码中?我似乎无法让它工作..谢谢! – emotheraphy

-1

我很怀疑,这是可能的,明显的安全原因:http://www.adobe.com/devnet/flashplayer/articles/fplayer10_uia_requirements.html

+0

感谢您的回应,但有什么方法可以自动播放视频,因此用户不必首先点击它? – emotheraphy

+0

从来没有与YouTube合作,但我想你应该使用他们的API: https://developers.google.com/youtube/flash_api_reference – djib

+0

是否有可能将此代码并入上面的代码来完成这项工作?如果是,那么如何? 'function simulateClick(x:Number,y:Number):void var e:MouseEvent = new MouseEvent(MouseEvent.CLICK,true,false,x,y) stage.dispatchEvent(e); }' – emotheraphy

0

的Youtube似乎有一个智能反黑客功能。我可以在IDE上获得SafeLoader的子项,但在Flash播放器或网络上,SafeLoader无法访问,并且之后没有任何子项可以控制。这就是代码在IDE上运行但不在外部的原因。也许它与沙盒安全有关,但也许它更复杂。