طريقه استفاده از Class ها در Flash MX 2004

amozesh

Member
با سلام
طريقه استفاده از كلاس هاي Flash MX 2004 رو مي خواستم بدونم چه جوري منظورم فقط استفاده از كلاس مثلا توي فايل fla هست نه درست كردن خود كلاس

قبلا اين متنو نوشته بودم ولي از بد شانسي من به تغييرات فوروم خورد و پاك شد :roll: بگذريم
يك نفر هم جواب داده ولي قبل از اينكه بخونم پاك شد
اگه لطف كنيد جوابا تون رو دوباره بديد ممنون مي شم :wink:
 

fafa^mx

Member
اول از همه تغييرات نبود!هك شده بود!
كلسها يك مجموعه كد هستن در فلش كه كاره مارو آسون ميكننين!اين كلسها درمقابل مقداري كه از ميگيرن ميتونن مقداري رو به ما برگردونن يا كاري انجام بدن!بعضي از كلسهاي مورد احتياج ما از قبل در فلش تعريف شدع!مثله Easing!و ...!نحوه استفاده از یک کلس هم شبیه استفاده از یک فانکشن با این تفاوت که اول باید ایمپورتش کنی!
کد:
addWindow = mx.managers.PopUpManager.createPopUp(_root, mx.containers.Window, true, {title:"Add File", contentPath: "addForm"});
 

F_spyker

Member
فكر مي كنم جواب رو بايد از آقا فريد بپرسي.من هم دوست دارم در مورد Class بيشتر بدونم.
 

amozesh

Member
آقا فريد ممنون
ولي اين كلاس جزو كلاس هايي هست كه فلش فايل هاي آماده aso اونها رو در شاخه Configuration\Classes\aso درست كرده و آماده هست ولي يك سري كلاس هست مثلا اين شاخه Configuration\Classes\zigo كه كامپايل نشده هست طريقه استفاده اينها رو اگه بگين ممنون مي شم
 

fafa^mx

Member
بله!شما ميتونيد اونها را در كنار فايل SWF نصب کنید (قرار بدید) و بعد از import اونها با اکشن به صورت یک فانکشن ازشون استفاده کنید!فلش به طور دیفالت 2 فولدر رو برای کلس ها میشناسه:
1.فولدر کلس های خودش
2.خود قولدر فایل فلش با SubFolder هاش!شما باز هم میتونید بهش مسیر معرفی کنید!

اين نمونه استفاده Xpath Class هست :

کد:
import com.xfactorstudio.xml.xpath.XPathDocument;
  var x = new XPathDocument();
  x.load("http://www.iflashdes.com/rss.asp");
  x.onLoad = function(){
     var query:String = "//item[contains(description,'class') and contains(title,'class')]/description";
     var nodes = this.selectNodes(query);
     trace(nodes[0]);
  }
شما با این کد مثل SQL میتونید با XML ارتباط برقرار کنید و یک سری دیتا های خاص رو ریترن کنید!اینجا برای نود های RSS استفاده شده!
 

amozesh

Member
بله ديدم در قسمت تنظيم پلاير
اگه طريقه import رو بگيد ممنون مي شم چون من با #include "action.as" دستور كه نتونستم و error مي ده براي import كلاس ها بايد يك راه ديگه باشه
منظورم اينكه اگر در SubFolder باشه نيازي به import نداره؟
اگه يكم كامل تر بگيد ممنون مي شم
 

amozesh

Member
آقا فريد دستت درد نكه من همين رو مي خواستم
ولي اين كد وقتي اون جواب رو نوشتم نبود
به هر حال ممنون
 

phoenix

Member
بد نيست كه من در مورد برنامه نويسي شيئ گرا و همچنين ساختار زبانهاي Class based كمي توضيح بدم و با اجازه از فريد توضيحاتش رو كامل كنم و تعريف كلاسيك تري رو از class ارائه بدم.


ساختار برنامه نويسي شيئ گرا:

