CMAX/01 - کنترل کاملTime Line توسط ActionScript

CMAX

Member
گاهی وقتها هنگام طراحی یک منو و یا زیر منو برای شما ممکن است این سوال پیش بیاید که چطور بدون استفاده از
gotoAndPlay می توانید TimeLine را کنترل کنید و به یک Tween بدون ایجاد پرش و یا ساخت حالتهای ممکنه امکان صرف نظر کردن از Stop و عبور از حالتهای میانی داد .

اصولا من باید این پست را در قسمت آموزش ارسال می کردم اما خوب چون عقیده دارم حداقل اینجا راحت تر
و بهتر قابل دسترسی است و کاربر شانس بیشتری برای دیدنش دارد اینجا ارسال شد .( با عرض پوزش از مدیر انجمن -- زحمتش با شما )



فرض کنید یک MC دارید و 4 عدد bt و می خواهید وقتی کاربر bt01 را انتخاب کرد این mc از محل خودش یعنی x0 تا x1 حرکت کند و اگر کلید 2 از x0 تاx2 و همینطور برای هر چهار کلید در نظر بگیرید و البته حالتهای میانی مثلا اگر mc در x1 بود و کاربر bt04 را زد از x1حرکت کند و در x4 توقف شود .

خوب بنظر کار ساده ای نیست اما اگه یه نگاهی به لیست زیر بیاندازید مشکل نیست

1- currentframe_ برای چک کردن شماره فریمی که الان دران قرار داریم
2- if برای چک کردن شماره فریم با فریم دلخواه
3- onEnterFrame برای چک کردن شرط ما در هر فریم

روش کار

شماره فریم را توسط آرگمان به تابع بدهیم
شماره فریم را چک کنیم تا معلوم شود شماره فریمی که در آن قرار داریم بزرگتر است یا شماره فریم مورد نظر ما
بر اساس نتیجه دستور های بعدی را اجرا کنیم

خوب اول تعرف تابع
کد:
function CtrlMov(frm:Number):Void
{


}

شرط ما


کد:
if (_currentframe<frm)
{
}
else
{
}

اگه فریم دلخواه ما بزرگتر از فریم جاری باشد فقط لازم است بگویم Play اما تا زمانی که برابر با فریم مورد نظر شد و در آن فریم stop کند
کد:
if (_currentframe<frm)
{
	play();
	onEnterFrame = function ()
	{
		if (_currentframe == frm)
		{
			stop();
			delete onEnterFrame;
		}
	};
}
اما اگه فریم جاری از فریم دلخواه ما بزرگتر نبود باید بگوییم به صورت معکوس عمل کند و برگردد به فریم قبلی و اینقدر این کار را ادامه دهد تا به فریم مورد نظر برسد :



کد:
...
else
	{
		onEnterFrame = function ()
		{
			prevFrame();
			
			if (_currentframe == frm)
			{
				delete onEnterFrame;
			}
		};
	}

و تمام
در نهایت تابع مورد نظر را در Event پرس btها فرا می خوانیم

کد:
bt1.onPress = function()
{
	CtrlMov(20);
	
}
کل کد به شکل زیر است :
کد:
function CtrlMov(frm:Number)
{
	if (_currentframe<frm)
	{
		play();
		onEnterFrame = function ()
		{
			
			if (_currentframe == frm)
			{
				stop();
				delete onEnterFrame;
			}
		};
	}
	else
	{
		onEnterFrame = function ()
		{
			prevFrame();
			
			if (_currentframe == frm)
			{
				delete onEnterFrame;
			}
		};
	}
}
bt0.onPress = function()
{
	CtrlMov(00);
};
bt1.onPress = function()
{
	CtrlMov(20);
};
bt2.onPress = function()
{
	CtrlMov(40);
};
bt3.onPress = function()
{
	CtrlMov(60);
};
bt4.onPress = function()
{
	CtrlMov(80);
};


می تونید یک نمونه آماده رو از آخر مبحث DL کنید

این مطالب ادامه خواهد داشت

نظری داشتین دریغ نفرمایید


---------------Take Care ------------------CMAX----------------------
 

پیوست ها

  • CtrlMov.rar
    13.5 کیلوبایت · بازدیدها: 41

amir_s

