ขอบคุณสำหรับกำลังใจครับ แต่ไม่แก้ล่ะ ปล่อยเป็นซากอารยธรรมไปละกัน
ขึ้นบทต่อไปดีกว่า
ว่ากันด้วยเรื่อง การทำซ้ำ หรือ duplicateMovieClip()duplicate [VT] จำลอง, See also: ทำซ้ำ, ถ่ายสำเนา, Syn. reproduce, copy counterfeit
duplicate [VT] เพิ่มเป็น 2 เท่า, See also: ทำเป็น 2 เท่า, Syn. redouble, repeat, reproduce, double, Ant. halve
duplicate [N] สำเนา, See also: สิ่งที่เหมือนกัน, Syn. copy, replica, photocopy, Ant. original
duplicate [ADJ] เหมือนกัน, Syn. identical, like, same, Ant. different; opposed
คือการก้อปปี้
MC ที่มีอยู่บน stage ให้เพิ่มขึ้นมา
โดยเราต้องใส่ชื่อใหม่ให้ด้วยและต้องสั่งลำดับชั้นเป็นการปิดท้าย
ตัวอย่างการเขียน
duplicateMovieClip(mc,"newname",depth);
mc คือmc ต้นแบบที่เราจะทำซ้ำ
"newname" คือ ชื่อของ mc ที่สร้างใหม่
depth คือลำดับชั้นความลึก (ยังจำกันได้ไหมจ๊ะ)
ตัวอย่างเช่น
duplicateMovieClip(_mc,"mc_1",this.getNextHighestDepth());
ก็คือ เราจะทำซ้ำไอ้เจ้า
_mc โดยใส่ชื่อใหม่ให้มันว่า
"mc_1" และเซ็ทลำดับชั้นมันโดย
this.getNextHighestDepth()ไอ้ตัวหลังนี่หมายถึงว่า เซ็ทลำดับชั้นให้สูงกว่าตัวต้นแบบ
*** ส่วนมากถ้า duplicate เมื่อไรจะใช้ getNextHighestDepth() เป็นตัวจัดลำดับชั้น ( มั่วเอาจาก Help
)
จำอันนี้ได้ไหมครับ ตัวแรนด้อมดวงดาว
ผมก็ใช้ duplicateMovieClip() นี่แหล่ะครับช่วยจัดการ
http://img2.f0nt.com/flash/0193d2dc3268a886aeca7c3815c86257.swfอันบนนั้นมีการใช้ลูปเข้าช่วยให้ทำซ้ำทีละมากๆ เดี๋ยวบทหน้าเราจะมา ลูป กัน
คราวนี้เราจะมา
"คลิกแล้ว ทำซ้ำ mc หนึ่งครั้ง และแรนด้อมขนาด"โดยเราจะคลิกเม้าส์ที่งาน แล้วทำซ้ำ mc ตรงตำแหน่งกดเม้าส์ แรนด้อมขนาด mc ที่สร้างมาใหม่
- สร้าง mc ดาวเล็กๆ หนึ่งดวง
- ตั้งชื่อว่า _mc
ก็
_root.onMouseDown=function(){ //เมื่อมีการกดเม้าส์ จะรันฟังก์ชั่นนี้
duplicateMovieClip(_mc,"mc_1",this.getNextHighestDepth()); //ทำซ้ำ _mc โดยชื่อใหม่คือ "mc_1" จัดลำดับชั้นให้สูงกว่า
mc_1._x = _xmouse; // ให้อยู่ตำแหน่งเดียวกับเม้าส์
mc_1._y = _ymouse; // ให้อยู่ตำแหน่งเดียวกับเม้าส์
rnd = random(90)+10; //สุ่มค่าขึ้นมาระหว่าง 10 - 100
mc_1._xscale = rnd; //เซ็ทขนาดสเกลให้เท่ากับค่าที่สุ่มขึ้นมา
mc_1._yscale = rnd; //เซ็ทขนาดสเกลให้เท่ากับค่าที่สุ่มขึ้นมา (ที่ใช้ค่าเดียวกันเพราะ สเกลจะได้ไม่เพี้ยนครับ)
};
ลองได้เลยครับ
http://img2.f0nt.com/flash/eba12db27c76b55128b95b9d7d882311.swfจะพบว่า มันสร้างแล้วววววววว
.... แต่พอเราจะสร้างอีก
มันดันลบอันที่สร้างออกมาเมื่อกี้ไปซะงั้น
สาเหตุคือ อะไรครับ ........
มาฝึกวิเคราะห์สคริปกันครับ (ฝึกบ่อยๆครับ มองให้ละเอียดจนเป็นนิสัย แล้วเราจะเจอปัญหาเอง และแก้ปัญหาได้เองครับ)
อ่านตามช้าๆ แล้วคิดตามครับ
เพราะเราสั่งให้สร้างจากต้นแบบคือ _mc และชื่อใหม่คือ "mc_1" เมื่อสร้าง mc_1 มาแล้ว
ถ้าจะสั่งให้มันสร้างใหม่อีก มันคงไม่สร้างนิ
เพราะบน stage นั้นมี mc_1 อยู่แล้วไงครับ
อ้าวววว
แล้วทำไมมันถึง ลบตัวเก่า แล้วสร้างตัวใหม่ล่ะ เห็นอยู่ว่ามันสร้างใหม่
มันสร้างแค่คลิกเดียวคลิกแรกล่ะครับ
คลิกต่อไปมันจะไม่สร้าง แต่
จะเอาอันที่สร้างเมื่อกี้มาแป๊ะตรงตำแหน่งเม้าส์ครับ
เพราะมันจะรันผ่านสคริป duplicate ไปเจอกับ สคริปตัวที่สั่งงาน mc_1._x = mc_1._y = ......บลา บลา บลา
มันก็เลยเปลี่ยนตำแหน่งตามเม้าส์ และแรนด้อมสเกลด้วยไงล่ะครับ
พอเข้าใจนะครับ
แล้วเราจะแก้ปัญหาอย่างไรล่ะอย่างน้อย ต้อง
ไม่ให้ชื่อซ้ำกันล่ะ อืมมมมม อันนี้แหล่ะ สำคัญเลย
โดยวิธีง่ายๆ คือ
สร้างตัวแปรขึ้นมาตัวนึงเอาใว้ต่อท้ายชื่อ ชื่อจะได้ไม่ซ้ำกันแน่นอนไงล่ะ
- หลักการคือ ให้ตัวแปรนี้เป็นตัวเลข เริ่มจากศูนย์ก็ได้ง่ายๆ
แล้วเมื่อมีการคลิกเม้าส์เพื่อ duplicate ก็ให้เอาตัวแปรนี้ไปต่อท้ายชื่อ mc ที่สร้างใหม่ ก็จะได้ mc0
แล้วบรรทัดสุดท้ายของสคริปก่อนจบ ก็บวกตัวแปรขึ้นไป 1 ค่า ตัวแปรตัวนี้ก็จะเป็น 1
- พอรอบที่สอง mc ที่สร้างใหม่ ตัวแปรที่บวกค่าแล้วมาต่อ ก็จะใด้ชื่อว่า mc1 อ๊ะ.....เห็นไหม ไม่ซ้ำกันแล้วครับ
- รอบต่อไปก็ mc2 mc3 mc4 mc5 ไม่ซ้ำแล้วคร้าบบบบบ
จำวิธี trace ที่กล่าวไปคราวที่...สองสามหน้านู้นได้ไหมครับ ต่อตัวหนังสือ กับแสดงค่าน่ะ
ใช้วิธีคล้ายๆกัน เอามาต่อกัน
i = 1
trace("mc_"+i) // output mc_1
เอาล่ะสาธยายมาซะนานนนนนนน จนเมาตัวหนังสือกันไปหลายตลบ
เราจะมาแก้สคริปอันตะกี้กันครับ
- ให้เพิ่มตัวแปรเข้าไปตั้งไว้เริ่มที่ 1 ก็ได้
- เอามาต่อท้ายชื่อ
- สั่งค่าต่างๆ
- บวกตัวแปรเพิ่มขึ้น 1
ก็จะได้สคริปประมาณนี้ครับ
i=1 //ให้เพิ่มตัวแปรเข้าไปตั้งไว้เริ่มที่ 1
_root.onMouseDown = function() {
duplicateMovieClip(_mc,"mc_"+i,this.getNextHighestDepth()); //เอามาต่อท้ายชื่อ
_root["mc_"+i]._x = _xmouse; // เรียกชื่อให้ถูกว่าตัวไหนเป็นตัวไหน
_root["mc_"+i]._y = _ymouse; //
v = random(90)+10;
_root["mc_"+i]._xscale = v; //
_root["mc_"+i]._yscale = v; //
i++; // บวกตัวแปรเพิ่มขึ้น 1 เพื่อให้รอบต่อไปจะได้ไม่ซ้ำกับรอบนี้ครับ
};
เอาล่ะทดสอบสคริปครับ
http://img2.f0nt.com/flash/bdb8ccec41ad9ac82318759e98f7f951.swf มาดูตรงนี้นิดนึงครับ
_root["mc_"+i] ไม่ขออธิบายว่าทำไมต้องเขียนรูปแบบให้จำยากแบบนี้นะครับ ( มันเขียนมาแบบนี้ครับ
)
สมมุติ i = 1 // _root["mc_"+i] ก็คือ _root.mc_1
สมมุติ i = 250 // _root["mc_"+i] ก็็คือ _root.mc_250
รูปแบบการเขียนออกจะงงๆใช่ไหมครับ
แต่จำรูบแบบนี้ให้ดีๆครับ
เพราะต่อไปถ้ามีการไดนามิคชื่ออ้างอิงต่างๆ การรันสคริปลูปต่างๆที่ต้องมีการเรียกใช้ชื่อเรียงๆๆกัน สมมุติเป็นพันๆชื่อ
การรันแบบนี้จะใช้ประโยชน์ได้เหลือหลายมากๆครับ
อันนี้สำคัญครับ
เรื่องต่อไปเรื่อง ลูป