برنامه نويسي شيئ گرا يا OOP تعريف جديدي در دنياي برنامه نويسي نيست البته اگه اونو با شيوه هاي قديمي برنامه نويسي (structured programming) مقايسه كنيم بسيار جديد تره. در شيوه هاي قديمي در برنامه هاي ساخت يافته و در بهترين حالت برنامه شامل توابع يا function هاي متعدد خواهد بود كه اين توابع مي توانند routine هاي برنامه را در دست گرفته و يا مقداري را براي routine اصلي برگردانند. اين شيوه Top-Down ناميده مي شود و هدف آن شكستن برنامه به جزو هاي كوچكتر مي باشد كه از بالا به پايين اجرا خواهند شد.
C يك زبان از اين نوع مي باشد كه كليه كار ها در آن توسط توابع انجام مي شود شايد مهمترين تغيير C با ++C را هم بتوان امكان برنامه نويسي OO در ++C دانست.

در شيوه هاي نوين كه OO كار آمد ترين اونهاست برنامه شامل قسمت هاي گوناگوني مي باشد كه با يكديگر از طريق متدهاي مختلف ارتباط برقرار مي كنند. اين قسمتها Object ناميده مي شوند. Object ها از روي قالبها يا به عبارتي نمونه هاي اوليه اي ساخته مي شوند كه Class ناميده مي شود، چيزي شبيه قالب شيريني براي ايجاد كردن خود شيريني. در واقع مفهوم و يا شيوه كار كردن با Class كاملا با function ها متفاوته، به علاوه class ها هيچ چيزي رو برنمي گردونند، تنها مي توان از روي اونها نمونه هاي حقيقي كه Object ناميده مي شوند ايجاد كرد. در ادامه توضيحات كامل تري در مورد class مي دهم.
هدف اصلي OO ايجاد شيوه اي بسيار شبيه طبيعت و يا شيوه هاي انساني براي برنامه نويسان بوده است.
بعضي از مزيتهاي استفاده از OO اينها هستند:

- قابل فهم بودن بيشتر برنامه در پروژه هاي بزرگ
- امكان debug كردن و پيدا كردن خطا در برنامه به شيوه اي بسيار راحت تر
- امكان استفاده از چندين برنامه نويس در يك پروژه بدون نگراني نسبت به كد ها
- امكان دوباره استفاده كردن از بك كد در برنامه هاي مختلف
- امكان ايجاد برنامه هاي پيچيده با استفاده از به هم آميختن برنامه هاي ساده تر
- كد برنامه زيبا تر و يا پتانسيل ايجاد كد زيبا تر

يك مثال ساده يك اتومبيل مي باشد كه شامل قسمتهاي بسيار گوناگون مي باشد:

- هر قسمت از اتومبيل به صورت مجرد و به تنهايي عهده دار انجام وظيفه خاصي مي باشد و اين قسمتها با استفاده از متد هاي قابل فهم خود با يكديگر ارتباط برقرار مي كنند
- در صورتي كه مشكلي براي هر قسمت بوجود آيد پيدا كردن آن بسيار آسان تر است
- افراد گوناگوني در ايجاد يك اتومبيل دخيل هستند. براي مثال تخصص افرادي كه CD player رو ايجاد مي كنند كاملا جدا از تخصص افرادي است كه سيستم سوخت رساني را مي سازند
- يك CD player رو مي توان در اتومبيل هاي متفاوت استفاده كرد
- يك CD player رو مي توان تركيبي از قسمتهاي ساده تر مانند IC ها، قسمتهاي مكانيكي، برق رساني و ... دانست كه هر كدام از اين اجزا به نوبه خود به قسمت هاي ساده تر تقسيم مي شوند



Class based و Object based

زبانهاي OO را مي توان به دو دسته Class based و Objec based تقسيم كرد. مطالب بسيار زيادي در مورد تفاوت اين دو شيوه وجود داره كه از حوصله اين مطلب خارجه و من فقط اشاره كوچكي ميكنم:

در زبانهاي Object based مانند JavaScript كه از استاندارد ECMA-Script پيروي مي كند كليه اجزاي برنامه به نوعي Object هستند. شايد دركش كمي مشكل باشه ولي در اين زبانها تمامي متغير ها، type ها مانند Number , ‌Boolean, String ، و حتي Class ها و function ها به نوعي Object هستند.
اين زبانها را گاها prototype based هم مي نامند و علت اون استفاده از يك object خاص به نام prototype در سيستم تعريف كردن class ها مي باشد كه نقش بسيار مهمي را در اين مدل زبانها بازي مي كند.

در زبانهاي Class based مانند Delphi ، C# , Java كه ساختار محكم تري دارند همانطور كه از اسمشون پيداست مفهوم class از Object كاملا جدا مي باشد، اين زبانها معمولا Strict Type هستند بدين معني كه براي كليه متغير ها بايد type مشخصي تعريف شود و بر خلاف زبانهاي Object based در اينجا type ها مفهومي كاملا مجرد مي باشند

بحث هاي زيادي در مورد دو ساختار وجود داره و اينكه هر كدوم چه برتري هايي دارند ولي مساله اصلي اينه كه هر دو اين زبانها قابليت هاي كامل OO را دارند و در هر دو مفهوم Object و Class به شكل استاندارد وجود دارد.

ركن هاي اصلي كليه زبانهاي OO عبارتند از:

- encapsulation يا مخفي سازي، بدين صورت كه class ها بايد از دارايي ها ي دروني خود محافظت كنند و فقط اين متد ها هستند كه قابل دستيابي هستند. مثلا در مثال CD player هيچ كس نبايد از محتويات و طريقه كاركرد داخلي آن اطلاعي داشته باشد و يا بتواند در آن تغييري دهد، چيزي كه افراد نياز دارند فقط متد هاي دستيابي به CD player است مانند اينكه
چگونه يك CD را play كنيم و يا چگونه track بعدي را انتخاب كنيم

- inheritance يا ارث بري، به معني اينكه class ها مي توانند بعضي از مشخصات و يا متد ها را از يك class ديگر ارث ببرند، مثلا يك گربه سفيد بعضي خواص را از class گربه ها به ارث مي برد مثل اينكه همه گربه ها گوشت خوارند، class گربه ها مي تواند خواصي را از class پستانداران به ارث ببرد مثل اينكه پستانداران بچه به دنيا مي آورند، حتي class پستانداران مي تواند از class جانداران ارث بري داشته باشد مانند تنفس كردن. نتيجه اينكه گربه سفيد گوشتخوار است، بچه به دنيا مي آورد و تنفس مي كند.

- polymorphisim يا چند گانگي، بدين صورت كه مثلا همه جانداران متدي به نام تنفس دارند كه بين همه مشترك است ولي هر كدام به نحو خاص خود اين كار را انجام مي دهد. درختان، ماهي ها و پستانداران هر كدام به نحوي اين كار را انجام مي دهند. در نتيجه برنامه نويس نگراني جهت تنفس Object ها ندارد و هميشه مثلا متد breath را براي تنفس بكار مي برد گر چه اين متد براي هر گروه متفاوت است



ActionScript

نكته قابل توجه در AS اين است كه AS هم يك زبان class based و هم يك زبان object based مي باشد. در واقع AS1 يك زبان object based و AS2 يك زبان class based مي باشد. از نظر قابليت و كارايي هر دو زبان يكسان مي باشند همچنين هر دو كاملا OO هستند و كليه كارايي هاي سيستم هاي OO را دارا هستند.
تنها تفاوت در شيوه ايجاد و آشنايي برنامه نويس مي باشد ضمن اينكه AS2 در پروژه هاي بزرگ تا حدي كامل تر است و برنامه هاي آن ساختار قوي تري دارند ولي در %95 از برنامه هاي فلش AS2 چيزي جز تعداد كد بيشتر براي برنامه و طولاني تر شدن مدت برنامه نويسي نخواهد داشت. همچنين AS2 نيازمند آشنايي برنامه نويس با بعضي از pattern هاي OO است كه براي برنامه نويس هاي آشنا با زبانهاي class based كار را راحت تر مي كند در غير اين صورت برنامه نوشته شده با AS2 مي تواند از برنامه نوشته شده با AS1 گيج كننده تر و از نظر كيفي ناقص تر باشد.