Active Member
متشکرم Cmax عیزیز ( من هنوز اسم شریفتون رو نمی دونم )
 

kodex2

کاربر فعال
سلام ! CMAX عزیز ممنونم . واقا Topic مفیدی بود . بنظر من همین کار میشه با چک کردن position های موس و استفاده از onEnterFrame کرد . می شه چک کرد که x_ ، مووی مون کجاست و نصبت به اون تقییرش داد .
به هر حال باز هم ازت ممنونم . منتظر Topic های بعدی هستم . :)
 
آخرین ویرایش:

CMAX

Member
اصلا مسئله ربطی به موس و Position ندارد عزیزم
فکر کن یه انیمشن و یا یه منو با انیمیشن داری حالا من ایم مثالو زدم منظورم تنها این نیود که با مرام
 

kodex2

کاربر فعال
فکر کنم منظورم رو درست نرسوندم . position موس اشتباه تایپی بود . منظورم این بود که بهتره همین جابجایی رو بجای استفاده از Timeline با خود Action و تغییر dynamic برای x_ مووی کلیپ انجام داد . یعنی از Timeline استفاده نشه و کلا dynamic باشه عزیزم . راستی sample ای هم که گزاشته بوودی bug داشت . اگه روی اولی کلیک میکردی و بعد روی دوومی کلیک می کردی اون وقت دوباره روی دومی کلیک کنی ، بجای این که مووی وایسه می ره رو اولی وایمیسه !
 

CMAX

Member
در مورد Bug حق با شما بود شرطها رو برای دومی نباید مخالف می ذاشتم ممنون
پس شرط اینجوی میشه
کد:
....
}else
	{
		......
			if (_currentframe > frm)//this Conditon changed 
			{
				prevFrame();
			}
			else
			{
				delete onEnterFrame;
			}
		};
	}




اما در مورد چیزی که گفتی باز هم هدف منو نگرفتی
ببین فکر کن یه مجموعه عکس داری که یه روال مثل حرکت از روی یه مونیتور به روی یه پرده نمایش و بعد یه میز کانتر و بعد یه صندلی رو ساختی
خوب به هر کدم یک کلید نسبت بده 1و2و 3 و4

حالا فکر کن کاربر اولی رو شماره 2 اتخاب می کنه میتونی بگی چطور میشه بدون اینکه در قسمت یک بایسته به دومی برسیم و یا از روی دومی بدون انکه روی میز کانتر بایسته روی صندلی stop کنه ؟ و یا این روا رو بر گرده
اگه راه حل دیگه ای داشتی خوشحال می شم بدونم ...
نمی خوای بگی که از Goto استفاده می کنیم و یا اینکه 16 حالت رو می سازیم ...
عزیزم به قضیه درست فکر نکردی که چرا من از Tween استفاده کردم و گر نه کاری که شما میگی فقط 2 خط کد
بایدبه جای کل محتویات تابع بذاری یعنی تابع اینطور شود :
برای اینکه قاطی نشود اسم MC اصلی یعنی مربع قرمز رو بذار mc0
حالا این بجای تابع

کد:
function CtrlMov(frm:Number)
{
	XX = _xmouse-mc0._width/2;
	onEnterFrame = function (){mc0._x = mc0._x+(XX-mc0._x)/10;};
}

می بینی درست فکر نکردی خوش تیپ - من چی گفتم ....
اشکال نداره بجاش کلی چیز یاد گرفتی ...:wink:

خوش باش و بای
 
آخرین ویرایش:

kodex2

کاربر فعال
سلام CMAX عزیز . قشنگ ما رو ضایه کردی . ببین مساله خیلی ساده است . 4 تا دکمه داری که روی هر کدام کلیک می کنه یه مووی رو نسبت به آن دکمه جابجا می کنه . حالا اگه حالت onPress رو برای جایی که موس کلیک شده حساب کنی ، می تونی خیلی راحت x مووی رو کم و زیاد کنی و وقتی که x مووی رسید به x ای که موس کلیک کرده مثل همون sample ای که گزاشتی عمل می کنه . با فرق این که اگه توی سورس کارت جای مووی ها رو تغییر بده باز کد درست کار می کنه !؟ در هر صورت خوشگل ما رو ضایه کردی !
 

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

بالا