LevelUp! Studio » actionscript 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 การเปลี่ยนโค้ดดิ้งจาก ActionScript มาเป็น C# https://blog.levelup.in.th/2014/04/30/changing-from-actionscript-to-csharp/ https://blog.levelup.in.th/2014/04/30/changing-from-actionscript-to-csharp/#comments Wed, 30 Apr 2014 16:30:06 +0000 http://blog.levelup.in.th/?p=3388 หลังจากที่ปัจจุบันเกมต่างๆได้ย้ายไปทำใน Unity กันซะหมด ผมเลยต้องเริ่มเรียนภาษาใหม่มาแทน ActionScript ที่คล่องมือมาหลายปี ส่วนอะไรที่ใช้ง่ายๆก็ถูกเปลี่ยนไปซะหมด เลยจะมาบอกส่วนสำคัญๆในการโค้ดดิ้งเกมสักสามอย่างครับ

Number = float

จากปกติแล้วใน AS เราจะใช้ Number, int ซะส่วนมาก ซึ่ง c# นี้ไม่มี “Number” ซึ่งให้เราใช้ float
float myFloat = 0.5f;
จะเห็นได้ว่า “f” ต่อท้ายนั้นเป็นการระบุด้วยว่าค่านี้จะเป็น float ซึ่งถ้าไม่ใส่จะติด Error นะครับ

การหาใดๆหรือคำนวณใดๆก็ตามถ้าเราคิดว่าคำต้องมีทศนิยมแน่ๆ ให้เราใส่ float ไว้ก่อนเลยครับ
float i = 15f;
float j = 10f;
float divide = i / j; // 1.5f

ในการเปลี่ยน float ให้เป็น int ก็ต้องใช้ FloorToInt() เพราะ c# ไม่ได้อิสระเหมือนกับ AS เท่าไรนัก
int value = Mathf.FloorToInt(float n);

Event Dispatching

ใน AS นั้นทุกๆอย่างสามารถ dispatch event ได้ทั้งหมด แต่พอมาใน Unity  C# แล้วต้องมีการปรับกันใหม่ล่ะครับ

  • ประกาศ delegate ด้านนอก class

public delegate void LoadComplete(float value);
public class MyClass
{
//...
}

  • สร้าง event ด้านใน class

public delegate void LoadComplete(float value);
public class MyClass
{
public event LoadComplete LoadCompleteEvent;
}

  • ใส่ listener โดยการเพิ่ม delegate instance โดยมี handler ให้กับ LoadCompleteEvent

public delegate void LoadComplete(float value);
public class MyClass
{
public event LoadComplete LoadCompleteEvent;
public void Start()
{
LoadCompleteEvent += new LoadComplete(HandleLoadComplete);
}
//note how the argument signature matches the delegate declaration
private void HandleLoadComplete(float someValue)
{
//event handled here
}
}

  • ใช้ event โดยการเช็คว่าไม่ใช่ null แล้วจึงเรียก event นั้นๆ

public void DoSomething()
{
if( LoadCompleteEvent != null ) LoadCompleteEvent(1.0f);
}

  • ลบ listener ด้วยการ ลบ handler ออกจาก event

LoadCompleteEvent -= HandleLoadComplete;

 

Coroutines (ใช้แทน setTimeout, setInterval, Timer)

ใน AS เราจะใช้ setTimeout(), setInterval() หริอไม่ก็ Timer เลยเพื่อจัดการกับการรอหรือการวนลูปตามเวลา แต่พอมาใน Unity C# มันจะยุ่งยากขึ้นดังนี้

  • ถ้าต้องการจะวนลูปหรือรอเป็นเวลาขณะหนึ่ง ให้เรียก method ที่มีการรีเทิร์นค่าเป็น IEnumerator

public IEnumerator DoMyBidding() {...};

  • จากนั้นใส่ WaitForSeconds()  และก็ทำการ yield return ใน method

public IEnumerator DoMyBidding()
{
yield return WaitForSeconds(1.5f);
if( myConditionNotMet ) yield return null; // this is how you just simply return out if you no longer wish to continue.
}

  • ถ้าต้องการที่จะวนลูปเรื่อยๆ

public IEnumerator MonitorMe()
{
while ( conditionNotMet )
{
// do something
yield return WaitForSeconds(.025f);
}
}

  • ในการใช้ method ที่จะวนลูปม้ใช้เรียกด้วย StartCoroutine():

public void Start()
{
StartCoroutine( MonitorMe() );
}

สามอย่างนี้ก็จะช่วยทำให้เราเข้าถึง Unity C# จากการที่เราคุ้นเคยกับ AS ได้มากขึ้นแล้วล่ะครับ

credits : http://rockonflash.wordpress.com/2010/10/20/unity3d-development-actionscriptunityscript-to-c-tips/

]]>
https://blog.levelup.in.th/2014/04/30/changing-from-actionscript-to-csharp/feed/ 0
วาดเส้นง่ายๆกับแท็ก Spark Path https://blog.levelup.in.th/2012/02/29/draw-lines-with-spark-path/ https://blog.levelup.in.th/2012/02/29/draw-lines-with-spark-path/#comments Tue, 28 Feb 2012 18:23:30 +0000 http://blog.levelup.in.th/?p=1457 โดยปกติแล้วโปรแกรมเมอร์อย่างๆเรา วาดเส้นต่างๆก็ลำบากแล้วใช่ไหมล่ะครับ

path01