شوه استفاده از class در ActionScript

در AS1 براي ايجاد يك class از keyword function استفاده مي گردد. قابل توجه اينكه اين class با function هاي عادي تفاوت دارد.
يك مثال ساده ايجاد يك class براي گربه سفيد مي باشد. تا هنگامي كه از روي اين class يك object ساخته نشود گربه سفيدي ايجاد نخواهد شد. پس از ايجاد مي توانيم متد getName را براي object گربه صدا بزنيم تا اسم آنرا برگرداند:

کد:
function WhiteCat(name)
{
	this.getName=function()
	{
		return this._name;
	};
	
	this._name=name;
};

myCat=new WhiteCat("maloos");

trace(myCat.getName());


در AS2 نوشتن همان كد كمي سخت تر است. sysntax برنامه نويسي در AS2 دقيقا مانند Java مي باشد. ابتدا بك فايل با پسوند as ايجاد مي كنيم و اسم آنرا دقيقا معادل اسم class قرار مي دهيم (در هر فايل as تنها يك class قرار مي گيرد) كد قرار گرفته در اين class بدين صورن خواهد بود:

کد:
class WhiteCat
{
	function WhiteCat(name:String)
	{
		_name=name;
	};
	
	public function getName():String
	{
		return _name;
	};
	
	private var _name:String;
};


حالا يك فايل fla در كنار فايل as ايجاد كرده و مراحل ايجاد object و استفاده از آنرا در آن مي نويسيم:

کد:
myCat=new WhiteCat("maloos");

trace(myCat.getName());



استفاده از package ها

يكي از مفاهيم بسيار خوب در Java امكان دسته بندي class ها در package ها مي باشد كه چيزي شبيه به دسته بندي فايل ها در folder هاست. در AS2 مفهوم package كاملا وجود دارد و در پروژه هاي بزرگ بسيار هم كاربرد دارد. براي استفاده از package ها بايد class ايجاد شده را دقيقا در شاخه اي با همان ساختار قرار داده و در فايل fla آدرس ClassPath را برابر آن شاخه قرارا دهيم (نحوه اين كار را در ادامه توضيح خواهم داد)

براي مثال همان مثال قبل را با قرار دادن class مربوطه در package به نام com.cat مي نويسيم:

کد:
class com.cat.WhiteCat
{
	function WhiteCat(name:String)
	{
		_name=name;
	};
	
	public function getName():String
	{
		return _name;
	};
	
	private var _name:String;
};

حال تنها چيزي كه بايد به فايل fla اضافه كنيم دستور import براي مشخص كردن package و class مربوطه مي باشد.

مثلا

;import com.cat.WhiteCat

كلاس WhiteCat را در برنامه اصلي import مي كند و يا :

;*.import com.cat

كليه كلاس هاي موجود در package com.cat را در برنامه آماده مي سازد و نكته قابل توجه اينجاست كه اين import كردن حجم اضافي را بر برنامه تحميل نمي كند. تنها كد هاي استفاده شده در فايل swf نهايي قرار مي گيرند.

براي تنظيم ClassPath مراحل زير را انجام مي دهيم:

اگر مثلا com\cat\WhiteCat.as در c:\classes قرار دارد. در فايل fla به

File \ Publish Settings \ Flash \ActionScript Version : Settings

رفته و آدرس c:\classes را به ClassPath هاي جاري اضافه مي كنيم.



مفهوم كامل OO بسيار فراتر از توضياتي است كه در بالا نوشتم و حداقل نيازمند يك كتاب 1000 صفحه اي است كه اگر شيوه هاي OO و refractories و Design Pattern و UML رو هم به اون اضافه كنيم چندين كتاب لازمه. اميدوارم تونسته باشم توضيحي هر چند كم در مورد OO داده باشم.
 

armanbm

