ฟอนต์ฟอรั่ม

F0NT Community (เก่า) => ห้องคอม => ห้องแฟลช => โพสต์ถูกเริ่มโดย: Layiji เมื่อ 08 ม.ค. 2007, 09:56 น.

ชื่อเรื่อง: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 09:56 น.
ผมอยากตั้ง if ที่เช็คว่าถ้าใน MC ไม่ใช่เฟรมที่  3 แล้วให้กระทำการต่างๆ จะใช้คำสั่งอะไรครับ

และอีกอันคือ ถ้า MC play ยังไม่ถึงเฟรมสุดท้ายให้กระทำการ......

ควรใช้คำสั่งอะไรดีครับ

ขอบคุณครับ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 08 ม.ค. 2007, 11:25 น.
if ( MC._currentframe != 3 ){


}



//**********************

if( MC._currentframe <  MC._totalframes ){


}



//******************
_currentframe เฟรมปัจจุบัน

_totalframes จำนวนเฟรมทั้งหมด

ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 11:27 น.
ขอบคุณมากครับ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 12:03 น.
ถามต่อสักนิดครับ พอดีผมเขียนโค้ดสั่ง RollOver RollOut ง่ายๆมาชุดนึงก็ใช้งานไดดี แต่พอจะลองลดรูปให้เป็น fuction มันไม่ได้ผลครับ ไม่รู้พลาดตรงไหน


http://img2.f0nt.com/flash/1d817d087f66b89ceaa035b8aec98b1a.swf

function McIn(mmc) {
mmc.onEnterFrame = function() {
mmc.nextFrame();
};
}