อย่างเช่นถ้าจะให้วาดสามเหลี่ยมเป็นกราฟ ปกติแล้วก็คงจะสร้าง MovieClip มาแล้วใช้ AS3 วาดเส้นเอาโดยใช้ฟังก์ชั่นวาดรูปพื้นฐาน graphics.lineTo แบบนี้

var triangleShape:Shape = new Shape();

triangleShape.graphics.moveTo(0,0);

triangleShape.graphics.lineTo(100,0);

triangleShape.graphics.lineTo(100,100);

triangleShape.graphics.lineTo(0,100);

แต่แล้วใน Flex 4 หลังจากมี Spark แท็กเราก็สามารถวาดเส้นง่ายๆได้แล้วล่ะครับ

โดยวิธีที่จะมาเสนอในวันนี้คือแท็ก <s:Path> ครับ โดยแท็กนี้เราสามารถวาดเส้นต่างๆภายในบรรทัดเดียวได้เลยล่ะครับ!

โดยเจ้า Spark Path นี้มี Attribute ที่สำคัญหลักๆตัวเดียวเลยครับคือ data ที่มีไทป์เป็น String ธรรมดาๆนี่แหละครับ

เราสามารถวาดเส้นได้ดังนี้ครับ

ตัวอย่าง:
<s:Path data=”M 0 0 L 100 0 L 100 100 L 0 100 Z”>
<s:stroke>
<s:SolidColorStroke color=”#333333″ caps=”square” joints=”miter” />
</s:stroke>
<s:fill>
<s:SolidColor color=”#00CCFF” />
</s:fill>
</s:Path>

Stroke จะมีไว้กำหนดลักษณะของเส้น และ fill จะมีไว้กำหนดลักษณะของสีด้านในครับ
ทีนี้พระเอกของเราคือเจ้า data โดยเจ้า data จะเป็นตัวกำหนดรูปร่างของเส้นวาดๆของเราครับ
วิธีใช้ก็เพียงแค่ใส่ตัวหนังสือที่ระบุความสมารถนำหน้าแล้วเคาะเว้นตามด้วยค่าต่างๆครับ
โดยตัวหนังสือจะกำหนดสิ่งต่างๆดังนี้

  • M / m
เลื่อนไปที่จุดๆนั้นเพื่อเริ่มมีค่าเท่ากับการใช้แท็ก graphics.moveTo
  • L / l
วาดเส้นจากจุดปัจจุบันไปยังจุดที่กำหนดมีค่าเท่ากับการใช้แท็ก graphics.lineTo
  • C / c
วาดเส้นโค้งจากจุดหลายๆจุด
  • Q / q
วาดเส้นโค้งจากจุดๆหนึ่ง
  • H / h
วาดเส้นแนวนอน
  • V / v
วาดเส้นแนวตั้ง
  • Z / z
วาดกลับไปยังจุดเริ่มต้น


ทีนี้เราก็เพียงนำค่าต่างๆมาต่อกันเป็น String โดยมีเว้นวรรคคั่นก็สามารถวาดรูปในบรรทัดเดียวได้แล้วครับ

ถ้าค่าของเราต้องเปลี่ยนจากการคำนวนก็เพียงตั้ง id ให้กับ Path ของเราแล้วเซ็ทค่า data ให้ตรงกับ String ที่ผ่านการคำนวนมาแล้ว

เช่นดังนี้ครับ

graphStat.data = “M “+musicX+” “+musicY+” L “+entertainX+” “+entertainY+” L “+charmX+” “+charmY+” Z”;

เท่านี้เราก็จะได้กราฟสามเหลี่ยมตามค่าที่เราตั้งไว้ได้ครับ

path02

]]>
https://blog.levelup.in.th/2012/02/29/draw-lines-with-spark-path/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] Check version Flash player https://blog.levelup.in.th/2009/08/30/as3-check-version-flash-playeras3-check-version-flash-player/ https://blog.levelup.in.th/2009/08/30/as3-check-version-flash-playeras3-check-version-flash-player/#comments Sun, 30 Aug 2009 04:50:57 +0000 http://blog.levelup.in.th/?p=144 Code AS3 สำหรับ Check version Flash player

import flash.system.Capabilities;

// Get the player's version by using the getVersion() global function.
var versionNumber:String = Capabilities.version;
trace("versionNumber: "+versionNumber);
trace("-----");

// The version number is a list of items divided by ","
var versionArray:Array = versionNumber.split(",");
var length:Number = versionArray.length;
for(var i:Number = 0; i < length; i++) trace("versionArray["+i+"]: "+versionArray[i]);
trace("-----");

// The main version contains the OS type too so we split it in two
// and we'll have the OS type and the major version number separately.
var platformAndVersion:Array = versionArray[0].split(" ");
for(var j:Number = 0; j < 2; j++) trace("platformAndVersion["+j+"]: "+platformAndVersion[j]);
trace("-----");

var majorVersion:Number = parseInt(platformAndVersion[1]);
var minorVersion:Number = parseInt(versionArray[1]);
var buildNumber:Number = parseInt(versionArray[2]);

trace("Platform: "+platformAndVersion[0]);
trace("Major version: "+majorVersion);
trace("Minor version: "+minorVersion);
trace("Build number: "+buildNumber);
trace("-----");

if (majorVersion < 9) trace("Your Flash Player version is older than the current version 9, please update.");
else trace("You are using Flash Player 9 or later.");

]]>
https://blog.levelup.in.th/2009/08/30/as3-check-version-flash-playeras3-check-version-flash-player/feed/ 1