ง่ายมากมายด้วย ExternalInterface
import flash.external.ExternalInterface; ... ExternalInterface.call("your_javascript_function()");
โดยปกติแล้วเราใช้ new Date().getTime() เพื่อให้ได้เวลาปัจจุบันเพื่อไปเทียบในการแสดงผลเวลาต่างๆ ที่ใช้ในเกม แต่บางทีก็จะเกิดปัญหาขึ้นเนื่องงจากเครื่องผู้ใช้นั้นตั้งเวลาไม่ตรงกับเวลามาตรฐาน จึงทำให้การแสดงผลผิดเพี้ยนไปอย่างมาก เราจึงต้องทำการเอาเวลาจาก Server มาช่วยในการคำนวนเวลาปัจจุบันด้วย ดังนี้
public var timeDiff:Number = 0; //สร้างตัวแปรมาเก็บค่าความต่างจากเวลาปัจจุบัน
public function init():void{
timeDiff = current_server_time*1000-(new Date().getTime()); //ให้ current_server_time เป็นเวลาปัจจุบันที่ส่งมาจาก Server แล้วนำมาลบกับเวลาปัจจุบันของเครื่องผู้ใช้เพื่อเก็บเวลาที่ต่างกัน
}
ดังนั้นเราก็จะมีตัวแปรที่เก็บเวลาต่างกันของเวลาผู้ใช้และเวลาของ Server และนำไปใช้ ตัวอย่างเช่น
public var offerTimer:Timer = new Timer(1000); //ตัว Timer นับถอยหลังหมดเวลาของโปรโมชั่น
public function checkOfferTime(time:Number):void{ //ฟังก์ชั่นคิดเวลาที่เหลือของโปรโมชั่น
var nowDate:Date = new Date(); //เวลาปัจจุบัน
var endOffer:Date = new Date(time*1000); //เวลาที่จะหมด รับค่ามาเวลาถูกเรียก
var remainTime:Number = (endOffer.getTime()-(nowDate.getTime()+timeDiff))/1000; //เวลาที่เหลือของโปรโมชั่นก็จะเท่ากับ เวลาหมดลบด้วยเวลาปัจจุบันบวกด้วยความต่างของเวลาที่เราได้ทำการเก็บไว้ในตอนแรก
if(remainTime>0){ //ถ้าเวลายังเหลือ
offerTimer.repeatCount = remainTime; //ให้เวลาเหลือ (เป็นวินาที) เท่ากับจำนวนรอบนับถอยหลัง
offerTimer.reset(); //รีเซ็ท Timer
offerTimer.start(); //และสั่งเริ่มนับ
}
}
เท่านี้เวลาที่จะแสดงให้เห็นในเครื่องผู้ใช้ทุกเครื่องจะเท่ากันแล้วล่ะครัย
เจอปัญหากับการสั่งให้ flash เรียกใช้งาน javascript โดยใช้คำสั่ง ExternalInterface.call
เฉพาะบน IE ทุกตัว …
ช่างเป็นบั๊กที่ลึกลับมาก
เพียงแค่คุณไปตั้ง id ให้ใน tag object/embed ของ flash ให้ แค่นี้ก็ใช้ได้แล้ว
… ลึกลับดีมั้ยเอ่ย
จากเดือนที่แล้วมีบทความ ทำให้ As3 และ Javascript คุยกันได้ ไอเทคนิคนี้เราได้เอาไปใช้กับ project UMBO ครับ ตอนอยู่บน localhost ก็ทำงานได้ปกติดีครับ แต่เมื่อเอาขึ้นเซอร์เวอร์ไปแบบแบ่งเป็นหลายๆเซอร์เวอร์เนี่ย ทำให้เกิดปัญหาขึ้นมา เพราะ ตัว flash กับ website อยู่คนละเซอร์เวอร์กัน
เหตุการณ์อย่างนี้ ต่อให้ตั้ง attribute allowScriptAccess ของ flash object เป็น always ก็ไม่สามารถทำงานได้
วิธีที่จะทำให้ flash/flex นี้ ยอมรับ javascript แบบ cross-domain ได้ จะต้องไปเพิ่มโค๊ด
Security.allowDomain( “www.example.com” );
ไปก่อนที่จะรับ javascript แบบในบทความ `ทำให้ As3 และ Javascript คุยกันได้`
http://blog.code-head.com/calling-a-javascript-function-from-actionscript-3-flash
ง่ายมากมายด้วย ExternalInterface
import flash.external.ExternalInterface; ... ExternalInterface.call("your_javascript_function()");
จะเอาค่า Return ก็ได้
var x:int = ExternalInterface.call("get_x()");
ส่ง Parameter กะได้
var retval:int = ExternalInterface.call("some_js_function", "the-argument");
http://codingforums.com/showthread.php?t=152181
Javascript
// Provides the proper address for the movie depending on browser function getFlashMovie(movieName) { var isIE = navigator.appName.indexOf("Microsoft") != -1; return (isIE) ? window[movieName] : document[movieName]; } function playMovie() { getFlashMovie("video").JStoASviaExternalInterface("start"); }
Action Script
function getTextFromJavaScript(str:String):Void { if (str = "start") { startVideo(); } } ExternalInterface.addCallback("JStoASviaExternalInterface", this, getTextFromJavaScript);
AS3 จะมีฟังค์ชัน addFrameScript เป็นฟังค์ชั่นของออบเจค MovieClip ใช้สำหรับให้รันฟังค์ชันที่กำหนดไว้เมื่อ movieClip รันมาถึงเฟรมที่เรากำหนดไว้
MovieClip.addFrameScript(frame_number:uint,function_to_call:Function)
frame_number – เฟรมที่เราต้องการให้ฟังค์ชั่นของเราเริ่มทำงาน มีการลำดับเฟรมแบบเริ่มต้นที่ 0
function_to_call – ฟังค์ชันที่เราต้องการให้เรียก