b1.onRollOver = function() {
service.onEnterFrame = function() {
service.nextFrame();
};
};
b1.onRollOut = function() {
service.onEnterFrame = function() {
service.prevFrame();
};
};
b2.onRollOver = McIn(service2);
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: iannnnn เมื่อ 08 ม.ค. 2007, 13:04 น.
เหมือนปุ่ม (http://f0nt.com/forum/Themes/iannnnn/images/english/reply.gif) เลย  :25:
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 08 ม.ค. 2007, 13:42 น.
ไม่สามารถทำแบบนั้นได้ครับ  อยากทราบเหตุผล ถามอีกรอบครับ เผื่อไม่อยากอ่านยาว   :40:

function McIn() {
     this.mmc.onEnterFrame = function() {
        this.nextFrame();
    };
}


b2.mmc = service2;
b2.onRollOver = McIn;


แบบนี้ทำได้ครับ ลองอ่านโค้ดดู



function McIn() {
     this.mmc.onEnterFrame = function() {   //<----- this ตรงนี้หมายถึงที่ปุ่มมีตัวแปร mmc อยู่
        this.nextFrame();   //<----- this ตรงนี้หมายถึงตัว mmc เพราะ function oี้ทำงานที่ตัว mmc
    };
}
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 14:35 น.
ได้แล้วครับ  เข้าได้แต่ออกไม่ได้  :05: มันคงไม่ใช่แค่เพิ่มชุดคำสั่งเลียนแบบแหงๆเลย  :44:
http://img2.f0nt.com/flash/178ea7b0a658cac0c9ee76fefc774464.swf
function McIn() {
this.mmc.onEnterFrame = function() {
this.nextFrame();
};
}
function McOut() {
this.mmc.onEnterFrame = function() {
this.prevFrame();
};
}
b2.mmc = service2;
b2.onRollOver = McIn;
b2.onRollOut = McOut;




อยากรู้เหตุผลครับ ขอบคุณมากครับ  :22:

นิดนึงครับ การสั่งแบบนี้แปลว่าถ้าเอาเมาส์มาแตะ มันจะเป็น nextFrame() ไปเรื่อยๆ แม้ว่ามันจะถึงเฟรมสุดท้ายแล้วก็ตามใช่มั้ยครับ? อย่างนี้มันจะมีปํญหากับ memory หรือเปล่า หรือว่าผมคิดมากเกินไป
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 08 ม.ค. 2007, 15:16 น.
ถูกต้อง มันมีปัญหากับการทำงานโดยไม่จำเป็นแน่นอน

(ลองใส่ trace ลงไปดู ถึงว่า่จะทำงานไปสุดแล้ว แต่มันก็ยัง trace ออกมา)


function McIn() {
this.mmc.onEnterFrame = function() {
this.nextFrame();
if(this._currentframe == this._totalframes){
delete this.onEnterFrame;
}
};
}
function McOut() {
this.mmc.onEnterFrame = function() {
this.prevFrame();
if(this._currentframe == 1){
delete this.onEnterFrame;
}
};
}
b2.mmc = service2;
b2.onRollOver = McIn;
b2.onRollOut = McOut;


ลองนี่ดูครับ 

ตอนเล่นเฟรมกลับสคริปที่เขียนมามันทำงานได้ครับ ไม่แน่ใจว่าทำไม ที่มห้ดูมันถึงไม่กลับ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 15:26 น.
โอ้ได้แล้วครับ คุณฮาร์ตนี่แม่นจริงๆ

ขอบคุณที่เสียเวลาครับ จะไปหาอ่านเรื่อง this ใหม่ครับ เรียงลำดับไม่ค่อยถูก
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: iannnnn เมื่อ 08 ม.ค. 2007, 15:35 น.
โอ้ว สาระเยี่ยมมาก มีประโยชน์ๆ :45:

(+2) ทั้งคู่ครับ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 08 ม.ค. 2007, 15:43 น.
สาเหตุว่า ทำไม

b2.onRollOver = McIn(service2);


ไม่ได้


ก็เพราะว่ามันจะมองเป็น

b2.onRollOver = การใช้งานฟังชั่น McIn โดยส่งค่าไปเป็น service2

แต่ถ้า

b2.onRollOver = McIn

มันจะมองว่า  onRollOver  ชี้ไปที่ McIn
ซึ่ง McIn มีความหมายเป็นฟังชั่น
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 16:48 น.
จากตรงนี้ผมลองเป็น

b1.onPress = getURL("http://www.hotmail.com");

มันจะไม่ได้

แต่ถ้าไปที่ ปุ่ม แล้วเป็น

on (Press) {
getURL("http://www.hotmail.com");
}

มันถึงจะได้
ถ้าอย่างนั้นวิธีการ grtURL ใน timeline หลัก เราต้องทำเป็น function ให้เรียกใช้เหรอครับ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 08 ม.ค. 2007, 17:20 น.

function toURL(){
   getURL(this.url);
}

b1.url = "http://www.hotmail.com";
b1.onRelease = toURL;






ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 08 ม.ค. 2007, 18:17 น.
อ้างคำพูดจาก: heart เมื่อ 08 ม.ค. 2007, 17:20 น.
function toURL(){
   getURL(this.url);
}

b1.url = "http://www.hotmail.com";
b1.onRelease = toURL;

ขอบคุณมากครับ
ที่ผมกำลังงมๆแล้วก็เลิกทำไปเป็นอย่างนี้ครับ

function toURL(){
   getURL(url); 
}

b1.url = "http://www.hotmail.com";
b1.onRelease = toURL;



อ้างอิง

สับสนกับการใช้ this จริงๆครับ   :41:
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 08 ม.ค. 2007, 20:30 น.
this คือ ที่นี่


function a(){

  trace(this);

}

ถ้า
a();
คำว่า this จะหมายถึง จุดที่เราเขียนฟังชั่นลงไป อาจจะหมายถึง _root ถ้าเราเขียนบน _root


ถ้า


btn.onRelease = a;

แล้ว

this จะหมายถึง btn เำพราะว่ามันเหมือนว่าฟังชั่นนี้ทำงานบน btn

อ้างอิงfunction toURL(){
   getURL(url);
}

b1.url = "http://www.hotmail.com";
b1.onRelease = toURL;

จากโค้ดนี้ getURL(url);  จะต้องเปลี่ยนเป็น getURL(this.url);
เพราะว่าถ้า url เฉยๆจะหายถึง url ที่อยู่ ณ.จุดที่เขียนฟังชั่นลงไป  แต่ถ้า this.url จะหมายถึง  ฟังชั่นนี้ไปรันอยู่บน  b1  มันจะหมายถึงตัวแปร url ของ b1
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: WuTtY เมื่อ 02 ก.ค. 2007, 23:47 น.
อ้างคำพูดจาก: heart เมื่อ 08 ม.ค. 2007, 15:43 น.
สาเหตุว่า ทำไม

b2.onRollOver = McIn(service2);


ไม่ได้


ก็เพราะว่ามันจะมองเป็น

b2.onRollOver = การใช้งานฟังชั่น McIn โดยส่งค่าไปเป็น service2

แต่ถ้า

b2.onRollOver = McIn

มันจะมองว่า  onRollOver  ชี้ไปที่ McIn
ซึ่ง McIn มีความหมายเป็นฟังชั่น

เพิ่มเติมเรื่อง function ให้นะครับ การเขียน แบบ b2.onRollOver = McIn แบบนี้เค้าจะเรียกว่า pointer to function ครับ ซึ่งการเขียนแบบนี้มักจะใช้ตอนที่เราจะสั่งให้โปรแกรมเราทำงานใด ๆ เมื่อตอน runtime ครับ โดยที่เราไม่ยังไม่รู้ว่าตอนที่เราเขียน code (complie time) ว่าเราอยากให้มันทำอะไร

ตัวอย่างเพิ่มอีกนิดนะครับ ผมลองเอาของ คุณ heart ไปทำต่อ เลย เพิ่งรู้ว่า flash มันเขียนแบบนี้ได้ด้วยสบายจังแฮะ

s1 กับ s2 เป็น button ที่อยู่ใน main frame นะครับ code อันนี้ผมเขียนที่ frame

function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();

อธิบาย คือ ว่านอกจาก flash จะใข้งานแบบ point to function แล้วยังสามารถเอาค่า return ที่ออกมาจาก function เป็น function ได้ด้วย  :45: :45:

ประมาณนี้แหละครับ

จบจ้า

ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 11 ก.ค. 2007, 09:59 น.
ดีครับ ทำให้โค้ดสั้นลงอีก
ไม่เคยใช้แบบนี้เลย
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: iannnnn เมื่อ 28 ส.ค. 2007, 04:28 น.
อ้างคำพูดจาก: WuTtY เมื่อ 02 ก.ค. 2007, 23:47 น.
s1 กับ s2 เป็น button ที่อยู่ใน main frame นะครับ code อันนี้ผมเขียนที่ frame

function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();


ช่วยอธิบายตรงนี้ละเอียดนิดได้ไหมครับ :46:
หรือยกตัวอย่างก็ได้ อ่านแล้วไม่เข้าใจเลย ว่าจะเอาไปใช้ทำอะไรครับ :44:
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: คนตาบอดข้างเดียว เมื่อ 28 ส.ค. 2007, 10:39 น.
มารอ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 28 ส.ค. 2007, 11:54 น.
function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();


คิดซะว่าฟังชั่น คือวัตถุ 1 วัตถุ

ชื่อฟังชั่น(); <---- มีวงเล็บ จะหมายถึง สั่งทำงานฟังชั่นนั้น ทันที โดยจะส่งค่าเข้าไปในฟังชั่น ในวงเล็บ หรือปล่อยว่างไว้ก้ได้
ชื่อฟังชั่น <-----ไม่มีวงเล็บ จะหมายถึง อ้างถึงวัตถุที่เป็นฟังชั่น นั้นๆุนั้น

เหมือนกับ
remote();  <--- เป็นการใช้งาน คือกดที่ปุ่มของรีโมท  โดยถายในวงเล้บอาจจะส่งค่าเป็นปุ่มที่กด เช่นปุ่มเลข 3 จากนั้นในฟังชั่นจึงทำการเปิดช่อง 3

remote;   <------ ไม่ได้เป็นการใช้งาน แต่เป็นการชี้ไปที่ ตัวรีโมท ว่า รีโมทตัวไหน
เช่น

a  = remote;

ให้ a ชี้ไปที่ตัว รีโมท ดังนั้น

remote();

a();

สองคำสั่งนี้จะมีค่าเท่ากัน เพราะสั่ง a ทำงาน  a ชี้ไปที่รีโมท รีโมทก็ทำงาน


==================================================


ถ้าปุ่มกดชื่อ  s1

s1.onRelease = remote();

จะ้เป็นการ สั่งให้ onRelease = ทำงานโดยกดรีโมททันที โดยเมื่อทำงานแล้ว รีโมทจะรีเทิร์นค่ากลับมาว่า "ช่อง 3 นะ"
แล้วจึงตีความได้ว่า

s1.onRelease = "ช่อง 3 นะ";

onRelease ของปุ่มนี้ทำงานใดๆไม่ได้เลย onRelease มันไม่ได้สั่งให้ทำงานเลยสักนิด แต่มันตรงกับค่าที่ฟังชั่นส่งมา

=================================

ถ้า

s1.onRelease = function() {
      remote();
}


ภายในบล็อกสีแดง คือวัตถุหนึ่ง ทำงานโดย เรียกใช้วัตถุ remote
แบบนี้ก็ถูกใช้บ่อย และใช้ได้ดี

===============================
function remote(){
    retuen "ช่อง 3 นะ";
}

s1.onRelease = remote;

แบบนี้ก็ถูกต้อง เพราะว่า onRelease ชี้ไปที่ วัตถุ รีโมท เมื่อ onRelease จึงสั่งงานรีโมท
========================

ย้อนกลับไปที่


function doSomething() {   
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();


s1.onRelease = doSomething(); <--เป็นการใช้งานฟังชั่นทันที ไม่ได้ชี้ไปที่ฟังชั่นนั้น ก็จริง

แต่ว่า

function doSomething() {   
   return function() {  <-----ฟังชั่นนี้ เมื่อทำงานแล้วก็รีเทิร์นค่ากลับไปเป็นวัตถุนี้  เมื่อ onRelease จึงทำงานที่วัตถุนี้
      s2._x = 0;
   }
}

===============================

ถึงแม้แบบนี้ก็เขียนได้ แต่ถ้าจะให้ดี แบบนี้ สั้น และ ง่าย กว่าไหม

function  doSomething() {
      s2._x = 0;
   }


s1.onRelease = doSomething;
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Ah! เมื่อ 28 ส.ค. 2007, 12:06 น.
หูย  :25: :25: :25:





แข่งกันสั้น
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 28 ส.ค. 2007, 12:14 น.
จริงๆถ้าสั้นๆนะ

ปุ่มเดียว

s1.onRelease = function(){
//----------------
}

แต่ถ้าหลายปุ่มทำงานคล้ายๆกัน

function dosomething(){
//------------------
}

s1.onRelease = s2.onRelease s3.onRelease = dosomething;
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: Layiji เมื่อ 28 ส.ค. 2007, 13:45 น.
+ เลยครับ  :25: :25:
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: iannnnn เมื่อ 28 ส.ค. 2007, 15:06 น.
+ ด้วย นึกภาพตามออกละ :25:


แต่ก็ยังไม่เข้าใจคำว่า return ครับ
มันเกิดมาเพื่ออะไรแล้วมีไว้ทำไม :09:
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: heart เมื่อ 28 ส.ค. 2007, 15:41 น.
return คือ ส่งค่ากลับไปยังจุดที่เรียกใช้งานฟังชั่น นี้

ตัวอย่าง ฟังชั่นบวกเลข โดยส่งค่าไปเป็น a และ b


ไม่ใช้งาน return


function addNum(a , b){
        ans = a+b;
        trace( ans );
}

//เรียกใช้ฟังชั่นด้านบนทำงาน
addNum( 1 , 2);

ก็จะส่งค่าไปเป็น 1 และ 2
พอฟังชั่นทำงานเสร็จก็จะแสดงผลว่า 3



========================================

ตัวอย่างโปรแกรมเดียวกัน แต่ใช้ return

function addNum(a , b){
        ans = a+b;
        return  ans;
}

a = addNum( 1 , 2 )

trace( a );



ได้ผลเช่นเดียวกับข้อแรก

เมื่อคำนวนเสร็จ จะ return ค่ากลับมาให้ a
แล้วแสดงผล a อีกที

*** นึกซะว่า จุดที่เรียกฟังชั่นนั้น คือ ค่าที่คำนวนออกมาแล้ว
เช่น

a = addNum( 1 , 2);

ุถ้าเรามองซะว่าจุดที่เรียกใช้เป็นผลลัพธ์ ก็จะมองได้ว่า

a = 3;


หรือ

trace( addNum( 1 , 2) );

ก็เป็น

trace( 3 );
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: WuTtY เมื่อ 28 ส.ค. 2007, 18:32 น.
อ้างคำพูดจาก: heart เมื่อ 28 ส.ค. 2007, 11:54 น.
function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();



ถึงแม้แบบนี้ก็เขียนได้ แต่ถ้าจะให้ดี แบบนี้ สั้น และ ง่าย กว่าไหม

function  doSomething() {
      s2._x = 0;
   }


s1.onRelease = doSomething;



ประโยชน์ของการเขียนแบบ เอา return ไว้ใน function ให้ มัน return เป็น function ออกมา ข้อดีของมันคือสามาร pass pameter ให้ function นั้นได้ด้วย เช่น

มี ปุ่ม 5 ปุ่ม
4 ปุ่มแรก จะมีหน้าที่ set คำพูดให้ ปุ่มที่ 5 เมื่อกดปุ่มที่ 5 จะให้มัน trace คำตามที่ set ไว้
function doSomething(msg) {
   return function() {
      trace(msg);
   }
}

b1.onRelease = function() {
    b5.onRelease = doSomething("Hello from B1");
}
b2.onRelease = function() {
    b5.onRelease = doSomething("Hello from B2");
}
b3.onRelease = function() {
    b5.onRelease = doSomething("Hello from B3");
}
b4.onRelease = function() {
    b5.onRelease = doSomething("Hello from B4");
}



จะเห็นว่าเราไม่ต้องพิมพ์ code trace ใน b5 หลาย ๆ ครั้ง ใน b1-b4 .OnRelease ยิ่งถ้า code ตรง trace ยาว ๆ เช่นมีการคำนวณอะไรที่ยุ่งยาก code ตรั้งนั้นก็จะซ้ำ ๆ กันยาวไปอีก เวลาแก้ก็ต้องแก้หลายจุด

การเขียน แบบนี้เรียนกว่า pointer to funtion ซึ่งภาษาที่เป็น script ในตระกูล javascript / action script มันจะ implement ไว้

ปล. code ตรง b1-b4.OnRelease ก็ใช้วิธีเดียวกัน สามารถลด code ได้อีก
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: iannnnn เมื่อ 31 ส.ค. 2007, 00:05 น.
ขอบคุณทั้งคู่ครับ :46:
อ่านค่อนข้างเข้าใจ แต่ก็ยังนึกออกมาเป็นภาพไม่ออก :05:
สงสัยผมจะหัวทึบด้านโปรแกรมมิ่งจริงๆ
เดี๋ยวยังไงจะลองเขียนอะไรขึ้นมาสักตัวโดยใช้ความรู้จากข้างบนดูครับ
ชื่อเรื่อง: Re: ถ้าไม่ใช่เฟรมนี้ กระทำ...
โพสต์โดย: คนตาบอดข้างเดียว เมื่อ 31 ส.ค. 2007, 15:10 น.
http://www.f0nt.com/forum/index.php/topic,6169.0.html (http://www.f0nt.com/forum/index.php/topic,6169.0.html)

เหมือนกับแบบนี้ไหมครับผม