کاربر VIP
phoenix دمت گرم خيييييييييييييييييييييييييييييييييييييييييييلي باحالييييييييييييييييييييييييييييييييييييييييييييييييييييييييييييييييييي
 

MnavidM

Active Member
با سلام.

phoenix جان خيلي ممون .

خيلي مفيد بود .

به شما ميگن يه دوست خوب :wink:

منتظر آموزش هاي بعدي شما هستيم .
 

amozesh

Member
با سلام
phoenix جان شرمنده كردي
دستت درد نكنه توضيح از اين كامل تر نمي شد
 

amozesh

Member
phoenix جان يك كلاس هست در اين آدرس Classes\zigo\tweenManager
من با اين دستور وارد كردمش
var $tweenManager = new zigo.tweenManager();
و براي استفاده هم دستور هايي كه خود فلش گفته بود به كار بردم ولي كار نمي كنه اگه يك كمك هم در اين مورد بكني ممنون مي شم
 

phoenix

Member
من با class هاي تعريف شده در package mx كار نكردم و متاسفانه package به اسم zigo رو هم نه در كامپوتر خودم و نه در سايت macromedia پيدا نمي كنم! شايد اگر package رو براي من بفرستيد بيشتر بتونم كمك منم.

اما اگر در مورد twining دنبال چيزي هستيد در package mx.transitions يك كلاس به اسم Tween وجود داره كه كار كردن باهاش خيلي ساده است. من الان فرصت ندارم كه متد هاش رو كاملا بررسي كنم ولي تا جايي كه ديدم خيلي ساده است. فقط يك مشكل در متد constructor كلاس وجود داره كه مي توانيد دستي برطرفش كنيد.

فرايند ايجاد يك object را construct كردن و كلاس ايجاد كننده را constructor مي نامند. در AS2 متد خاصي به همان اسم class وظيفه construct كردن را دارد. اين متد نبايد متدهايي براي انجام عمليات بر روي object ساخته شده را صدا بزند. وظيفه آن فقط ايجاد object است اما در كلاس Tween اين مساله رعايت نشده است و متد start در همان constructor صدا زده شده است. نتيجه اينكه هنگامي كه يك object از اين كلاس ساخته مي شود خود به خود شروع به tweening مي كند. براي رفع اين مساله يك خط از كلاس Tween را مي توان حذف كرد:

اين خط:
;()this.start

بايد توجه كرد كه با حذف اين كد برنامه نويس بايد خود متد start را فراخواني كند

حالا يك مثال ساده براي استفاده از اين class:

ابتدا يك MovieClip ايجاد كرده و instance name آنرا mc_ قرار مي دهيم سپس كد زير را در اولين فريم فايل قرار مي دهيم:

کد:
import mx.transitions.*;

var myTweenAlhpa:Object = new Tween(_mc, "_alpha", null, 100, 20, 2, true);

myTweenAlhpa.start();

اين كد MovieClip ايجاد شده را از alpha=100 تا alpha=20 در طول 2 ثانيه tween مي كند

constructor كلاس Tween چندين argument دارد كه هنگام construct كردن بايد آنها را وارد كنيم:

(Tween (obj, prop, func, begin, finish, duration, useSeconds

obj: آدرس MovieClip و يا Button
prop: نام مشخصه اي كه مي خواهيم آنرا tween كنيم مانند x_ , _xscale , _alpha
func: متدي براي easing
begin: مقدار ابتدايي مشخصه
finish: مقدار نهايي مشخصه
duration: زمان بر مبناي فريم يا ثانيه
useSeconds: در صورتي كه true باشد زمان بر مبناي ثانيه محاسبه خواهد شد


متد ها و callback هاي متعددي براي كار با object ساخته شده از كلاس tween وجود داره. مثلا FPS را مي توان براي set كردن Frame per second در انيميشن بكار برد و يا با تعريف callback هاي onMotionStarted و onMotionStopped زمان شروع و زمان پايان انيميشن را مي توان detect كرد.

مثال :

کد:
import mx.transitions.Tween;
import mx.transitions.easing.*;

var myTweenY:Object = new Tween(_mc, "_y", Bounce.easeIn, 0, 300, 2, true);
var myTweenX:Object = new Tween(_mc, "_x", Elastic.easeIn, 0, 300, 2, true);
var myTweenXscale:Object = new Tween(_mc, "_xscale", null, 100, 0, 2, true);
var myTweenYscale:Object = new Tween(_mc, "_yscale", null, 100, 0, 2, true);

myTweenY.FPS=60;
myTweenX.FPS=60;
myTweenXscale.FPS=60;
myTweenYscale.FPS=60;

myTweenY.onMotionStarted = function(o) 
{
	trace("Tweening _y Started");
};

myTweenY.onMotionStopped = function(o) 
{
	trace("Tween _y Stopped");
};

myTweenY.start();
myTweenX.start();
myTweenXscale.start();
myTweenYscale.start();

توضيح اينكه كليه كلاس هاي mx.transitions.easing در برنامه موجود هستند و مي توان از متد هاي كلاس هاي آن در tween استفاده كرد مثل Bounce.easeIn و يا Elastic.easeIn يا Regular.easeOut
 

fafa^mx

Member
واي اين يه چيزيش ميشه!!!راستي يادم رفت بپرسم اگه اون گربه ها حامله باشه بر طبق inheritance اين يكيم حامله ميشه!؟!!اون موقه پشته سره اين جديده حرف در ميارن كه!!!!
 

phoenix

Member
نه خير. بر طبق ركن encapsulation كليه object ها موظف به نگهداري از دارايي هاي شخصي خود هستد(instance fields) بنابر اين حامله شدن يك object از نوع گربه هيچ ارتباطي به object ديگه نخواهد داشت و تا هنگامي كه متد حاملگي براي هر object از نوع گربه صدا زده نشود آن object حامله نخواهد شد. بنابر اين حرف و حديثي هم وجود نخواهد داشت.
 

amozesh

Member
با سلام
phoenix جان دستت درد نكنه با اين توضيحات كاملت شرمندمون كردي
با توضيحات شما مشكلم كامل حل شد
اون كلاسي رو كه گفتم اينجا گذاشتم

اينم توضيحات فلش در مورد اين كلاس
کد:
tweenManager class 
Main class of MovieClip Tweening prototypes, prototypes only parses arguments (and does not store any variables to MovieClip) to instance of class named $tweenManager 

Properties
autoStop - boolean, default to false, determines if running tweens may be automatically stoped . This property is useful when you dont like to write stopTween() before tween() method call, stopTween(properties) is called automatically
example: 
$tweenManager.autoStop = true; 

broadcastEvents - boolean, default to false, determines if tweening MovieClip may broadcast events (based on AsBroadcaster), useful for 1 - n relations:

onTweenStart
onTweenUpdate
onTweenEnd

example:
$tweenManager.broadcastEvents = true; 
my_obj = {};
my_obj.onTweenStart = function(){
trace('my_obj onTweenStart');
} 
my_obj.onTweenUpdate = function(){
trace('my_obj onTweenUpdate');
} 
my_obj.onTweenEnd = function(){
trace('my_obj onTweenEnd');
} 

my_second_obj = {};

my_second_obj.onTweenEnd = function(){
trace('my_second_obj onTweenEnd');
} 

my_mc.onTweenEnd = function(){
trace('my_mc onTweenEnd')
} 

my_mc.addListener(my_obj);
my_mc.addListener(my_second_obj);
my_mc.addListener(my_mc);

my_mc.tween('_x',200);

Tips:

I some cases, when you upgrade from older version, and you having trouble to running tweens, use following technique:

use (trace($tweenManager)), if you see [object Object] or [AS2 tweenManager [version nr]], and version nr is lower you have installed, that means older version of tweenManager is loaded. You must delete the precompiled class file (*.aso) in directory:
WinXP:
C:\Documents and Settings\[username]\Local Settings\Application Data\Macromedia\Flash MX 2004\[language]\Configuration\Classes\aso\ zigo.tweenManager.aso
 

جدیدترین ارسال ها

بالا