อันนี้ขอถามหลักการคร่าวๆ กับคำสั่งสำคัญในการทำงานสักนิดครับ
สมมุติว่าผมจะทำหนังสือรุ่น (แบบออนไลน์)
ทีนี้เรื่องข้อมูลผมอยากแยกเป็น swf เป็นคนๆไปน่ะครับ
เราจะมีวิธีการจัดการเรียกไฟล์มาโชว์อย่างไร และ การ load แต่ละหน้าขึ้นมาควรทำในตัวไหน (ตัวหลัก หรือ swfแต่ละคน)
ขอบคุณครับ
วิธีที่ผมใช้นะครับ
คนอื่นอาจทำได้ดีกว่าแต่ลองดูวิธีผมก่อนนะ
- สร้างตัวแม่ขึ้นมาตัวนึงนะครับ สมมติชื่อ main.swf
- ให้ตัวแม่นี่แหละโหลดตัวลูกเข้ามา (01.swf / 02.swf /03.swf / ... )
โดยการโหลดตัวลูกเข้ามาเนี่ย ให้เปิดตัวแม่
แล้วสร้าง Blank MC ขึ้นมาตัวนึง สมมติให้ชื่อว่า ref
แล้วก็ใส่คำสั่งว่า
_root.ref.loadMovie("01.swf")
หรืออะไรก็ว่าไปครับ :42:
ส่วนตัวลูกก็ออกแบบไปเลยตามสเบย
ความรุ้ใหม่ครับ :25:
ส่วนผมจะทำยากกว่าพี่แอนหน่อย สร้าง Blank MC01, 02 และ03 เอาไว้ที่ เฟรม มี swf 3 ตัวก็สามเฟรม สั่ง stop มันซะทุกเฟรม จากนั้น เฟรมหนึ่งก็ ใช้ loadMovie("1.swf",Blank MC01"); เฟรมสอง ก็ loadMovie("2.swf",Blank MC02"); เฟรมสามก็ loadMovie("3.swf",Blank MC03");
แล้วก็ ใช้วิธี สร้างปุ่มในเลเยอร์ใหม่ คลิกปุ่มที่หนึ่งไปเฟรม1 คลิกปุ่มที่2ไปเฟรม2 ... 3ไป3 ......
ทำ loading ที่ swf ลูกดีกว่ามั้งครับ
น่าจะเขียนโค้ดได้ง่ายกว่า
เดี่ยวผมลองเสร็จ จะมาตอบใหม่ละกันครับ
-----------------------------------------------------
ทำที่ตัวลูกดีกว่าครับ
ก็เขียนโค้ด loading เหมือนปกติเลย
คือประมาณนี้
percent = (this.getBytesLoaded() / this.getBytesTotal())*100
this.loadBar._width = percent;
this.loadText = Math.round(percent)+"%";
if (percent == 100 ) {
this.gotoAndStop(3);
}
อ้างอิงจาก http://www.thaiflashdev.com/board/index.php?showtopic=10420&hl=
แต่ให้ระวังปัญหานึงคือ
ถ้าเรามีการเรียกใช้ _root ที่ตัวลูก
มันจะไปหมายถึง _root ที่ตัวแม่ด้วย
แต่สามารถ ป้องกันปัญหานี้โดยการ
lock ไม่ให้ _root ของตัวลูกมาถึงแต่แม่
ด้วยการใส่
_lockroot = true
ที่ timeline แรกของตัวลูก
แอบอ้างจากhttp://www.thaiflashdev.com/board/lofiversion/index.php/t11331.html
อันนี้ ผมอ่าน แล้วสรุปตามที่เข้าใจนะครับ
ถ้าอ่านของผมแล้วไม่เข้าใจ ก็ไปอ่านตามลิ้งที่ผมลิ้งมาก็ได้ครับ
- -
วิธีของเฮียแอนครับ ผมก็ใช้
ส่วน preload ผมทำแบบพี่ poloh ครับ..
โอ๊ะ :25:
การใส่ _lockroot = true นี่ทำให้เวลาเราสั่ง _root ที่ตัวลูกปั๊บ
มันจะหมายถึง root แค่ในตัวลูกใช่ไหมครับ ไม่ลามมาถึงตัวแม่
_lockroot มีผลทั้ง movie นั้นครับ (ลามถึงตัวแม่ด้วย)
คือถ้าเปลี่ยน _root ไปอยู่ที่ movie clip ใดแล้ว
_root ทุกที่ จะไปเรียกหา mc นั้นเลยครับ
...
ระวังด้วยนะครับ - -"
ป.ล. ผมไม่ได้ใช้ _lockroot ครับ เพราะมันวุ่นวาย
แล้วถ้าจะอ้าง _root ของตัวลูก จากตัวลูกเฉยๆ นี่
ต้องเรียกลามตั้งกะ _root ใหญ่เลยหรือเปล่าครับ
เช่น _root.ref.blablabla (ในกรณีที่ mc ที่ตูเรียกลูกเด็กเล็กแดงมาแปะไว้ชื่อ ref)
ถูกต้องเลยครับ ^^"
:27: ขอบคุณครับ (+2)
ผมก็ไม่เข้าใจเรื่อง _root แต่จะทำเป็นภาพให้ โดยการถามตาแอนนี่แหละ :30:
(http://img2.f0nt.com/23/985def55f2c889daa74f1425c20a1056.gif)
อันนี้คือเราจะเรียก mc1 กระทำอะไรซักอย่างโดยเรียกจาก timeline หลัก
(http://img2.f0nt.com/23/ec54a4432ad084ba1704db2eb4906503.gif)
สั่งจาก mc ตัวอื่นๆก็ได้ครับ
มันจะยิ้มทำไมที่มุมปาก :39:
(http://img2.f0nt.com/23/72290aa27a7a5b78c23ee6635e770420.gif)
เขียนอ้างตัวเอง ใน mc ตัวเอง
(http://img2.f0nt.com/23/a352d14127412b7b0f375e360a1a2290.gif)
หากมีการอ้างใน Mc2 แต่ ยังไม่ถึงเวลาที่ mc2จะโผล่ในจอ ก็จะไม่เกิดการกระทำ
:30: สุดยอดเลยคร้าบบ
เห็นภาพขึ้นเยอะเลย
- -* ผมก็ไม่รู้จะอธิบายยังไงเหมือนกัน แต่เจอของพี่เลย์แล้ว..
สุดยอดครับ :42:
กรณี load movie ครับ
(http://img2.f0nt.com/23/a89d0fe01cd92e16fcbd4a125a68642f.gif)
การอ้างถึง mc เมื่อมีการ Loadmovie มาแล้ว
(http://img2.f0nt.com/23/b552b9e304066f2a95e77abe656ecc0d.gif)
อันนี้ไม่ได้ครับ
ต้องแก้เป็น
(http://img2.f0nt.com/23/a0b4720cfa8a1ae662d5359d9c271799.gif)
:30:
การเรียกลูกหลาน คือ Mc นั้นๆมี Mc ซ้อนอยู่ข้างใน
เช่น
Mcหัวคน มี Mcปาก อยู่ภายใน
เรียกอย่างนี้
(http://img2.f0nt.com/23/f39ba359f854000ec3204e05069096d3.gif)
:30: ครับ ...........ป๋านี่.......
เห็นภาพชัดเจนเลยครับ :25:
ถ้าพวกภาษาจาวามีการ์ตูนแบบป๋าสอนเนี้ย
เด็กไทยคงจะเก่งกันเยอะเลยนะเนี้ย :12:
:03: เรื่อง lockroot ผมเข้าใจผิดเหรอนี่
ได้แก้ไขความเข้าใจผิดไปทีเดียวเลย :22:
ขอบคุณครับ :46:
เฮ้ย :30: :30:
แ่ล้วกรณีแม่เรียกลูกใช้ไงนะครับ
อ้าปากตะโกนครับ :42:
เอาจริง ๆคือ เหมือน mc ตัวนึงเลยมั้งครับ
คือ โหลด swf ใส่ mc
แล้ว ใน swf มี mc อะไรข้างใน
ก็เรียกแบบ . เข้าไปเลย
:44:ที่ผมเข้าใจนะครับ
ไม่รู้ว่า จะผิดอีกหรือเปล่า
อ้างคำพูดจาก: Layiji เมื่อ 23 มี.ค. 2007, 12:59 น.
แ่ล้วกรณีแม่เรียกลูกใช้ไงนะครับ
ถ้าจำไม่ผิด ต่อจากการ์ตูนป๋าห์
(http://img2.f0nt.com/23/5a43d0acf79e8c54b782b4982456835d.png)
ไม่งั้นก็
s.gotoAndPlay(2);ไปเลยครับ
กลายเป็นประเด็นร้อนละ.. :42:
แล้วถ้าลูกเรียกแม่ล่ะครับ ป๋าเลย์.. อยากเห็นอ่าครับ
_parent.play();
:04: :04:
แล้ว..
_self.play(); ล่ะครับ
:04:
:30: แอคชั่นสคริปต์ยังเอามาเล่นมุขได้อีก
:34:
:04:
ทำไมหนวดโง้ง :08:
โอว..เข้าใจแล้วครับ งงมาตั้งนาน ขอบคุณป๋าครับ :12:
อ่านจู๋นี้แล้วสับสนชีวิต :08:
_root.เฟริน.หนวดโง้ง.gotoAndPlay("หนวดแด๊นซ์");
สามเอ็งอ่านนี่แล้วอธิบายเป็นภาพหน่อยแซะ
อ้างคำพูดจาก: pinocchio เมื่อ 26 มี.ค. 2007, 20:59 น.
โอว..เข้าใจแล้วครับ งงมาตั้งนาน ขอบคุณป๋าครับ :12:
ถ้าถูกใจก็บวกเลยครับ :40:
เขายังไม่เป็นวัวเลยครับ :31:
บอสตกข่าววะ พี่หนุ่ม เขาบวก ให้คนอื่นตั้งแต่เป็นเหาแล้ว........
อ้างคำพูดจาก: จักรี เมื่อ 27 มี.ค. 2007, 19:18 น.
บอสตกข่าววะ พี่หนุ่ม เขาบวก ให้คนอื่นตั้งแต่เป็นเหาแล้ว........
แหม.... :16:
เอ่อ พอดีกลับไปอ่านส่วนที่เป็นเรื่องของ function น่ะครับ
http://f0nt.com/forum/index.php?topic=8614.msg465333#msg465333
ใครเข้าใจอธิบายเป็นภาพให้ทีครับ :08:
ถ้าเป็นผม ผมจะเขียน xml ขึ้นมาตัวนึง เก็บประวัติ และรูปของแต่ละคน
พอจะแสดงใคร ก็ไปดึง jpg ของคนนั้นที่อ่านได้จาก xml มาแหะ และตัวหนังสือมาแปะ
เรื่องนี้ผมก็ยังไม่ค่อยเข้าใจแฮะ
อ้างคำพูดจาก: Layiji เมื่อ 28 มี.ค. 2007, 12:06 น.
เอ่อ พอดีกลับไปอ่านส่วนที่เป็นเรื่องของ function น่ะครับ
http://f0nt.com/forum/index.php?topic=8614.msg465333#msg465333
ใครเข้าใจอธิบายเป็นภาพให้ทีครับ :08:
- -* พร้อมรึยังครับ แหะๆ
ไม่รู้ว่าจะใช่อย่างที่พี่เลย์ต้องการหรือเปล่านะครับ
ป.ล. Text ล้วนครับ :42:
ขออนุญาตยกมานะครับ
อ้างอิง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;
จากตัวอย่าง ผมขออธิบายตัว onRollOver, onRollOut ก่อนนะครับ
onRollOver, onRollOut คือ Built-in Function หรือฟังก์ชั่นที่มีการกำหนดการใช้งานมาก่อนแล้ว และเป็นของโปรแกรม Flash ครับ หรือบางทีจะเรียกว่า Event เพราะว่า ฟังก์ชั่นเหล่านี้จะทำงานเมื่อมีการกระทำตามเงื่อนไข หรือตามเหตุการณ์บางอย่าง เช่น
onRollOver ฟังก์ชั่นนี้จะทำงานเมื่อเอาเมาส์ไปวางบนวัตถุที่กำหนดครับ
แล้วทีนี้จากฟังก์ชั่นที่ว่า เราสามารถกำหนด/ตั้งการทำงานได้ 2 แบบใหญ่ๆ ครับ คือ
1. ใส่มันตรงๆ บนวัตถุเลย เช่น
on(press){ .... }2. ใส่ผ่าน Instance Name บนเฟรมของ Timeline เช่น
mc1.onPress = function(){ .... }มาถึงส่วนของฟังก์ชั่นแล้วครับ
ในแบบข้อ 2 ที่ผมว่าไปนั้น จะสามารถทำได้อีก 2 แบบย่อยก็คือ
2.1 กำหนดฟังก์ชั่นการทำงานพร้อมกับกำหนด Event
mc1.onPress = function(){ .... }และ
2.2 กำหนดฟังก์ชั่นการทำงานก่อน แล้วจึงกำหนด Event และฟังก์ชั่น
function doOnPress(){ .... }
mc1.onPress = doOnPress;โดยของพี่เลย์เป็นแบบที่ 2.2 ครับ
ซึ่งแบบ 2.2 นั้นจะดีตรงที่ว่า เราเขียนฟังก์ชั่นแค่ครั้งเดียว แล้วสามารถให้ปุ่มอื่นเรียกใช้ได้ทันที
แต่เราก็ต้องเขียนการทำงานให้ครอบคลุมด้วยนะครับ
ส่วนการใช้ this ขออธิบายแบบง่ายๆ ก่อนนะครับ
- this เอาไว้ ชี้เฉพาะไปเลยว่า เราต้องการสั่ง ตัวนี้/วัตถุชิ้นนี้ (นั่นคือวัตถุที่เราใส่ Script อยู่) ให้ทำงาน
- this เอาไว้ชี้เฉพาะตัวแปร ณ วัตถุ/ฟังก์ชั่นนี้ เท่านั้น
ในเงื่อนไขหลัง ถ้า ชื่อตัวแปรเหมือนกัน แต่อยู่ต่าง Movie Clip กันเช่น อยู่ที่ Timeline หลัก กับอยู่ที่ Movie Clip จะไม่มีปัญหาเท่าไหร่ครับ เพราะเวลาเราจะเรียกใช้นั้น ก็ต้องทำการเรียก _root, _parent อยู่แล้ว
แต่ถ้าชื่อตัวแปรเหมือนกัน อยู่ใน Timeline ชุดเดียวกัน จะเกิดปัญหาครับ
ขอยกตัวอย่าง
var count = 0;
function doCount(){
var count = 0;
count += 2;
trace("count in function: "+count);
}
doCount();
count += 5;
trace("count on timeline: "+count);สังเกตว่า ชื่อตัวแปรเหมือนกัน แต่อยู่ในฟังก์ชั่นตัวนึง และนอกฟังก์ชั่นตัวนึง
ทีนี้ผลลัพธ์ที่ออกมาจากการรันแล้ว จะได้ตามนี้ครับ
อ้างอิงcount in function: 2
count on timeline: 5
ที่ count in function ได้เป็น 2 นั่นเพราะว่า ในฟังก์ชั่นมีการประกาศตัวแปรไว้ครับ
เมื่อเราสั่ง count += 2 ในบรรทัดถัดไป ตัวโปรแกรมจึงรู้เอาเองว่า ต้องใช้ count ตัวล่าสุดที่ประกาศในฟังก์ชั่น ค่าตัวแปรจึงเพิ่มขึ้นเป็น 2 ครับ
แต่เมื่อจบฟังก์ชั่นแล้ว ตัวแปรที่พึ่งประกาศนี้ จะหายไปเลยครับ
เพราะฉะนั้นเมื่อถึงบรรทัด count += 5
โปรแกรมจึงดึงเอาค่าตัวแปร count ตัวแรก มา +5 จึงได้ออกมาตามผลลัพธ์ข้างบนครับ
ถ้าเราทำงานไป จะเกิดอาการ งง เองเลยครับ (ผมเคยเจอแล้ว)
เพราะฉะนั้น อาจแก้ไขโดย
var count = 0;
function doCount(){
var count = 0;
this.count += 2;
trace("count in function: "+count);
}
doCount();
count += 5;
trace("count on timeline: "+count);เมื่อต้องการให้เพิ่มค่าตัวแปร count ในฟังก์ชั่น
หรือ
var count = 0;
function doCount(){
var count = 0;
_root.count += 2;
trace("count in function: "+count);
}
doCount();
count += 5;
trace("count on timeline: "+count);เมื่อต้องการเพิ่มค่าตัวแปร count ที่อยู่นอกฟังก์ชั่น
-------------------------
พวก _root, this, _parent ต้องอาศัยความเคยชินซักหน่อยครับ
- -"
ไม่รู้จะตรงประเด็นที่พี่เลย์ต้องการหรือเปล่านะครับ
เยี่ยมมากครับเจ้าก่อ ..... :12:
อ้างคำพูดจาก: poloh เมื่อ 22 มี.ค. 2007, 23:25 น.
แต่ให้ระวังปัญหานึงคือ
ถ้าเรามีการเรียกใช้ _root ที่ตัวลูก
มันจะไปหมายถึง _root ที่ตัวแม่ด้วย
แต่สามารถ ป้องกันปัญหานี้โดยการ
lock ไม่ให้ _root ของตัวลูกมาถึงแต่แม่
ด้วยการใส่
_lockroot = true
ที่ timeline แรกของตัวลูก
เอ๊ะ ทำไม ผม ลองใส่ ดูแล้ว มันทำให้เวลา ใช้ตัวแม่เรียก ตัวลูกมาเล่น mc ใน ตัว ลูก ไม่ทำงาน เลยครับ แต่ถ้า รันตัวลูกอย่างเดียวก็ไม่มีปัญหา โอเคครับ แก้ปัญหาได้แล้ว แก้โดยไม่ใส่ _lockroot = true แต่ใช้การ อ้างเอาตั้งแต่mcตัวแม่ยัน mc ตัวลูก :08:
และขอถามอีกข้อนึง
เมนูในตัวลูก สามารถสั่ง mc ในตัวแม่ได้มั้ยครับ ?แก้ปัญหาได้แล้วครับ ใช้หลักการณ์เดียวกัน ไม่น่าโง่เลย :08:
ขอบคุณมากครับ ที่รับฟัง :46:
:25:
:39:
สวัสดีครับ มากันแต่เช้าเลยนะครับ