LevelUp! Studio » as3 https://blog.levelup.in.th Experience the new world. Fri, 26 May 2017 10:06:07 +0000 th hourly 1 http://wordpress.org/?v=3.8.1 วิธีการแก้ปัญหาเวลาเพี้ยนที่เกิดจากเครื่องผู้ใช้ https://blog.levelup.in.th/2013/11/30/how-to-adjusting-flex-time-to-be-globally/ https://blog.levelup.in.th/2013/11/30/how-to-adjusting-flex-time-to-be-globally/#comments Sat, 30 Nov 2013 16:51:13 +0000 http://blog.levelup.in.th/?p=3042 flex-time

โดยปกติแล้วเราใช้ 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(); //และสั่งเริ่มนับ
}
}

เท่านี้เวลาที่จะแสดงให้เห็นในเครื่องผู้ใช้ทุกเครื่องจะเท่ากันแล้วล่ะครัย

]]>
https://blog.levelup.in.th/2013/11/30/how-to-adjusting-flex-time-to-be-globally/feed/ 0
ExternalInterface.call(js) and IE https://blog.levelup.in.th/2010/04/30/externalinterfacecalljs-and-ieexternalinterfacecalljs-and-ie/ https://blog.levelup.in.th/2010/04/30/externalinterfacecalljs-and-ieexternalinterfacecalljs-and-ie/#comments Fri, 30 Apr 2010 16:50:27 +0000 http://blog.levelup.in.th/?p=516 เจอปัญหากับการสั่งให้ flash เรียกใช้งาน javascript โดยใช้คำสั่ง  ExternalInterface.call

เฉพาะบน IE ทุกตัว …

ช่างเป็นบั๊กที่ลึกลับมาก

เพียงแค่คุณไปตั้ง id ให้ใน tag object/embed ของ flash ให้ แค่นี้ก็ใช้ได้แล้ว

… ลึกลับดีมั้ยเอ่ย

]]>
https://blog.levelup.in.th/2010/04/30/externalinterfacecalljs-and-ieexternalinterfacecalljs-and-ie/feed/ 1
ทำให้ As3 และ Javascript คุยกันได้ ฉบับ cross-domain https://blog.levelup.in.th/2010/01/31/%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89-as3-%e0%b9%81%e0%b8%a5%e0%b8%b0-javascript-%e0%b8%84%e0%b8%b8%e0%b8%a2%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%84%e0%b8%94%e0%b9%89-%e0%b8%89%e0%b8%9a%e0%b8%b1/ https://blog.levelup.in.th/2010/01/31/%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89-as3-%e0%b9%81%e0%b8%a5%e0%b8%b0-javascript-%e0%b8%84%e0%b8%b8%e0%b8%a2%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%84%e0%b8%94%e0%b9%89-%e0%b8%89%e0%b8%9a%e0%b8%b1/#comments Sun, 31 Jan 2010 06:32:27 +0000 http://blog.levelup.in.th/?p=381 จากเดือนที่แล้วมีบทความ ทำให้ 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 คุยกันได้`

]]>
https://blog.levelup.in.th/2010/01/31/%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89-as3-%e0%b9%81%e0%b8%a5%e0%b8%b0-javascript-%e0%b8%84%e0%b8%b8%e0%b8%a2%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%84%e0%b8%94%e0%b9%89-%e0%b8%89%e0%b8%9a%e0%b8%b1/feed/ 0
ทำให้ As3 และ Javascript คุยกันได้ https://blog.levelup.in.th/2009/12/28/%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89-as3-%e0%b9%81%e0%b8%a5%e0%b8%b0-javascript-%e0%b8%84%e0%b8%b8%e0%b8%a2%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%84%e0%b8%94%e0%b9%89/ https://blog.levelup.in.th/2009/12/28/%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89-as3-%e0%b9%81%e0%b8%a5%e0%b8%b0-javascript-%e0%b8%84%e0%b8%b8%e0%b8%a2%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%84%e0%b8%94%e0%b9%89/#comments Mon, 28 Dec 2009 14:05:10 +0000 http://blog.levelup.in.th/?p=358 เรียก Function 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 กะได้ :-D

var retval:int = ExternalInterface.call("some_js_function", "the-argument");

เรียก Function AS3 ด้วย Javascript

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);
]]>
https://blog.levelup.in.th/2009/12/28/%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89-as3-%e0%b9%81%e0%b8%a5%e0%b8%b0-javascript-%e0%b8%84%e0%b8%b8%e0%b8%a2%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%84%e0%b8%94%e0%b9%89/feed/ 1
addFrameScript with parameters https://blog.levelup.in.th/2009/12/01/addframescript-with-parametersaddframescript-with-parameters/ https://blog.levelup.in.th/2009/12/01/addframescript-with-parametersaddframescript-with-parameters/#comments Mon, 30 Nov 2009 18:32:22 +0000 http://blog.levelup.in.th/?p=335 AS3 จะมีฟังค์ชัน addFrameScript เป็นฟังค์ชั่นของออบเจค MovieClip ใช้สำหรับให้รันฟังค์ชันที่กำหนดไว้เมื่อ movieClip รันมาถึงเฟรมที่เรากำหนดไว้

MovieClip.addFrameScript(frame_number:uint,function_to_call:Function)

frame_number – เฟรมที่เราต้องการให้ฟังค์ชั่นของเราเริ่มทำงาน มีการลำดับเฟรมแบบเริ่มต้นที่ 0

function_to_call – ฟังค์ชันที่เราต้องการให้เรียก

function helloworld ()

{

trace( “hello world!” );

}

this.addFrameScript( 1, helloworld );

แต่เราไม่สามารถใช้ตัวแปรอะไรเข้าไปในฟังค์ชันได้เลย แต่มีวิธีที่จะทำให้ส่งผ่านตัวแปรได้ คือ เอาชื่อหัวข้อไป search google ก็เจอ = =” อันนี้เป็นวิธีของ Ian Thomas delegate class.

โดยเราจะสร้าง class delegate ขึ้นมา หน้าตาจะเป็นแบบข้างล่าง

package
{

public class Delegate

{

public static function create(handler:Function,…args):Function

{

return function(…innerArgs):void

{

handler.apply(this,innerArgs.concat(args));

}

}

}

}

โดย Delecate.create() จะเป็นฟังค์ชันที่จะช่วยให้เราใช้ตัวแปรใน addFrameScript ได้

วิธีใช้

public function example()

{

for (var i:int=0;i<10;i++)

{

var mc:MovieClip = new Quad() as MovieClip;

addChild(mc);

mc.addFrameScript( mc.totalFrames-1, Delegate.create(myFunction,i) );

}

}

private function myFunction(i:int):void

{

trace(i);

}

Delegate.create( function_to_call:Function, arg1, arg2, … )

unction_to_call – ฟังค์ชันที่เราต้องการให้เรียก

arg1, arg2, … – ตัวแปรที่ต้องการส่งเข้าฟังค์ชัน

]]>
https://blog.levelup.in.th/2009/12/01/addframescript-with-parametersaddframescript-with-parameters/feed/ 0