กระทู้นี้ ไอ้คนเริ่มต้น(ฉันเอง) มันไม่ค่อยว่างมาสอนแล้วนะครับ และไม่ค่อยได้ทำ flash แล้วครับ
หากใครต้องการร่วมแบ่งปันความรู้ หรือมีเวลาว่างพอ ก็สานต่อได้เลยครับ
เดี๋ยวว่างๆโอกาสหน้า จะมารื้อฟื้นตัวเอง ด้วยการสอนของตัวเอง :08: อีกครั้งครับ (ตอนนี้เข้าหม้อหมดแล้ว)
ถึงตรงนั้น คงมีเรื่องปัญหาแปลกๆ ปัญหาหยุมหยิมที่ได้เจอจากการทำงานจริงๆ มาแบ่งปันเพื่อนๆครับ
ขอร่วมด้วยนะครับ พอมีความรู้นิดหน่อย
ถ้าอยากเริ่มควบคุมงานให้ได้ดั่งใจ ด้วยคำสั่งง่ายๆ แบบพื้นๆ
เช่น ให้มันหยุด และ กดซ้ำแล้วเล่นใหม่ (ง่ายไปไหมเนี่ย หรือชอบยากๆ))
เอางานเก่าที่ทำไว้มาต่อได้เลย
อันดับแรกเลย
สร้างเลเยอร์ขึ้นมาใหม่ อีกอันหนึ่ง เอาใว้้เขียนสคริปที่เฟรมอย่างเดียว จะได้คุมง่าย
คลิกขวาเฟรมสุดท้าย หรือเฟรมที่ต้องการให้มันหยุด ในที่นี้ผมเลือกเฟรมท้าย
แล้วเลือก " convert to blank keyframes " << ทำไมต้องคอนเวอร์ท ขอผ่านไปก่อนนะครับ
(http://img2.f0nt.com/10/696d11a1b4a60f18df6dc4c1c9826d42.jpg)
ต่อมา
โดยที่เรายังเลือกเฟรมนั้นอยู่ (ต้องเลือกไว้นะ อย่าคลิกที่อื่น)
กด F9 จะมี action script panel ขึ้นมา ไม่ต้องตกใจ ไม่น่ากลัวอย่างที่คิด
พิมพ์ลงไปว่า stop() มีวงเล็บปิดท้ายด้วยนะ // บ่งบอกว่า เมื่อมาถึงเฟรมนี้แล้ว ให้ "หยุด"
(http://img2.f0nt.com/10/cdbd89694fe86fcc881c5fef4eb514d0.jpg)
ต่อไป เราจะทำปุ่มจ๊ะ เอาไว้กด ให้มันเล่น
ปิด action script panel อันนั้นไปก่อน
แล้วสร้างเลเยอร์ใหม่ เอาไว้บนสุดเลย แล้ววาดสี่เหลี่ยมขึ้นมาอันนึง เล็กๆ
กด F8 เพื่อสร้างสร้างไอ้สี่เหลี่ยมอันนั้น ให้เป็นปุ่ม
จะมีกล่อง convert to symbol โผล่ออกมา ไม่ต้องรีบงง
เลือก button ไปเลย แล้วโอเค (ต่อไปจะต้องปวดหัวกะไอ้ symbol อีกหลายขนาน)
(http://img2.f0nt.com/10/d3583c133255a346ed79f8a08f22f4dd.jpg)
ตอนนี้ สี่เหลี่ยมนั้น กลายร่างเป็นปุ่มกดไปแล้ว ต่อไป เราจะสั่งมันล่ะ
คลิกเลือกที่ปุ่มนั้น กด F9 เปิด action script panel ขึ้นมา ไม่ต้องตกใจ ไม่น่ากลัวอย่างที่คิด
พิมพ์ลงไปว่า
on(release){ //อธิบายได้ว่า เมื่อกดแล้วปล่อยปุ่มนี้
play() //ให้ "เล่น"
}
(http://img2.f0nt.com/10/a2c0390d85a111a9dff9acffabdd24e2.jpg)
---------------------------------------
กด Ctrl+Enter
ลองดูผลงานครับ
อ่ะตัวอย่าง
http://img2.f0nt.com/flash/920e3a01fd457cb48502ae8e37c1ddbf.swf
ลองประยุกต์ใช้ดูนะครับ มีประโยชน์และสำคัญมากๆครับ
แนบไฟลตัวอย่างมาด้วย โหลดไปมั่วต่อได้เลย
จริงๆ มันมีรายละเอียดสำคัญๆ แทรกอยู่หลายจุดแต่ยังไม่อธิบาย เอาแค่พื้นๆง่ายก่อนนะครับ
เดี๋ยวอธิบายภาษาต่างดาวเยอะๆ พาลจะเลิกกันซะ คนทำก็งง คนสอนก็บ๊องไปตามๆกัน
ขอบคุณค่า :27:....เดี๋ยวพรุ่งนี้ถ้าไม่ขี้เกียจจะมาส่งการบ้านค่ะ (ติดงานเก่าด้วย ฮ่าๆ)
:12: แจมมาเลยครับพี่ พื้นเท่าไรยิ่งดี ประกวดความง่ายกัน
ตูไม่เก่ง as แต่พอจะใช้งานมันอยู่บ้าง
ขอแทรกเป็นทิปน้ำจิ้มเล็กๆ ละกันครับ
เวลาเราจะพิมพ์ Actionscript อะไรไปในช่อง
เราสามารถใช้ปุ่มลัดเพื่อความรวดเร็ว ไม่ต้องมานั่งสะกดเอาได้
โดยการจิ้มไปในกรอบ as นั้นแล้วพิมพ์ [ESC] ตามด้วยปุ่มที่น่าจะเป็นปุ่มลัด (ไม่ใช่กดพร้อมกันนะ แต่ใช้พิมพ์ตามกัน)
ลองเดาดูครับว่าพิมพ์ว่าอะไรแล้วจะได้อะไร (จริงๆ ก็มีบอกไว้ในปุ่มเครื่องหมายบวก)
เช่น
- ESC > S > T จะได้คำว่า stop()
- ESC > O > N จะได้ชุดคำสั่ง on อะไรก็ว่าไป ซึ่งเดี๋ยวเราจะมาพูดกันต่อจากนี้แหละ โดยจักรี
:25: ขอบคุณมากค่ะ เกดลดาจะตั้งใจเรียน
ขอบคุณมากครับ ผมยังไม่รู้เลยนะ :39: เเต่เดี๋ยวลองดู :12:
ที่เคยอ่านของพี่ Xsaint มา ลืมหมดแล้วแหละ :05:
:12: เยี่ยมครับ อยากเขียน AS ได้ ต้องระดับอนุบาลก่อน
:05: ตูยังได้แค่ stop กับ Play
ช่วยต่อของอาจารย์ทอปทีสิ
ผมอุส่าห์ไปลงเรียน
Action Script จริงๆจู๋ในทำนองนี้ ก็เคยมีอยู่บ้าง และดีด้วย เห็น มีเป็นพื้นฐาน ของ as โดย พี่X Saint น่าจะใช่
พอดี เนื่องจาก ในจู๋ อนุบาลงานแฟลชที่เน้น สอนพื้นฐานทางด้าน กราฟิก แอนิเมชั่น มากกว่า เป็นการเริ่มต้น
แต่พอดีเห็นพี่ ej_sing มาใส่สคริปแบบง่ายๆให้ เพื่อใช้ร่วมกับแอนิเมท และน่าจะดีถ้า ปนๆพื้นฐานของ as
ลงในพื้นฐานของแอนิมท เพื่อง่ายแก่การนำไปประยุคต์ใช้ต่อไป แล้วเห็นมีพี่ๆหลายท่าน
ต้องการให้จู๋นี้ต่อยอดจากจุ๋ของ พี่ X Saint ซึ่ง น่าจะ ลำบากซักนิด เพราะรู้สึก ว่า จุ๋นั้นจะ
สอนเลยขั้นพื้นฐานมาซํกหน่อยแล้ว ซึ่งถ้าให้มาต่อยอดในจู๋นี้ เดี๋ยวมันจะไม่อนุบาลอย่างชื่อจู๋ซะ ^^
แต่เราช่วยกันได้ โดยการมาแป๊ะพื้นฐานของ as แบบง่ายๆ ลงในจู๋ ให้ ลุงมาป้ามี ที่มีความสนใจ
ก็สามารถทำได้ และไม่ท้อไปซะก่อน
จากโพสต์แรกของพี่ ej-sing ที่สอน เรื่อง การ กดปุ่ม (on(release)) แล้ว เล่น (play();) กับ การหยุด(stop();)
ผมก็จะมา ขออธิบายกลับไปอีก 1 สเต๊ป คือการ ทำปุ่ม Button
http://www.f0nt.com/forum/index.php/topic,11366.120.html
พอได้ปุ่มหนึ่งปุ่ม ผมจะมาพูดเรื่องการใส่ สคริป gotoAndPlay(); และ gotoAndStop();
คือการสั่งให้มันไปที่ไหน เมื่อคลิกปุ่ม เมื่อได้ปุ่มจากติวเตอร์อันแรกมาแล้ว
ลอง สร้างเลเยอร์ 2 มาดูกัน แล้วคลิกขวาที่เฟรมที่10ของเลเยอร์2เลือก Insert Keyframe หรือกด F6 ก็ได้
(http://img2.f0nt.com/11/4b867b404cf41b27c2df3f8b2ccb3f8d.jpg)
ยังอยู่ที่ เฟรมที่10ของเลเยอร์ 2 แล้วไปเลือกที่กล่องเครื่องมือ ใช้เครื่องมือวาดรูปสี่เหลี่ยม หรืออะไรก็ได้ลงบน stage
(http://img2.f0nt.com/11/dac8201d34c3ff2292b0fe587eb5eb02.jpg)
ที่นี้ ลองใช้ สคริป stop(); ที่เฟรมที่ 10 หมายความว่าถ้าเล่นมาถึงเฟรมนี้ให้หยุด
ใส่โดยการ คลิกขวาที่เฟรมที่10เลเยอร์ที่2 เลือก action panel หรือกด F9 แล้วพิมพ์ โค้ด ว่า stop(); ลงไป แล้วปิด panel ซะ
(http://img2.f0nt.com/11/202e7983f95ed39628127191a6a884d9.jpg)
จากนั้นกลับมาที่เฟรมที่1ของเลเยอร์1 ลอง preview ดูตอนนี้ มันจะเล่นแล้วไปหยุดที่เฟรมที่ 10
ดังนั้น สั่งมันหยุด ตั้งแต่เฟรมแรกเลย โดยใส่โค้ด stop(); เหมือนเดิม โดยคลิกที่เฟรม1เลเยอร์1 กด F9 หรือคลิกขวา
เลือก action แล้วใส่ โค้ด stop(); เหมือน ตอนทำกับ เฟรมที่ 10
(http://img2.f0nt.com/11/9d945275da3e5615cc31bef076d7b83b.jpg)
ขั้นตอนต่อไป เราจะสั่งให้เมื่อกดปุ่ม จากเฟรม1 ให้ไปที่เฟรมที่10 โดย คลิกขวา ที่ ปุ่ม(ไอ้รูปสี่เหลี่ยมสีดำนั่นแหละ )
เลือก action panel หรือกด F9 ก็ได้ง่ายดี ลองมาสั่งให้เมื่อกดปุ่มให้มันไปเฟรมที่ 10 ดู
เมื่อกดปุ่ม ใช้ คำสั่งว่า on(release) ให้ไป เฟรมที่ 10 ใช้ คำสั่งว่า gotoAndPlay(10);
เขียนรวมกันดังนี้
on(release){
gotoAndPlay(10);
}
(http://img2.f0nt.com/11/47c617f5bd28e06ed17c1e9e6d5bdf78.jpg)
*คำสั่ง gotoAndPlay(); จะแตกต่างกับคำสั่ง gotoAndStop(); อยู่นิดเดียวคือ ถ้าสั่ง gotoAndPlay();
ไปที่เฟรม 10 แล้วถ้าบนไทม์ไลน์ ไม่มีคำสั่ง stop(); มันก็จะเล่นต่อไปเฟรมที่ 11 12 13
หรือถ้าไม่มีแอนิเมทในเฟรมถัดไปแล้วมันจะวนมาเล่น ที่เฟรมที่1 แต่ถ้าเป็น gotoAndStop();
มันจะไปถึงแล้วหยุดเลย
http://img2.f0nt.com/flash/14da6e1b6fb069f32701b9bbb26ee985.swf
ลองทำปุ่ม เพื่อ back กลับไป fram 1
(http://img2.f0nt.com/11/6f43fb85f2b4976b2ac2ff41d631b317.jpg)
(http://img2.f0nt.com/11/497fe7b3dfb67ca5b7a6314745d1f556.jpg)
(http://img2.f0nt.com/11/7aa232116722d50b06d983b034d516a5.jpg)
เปลี่ยนจากสั่งให้มันไปเฟรม 10 เป็นสั่งให้มันไปเฟรม 1
on(release){
gotoAndPlay(1);
}
(http://img2.f0nt.com/11/0b31665a5506c77a72647a5f03ab1921.jpg)
(http://img2.f0nt.com/11/d062baf66dd3266521cc65d093b8c292.jpg)
http://img2.f0nt.com/flash/fb7a33e0a93f97eb41c5fd3b2009fdcf.swf
:12:
อ้างอิง*คำสั่ง gotoAndPlay(); จะแตกต่างกับคำสั่ง gotoAndStop(); อยู่นิดเดียวคือ ถ้าสั่ง gotoAndPlay();
ไปที่เฟรม 10 แล้วถ้าบนไทม์ไลน์ ไม่มีคำสั่ง stop(); มันก็จะเล่นต่อไปเฟรมที่ 11 12 13
หรือถ้าไม่มีแอนิเมทในเฟรมถัดไปแล้วมันจะวนมาเล่น ที่เฟรมที่1 แต่ถ้าเป็น gotoAndStop();
มันจะไปถึงแล้วหยุดเลย
ขยายความสคริป อย่างง่ายๆ คิดแบบภาษาไทย (ผมใช้วิธีนี้เวลาคิดง่ายดีนะ) :33:
------------------------------------------------------
gotoAndPlay(); ก็คือ ไปที่(เฟรม)แล้ว "เล่น"
ตัวอย่าง
gotoAndPlay(10); ก็คือ ไปที่เฟรมสิบ แล้ว "เล่น"
หรือ
gotoAndPlay("kygel"); ก็คือ ไปที่เฟรมชื่อ "kygel" แล้ว "เล่น"
และ
gotoAndStop(10); ก็คือ ไปที่เฟรมสิบ แล้ว "หยุด"
หรือ
gotoAndStop("kygel"); ก็คือ ไปที่เฟรมชื่อ "kygel" แล้ว "หยุด"
้------------------------------------------------------
หลังจากนี้ ยาวเหยียดเลยนะถ้าสนใจอ่านไว้เหอะครับ น้ำเยอะหน่อย เนื้อนิดเดียว
แต่ผมเซ็งกะเรื่องนี้มาเยอะเลยแรกๆน่ะ
เราสามารถตั้งชื่อเฟรมได้
แต่ ตั้งทำไม(วะ)มันเมื่อย ขี้เกียจพิมพ์ เสียเวลา บลา บลา บลา ..... มาอ่านกันว่าทำไม
แนะนำให้ตั้งชื่อเฟรมสำหรับมูวี่ยาวๆที่มีการใช้สคริป gotoAndPlay() หรือ gotoAndStop(); เยอะๆ
เวลาเราเลื่อนอนิเมท อย่างเช่น
ทำสคริปเสร็จแล้ว ลองเล่นดู ปรากฏว่า เฟรมน้อยไป อืมมม ต้องเพิ่มเฟรมให้เยอะขึ้น จะได้สมูทๆ
ทีนี้พอไปเลื่อนเฟรมต่างๆ เสร็จแล้วเนี่ย
มาดูอีกที ตายห่ะ !!! สคริปเพี๊ยน หยุด กับ เล่น ไม่ตรงที่เดิม เพราะเลื่อนเฟรม เลขเฟรมนั้นๆก็เปลี่ยนไป
แล้วสคริป gotoAndStop(); gotoAndPlay(); ที่ใส่เลขเฟรมไว้ ก็ต้องแก้หมดเลยดิ่ ฮ๊าาาาางงงงงงง
สมมุติว่า ก่อนแก้เราเขียนเป็น
gotoAndStop(15); ก็คือ ไปที่เฟรมสิบห้า แล้ว "หยุด"
สมมุติพอเราเลื่อนเฟรมแล้ว เฟรมที่ต้องการให้ไปหยุด ไม่ใช้ เฟรม 15 แล้ว
เพราะเราเลื่อนออกไปอีก 10 เฟรม ก็คือ เฟรมที่ 25 เราต้องไปแก้สคริปอีกให้เป็น
gotoAndStop(25); ใช่ไหมจ๊ะ ทีนี้ก็แก้กันอ้วกครับ ถ้างานอนิเมทเยอะๆ ยาวๆ และมีสคริปด้วยก็ บ้าไปเลย
แต่ถ้าเราใส่ชื่อให้เฟรม มันก็จะอิงกับชื่อเฟรมนั้นๆ
มันไม่สนว่า เฟรมเท่าไร ตูไม่รู้แต่รู้ว่า เฟรมชื่อนั้นๆก็พอแล้ว
มันก็จะวิ่งไปตามชื่อเฟรมนั้นๆเลย ไม่อิงกะเลขเฟรมบนไทม์ไลน์
สมมุติว่า ก่อนแก้เราเขียนเป็น
gotoAndStop("kygel"); ก็คือ ไปที่เฟรมชื่อ "kygel" แล้ว "หยุด"
สมมุติพอเราแก้ เลื่อนเฟรมแล้ว เฟรมที่ต้องการให้ไปหยุด มันก็ยังชื่อ "kygel" เหมือนเดิม
เพราะเราเลื่อนออกไปอีก 10 เฟรม 100 เฟรม มันก็ยังชื่อ "kygel" น่ะแหล่ะ
อย่างนี้เราเรียกได้ว่า ไดนามิคเล็กๆ ครับ อิอิ
การทำงานต้องให้มัน ดิ้นได้ แก้ง่ายๆ คิดเยอะๆ :12:
อย่า สเตติก ครับมันเหนื่อยเกิน สเตติก มีไว้สำหรับถึกๆครับ :40:
เบ็ดเสร็จแล้ว ก็แค่อยากบอกว่า ใช้ตั้งชื่อเฟรมดีกว่า แค่นั้นเอง
เขียนทำไมให้ยืดยาววะเนี่ย :08:
ใครจะทำตัวอย่างการตั้งชื่อเฟรม ต่อได้เลยครับ
:45: เข้ามาบวกให้น้าแอ๊ดครับ
เดี๋ยวจะเผยผิวใหม่ แล้วเลิกเรียกผมว่า น้าแอ๊ด ได้ม๊าาาายยยยยยยย :05:
http://www.thaiflashdev.com/home/index.php?topic=188.0
:05: .....
:05: :05: :05: เอามาบั่นทอนกำลังใจคนเพิ่งหัดทำไมเนี่ยยยยยย
เอาไปจู๋อื่นไป๊ :05:
:05: AS3 ในอนาคตชิมิฮะ :25:
ฉะนั้น สอน AS อนุบาลต่อเลยงับ :27b:
แค่ AS2.0 ก็รู้สึกว่าไกลเกินเอื้อมแล้ว
มาเจอ AS3.0 กับไอตัวนี้ มันยิ่งไกลเข้าไปอีก :01:
อ้างอิงhttp://www.thaiflashdev.com/home/index.php?topic=173.0
http://www.thaiflashdev.com/home/index.php?topic=26.msg142#msg142
อิอิ
คิดว่า AS 3.0 เทพตัวนี้คงจะมีคนเอาไปโพสซ้ำกันอีกบานเลยครับ :42:
มันเทพจริงๆ ว้อยย :41:
ขอเตือนว่าถ้ายังไม่อยากงง และ ใช้งานได้ทั่วๆไป(รวมถึงมือถือ=flash lite) ใช้ AS2.0 เพราะ AS3.0 อ้าง reference ต่างกับ AS เก่าๆมาก
ผมว่าเรียน AS2.0 นะดีแล้วครับ ง่ายและใช้ได้เยอะ (คงไม่มีใครมาเสนอ AS3.0 ได้มาตราฐานกว่านะ - ขอให้รอก่อนดีกว่า ไม่ดีเหรอ?) :43:
อยากให้อธิบายคำสั่งอื่นๆเพิมเติมค่ะ เอาแบบนี้
อ้างอิงon(release){ //อธิบายได้ว่า เมื่อกดแล้วปล่อยปุ่มนี้
play() //ให้ "เล่น"
}
คืออยากรู้ว่า สั่งอย่างอื่นมันหมายความว่าไงบ้างอ่ะคะ
เช่น on (press) มันจะสั่งให้ทำอะไร
:46:
on(press) กดปุ๊บ ไม่ต้องรอให้ปล่อยนิ้วมันก็จะทำงานเลย
แต่ on(release) กดแล้วต้องปล่อยนิ้วออกมาก่อนมันถึงจะเล่น
:25: แล้วคำสั่งอื่นล่ะคะ?
หรือมีเว็บที่บอกเรื่องนี้ไว้ หรือว่ามีหนังสือบอกพวกนี้มั้ยคะ แนะนำหน่อย :25:
ปกติ ชอบเข้าเว็บนี้ค่ะ http://www.kirupa.com/
เดี๋ยว ขอ ไป หามาก่อน แต่ เดี๋ยว ผมจะอธิบาย อันที่ผมรุ้ดีกว่า มันจะได้ดูบ้านๆดี มาแบ่งกัน ใครรุ้อะไร ก็มาอธิบายอันนั้นก็แล้วกัน
ก่อนอื่นเอา Stop(); แปลว่า หยุด ไปก่อน :37:
play(); เล่นครับ
ระวังเรื่องตัวพิมพ์ใหญ่พิมพ์เล็กนะครับ
เพราะภาษานี้มันเข้มงวดเรื่องนี้
เช่น (สมมติวันนึงคุยกันถึงคำนี้) onClipEvent ก็ต้องสะกดแบบนี้เป๊ะๆ เลย
จำง่ายๆ ว่าถ้ามีหลายคำต่อเป็นก้อนเดียวเนี่ย
คำแรกจะพิมพ์เล็กหมด คำอื่นๆ ที่ตามมาจะนำด้วยตัวพิมพ์ใหญ่
แต่ไม่ต้องกังวลครับ เพราะในหน้าตอที่ให้พิมพ์มันจะมีใบ้ให้
เพียงแค่เรากด ESC แล้วตามด้วยตัวย่อ :27:
เดี๋ยวว่างๆจะมาเขียนเรื่อง startDrag ครับ :52:
:27: สาวๆเรียกร้อง ก็สนองตัณหาให้ครับ
สคริปของปุ่ม หรือ button จริงๆใช้กับ movieClip ก็ได้
กรณีนี้ จะเขียนสคริปไว้ที่ตัวปุ่มหรือ mc นั้นเลย ไม่ใช่เขียนที่เฟรม (เอาไว้หลังๆเลยเนาะสคริปบนเฟรมเนี่ย)
อ้างอิง
on(press){ //เมื่อเอาเม้าส์มากดปุ่มหรือขอบเขตบนปุ่มนั้นๆ
//ให้ทำอะไรก็ว่าไป (กรณีนี้ กดปั๊ป เกิดเหตุการณ์ทันที)
}
on(release){ //เมื่อเอาเม้าสกดแล้วปล่อยปุ่มหรือขอบเขตบนปุ่มนั้นๆ
//ให้ทำอะไรก็ว่าไป (กรณีนี้ กดปั๊ป ยังไม่เกิดเหตุการณ์ ต้องปล่อยก่อนถึงจะีเกิดเหตุการณ์)
}
on(releaseOutside){ //เมื่อเอาเม้าสกดที่ปุ่ม แล้วลากเม้าส์ออกนอกขอบเขตบนปุ่มนั้นๆ แล้วปล่อย
//ให้ทำอะไรก็ว่าไป (กรณีนี้ กดปั๊ป ยังไม่เกิดเหตุการณ์ ต้องลากเม้าส์ไปนอกขอบเขตของปุ่ม แล้วปล่อย ถึงจะีเกิดเหตุการณ์)
}
on(rollOver){ //เมื่อเอาเม้าส์มาอยู่บนปุ่มหรือขอบเขตบนปุ่มนั้นๆ
//ให้ทำอะไรก็ว่าไป
}
on(rollOut){ //เมื่อเอาเม้าส์ออกจากปุ่มหรือขอบเขตบนปุ่มนั้นๆ
//ให้ทำอะไรก็ว่าไป (เหตุการณ์นี้จะเกิดขึ้นต่อเมื่อ rollOver ก่อน)
}
ตัวอย่าง basic ๆ นะ ลอดกดๆปล่อยๆดู :40:
http://img2.f0nt.com/flash/8e6406f5fe2fa9b9069aece3cf76b922.swf
:08: ง่ายไปไหมเนี่ย
เริ่มอยากยากๆหรือยังจ๊ะ :22:
:30: สนุกครับ+
:40: น่ารักดีค่ะ +
ต่อเลย เอาให้งงกันไปเลย
(ขอแย่งซีนคุณแมคส์ เรื่อง startDrag แล้วกันนะครับ ช้าไปต๋อยซะแล้ว)
แต่อันนี้ไม่ละเอียดครับ เอา startDrag แบบละเอียดมาก็ได้ครับ
ว่าด้วยเรื่อง Drag & Depth คลิก แล้ว ลากมาวาง การที่จะทำ MC หรือ Btn
"เกาะติด" เม้าส์ นั้น ใช้สคริปตัวนี้ครับง่ายๆ
อ้างอิง
startDrag(???) // ในวงเล็บคือ MC หรือ ปุ่ม ที่เราตองการให้เกาะติดเม้าส์ครับ
ตัวอย่างการเขียน และวิธีใช้ อย่างง่ายๆ
ผมไม่ได้เป็นโปรแกรมเม่อร์ไม่ได้เรียนมาทางนี้เลยอาศัยแบบมวยวัดครับเวลาคิด
ง่ายๆเลยก่อนอื่น "เราจะทำอะไร" นี่ล่ะครับ สมมุติว่า
ผมมี ก้อนสี่เหลี่ยมอยู่ ห้าก้อน อยากจะจับลาก วางใด้ตามใจนึก
ก็เริ่มคิดสคริปในหัวก่อน แล้วคิดเป็นภาษาไทยนี่ล่ะ
สคริปแรกเลยที่คิดออก
อ้างอิง"เอาเม้าส์กดที่ก้อนสี่เหลี่ยม แล้วให้ ก้อนสี่เหลี่ยมนั้นเกาะติดเม้าส์"
เราก็เริ่มล่ะนะ
ทำก้อนสี่เหลี่ยมเหล่านั้นให้เป็น MC
(งานนี้ไม่มีติวเตอร์และภาพประกอบนะจ๊ะ ลองทำตามเลย)
ทีนี้ลงมือปั่นสคริปได้เลย ใส่สคริปที่ MC นะครับ
เอาสคริปภาษาไทยมาแปลเป็น actionScript
อ้างอิง//เอาเม้าส์กดที่ก้อนสี่เหลี่ยม
//ดูตัวอย่างอันที่แล้วประกอบ "กด" คือ
on(press){ //เมื่อเอาเม้าส์มากดปุ่มหรือขอบเขตบนปุ่มนั้นๆ
//ให้ทำอะไรก็ว่าไป
}
เมื่อได้ "กด" มาแล้ว เราก็ ให้เกาะติดเม้าส์" ล่ะนะ
อ้างอิง
//เกาะติดคือ startDrag() เราก็จะได้สคริปว่า
on(press){ //เมื่อเอาเม้าส์มากดปุ่มหรือขอบเขตบนปุ่มนั้นๆ
startDrag(this) //ให้้เกาะติดเม้าส > this คือตัวเอง
// แปลได้ว่า "ให้ตัวเองเกาะติดเม้าส์"
}
ทดสอบดูถ้าถูกต้อง ทีนี้มันก็เกาะติดหนับแล้ว แต่......ทำยังไงให้หลุดล่ะ
ก็คิดสคริปอีกว่า "พอปล่อยเม้าส์แล้วค่อยเลิกเกาะติด"
อ้างอิง//ปล่อยคือ...
on(release){ //เมื่อเอาเม้าสกดแล้วปล่อยปุ่มหรือขอบเขตบนปุ่มนั้นๆ
stopDrag() //"ให้เลิกเกาะติด"
}
เอาล่ะ สำเร็จสคริปใน MC 1ตัว ออกมาได้แล้วว่า
อ้างอิงon(press){ //เมื่อเอาเม้าส์มากดปุ่มนี้
startDrag(this); //ให้้เกาะติดเม้าส > this คือตัวเอง - แปลได้ว่า "ให้ตัวเองเกาะติดเม้าส์"
}
on(release){ //เมื่อปล่อยปุ่ม
stopDrag(); //"ให้ตัวเองเลิกเกาะติด"
}
ก็เอาสคริปนี้ไปใส่ใน mc ที่เหลือได้เลย
ค่อยๆอ่านตามครับ แล้วลองทำดู จริงๆนิดเดียวครับ แต่เขียนซะยืด :08:
// เพิ่มเติม ตัวสคริปที่ยังไม่มีการเซ็ท depth
ถ้าลองทำตามจะพบปัญหาอย่างนึง ถ้ามี MC หลายๆตัว จะมีปัญหาเรื่องการทับซ้อนกันของ MC
http://img2.f0nt.com/flash/1db8272aa31a3754b8fa5e6b7d1bc317.swf
อันนี้ตัวอย่างที่มีการเล่นกับ Depth ด้วย (ระดับชั้น คล้ายๆ layer น่ะแหล่ะ อยู่ล่างอยู่บน)
ที่ทำมาคือ "หยิบอันไหน อันนั้นอยู่บน" โดยที่มีการซ้อนทับสูงต่ำน่าเอ็นดู ไว้มาต่อคราวหน้าครับ
http://img2.f0nt.com/flash/238d29ba941deb63f0defc83fb9f1f15.swf
:25: เริ่มยากแล้ว รอติดตามบทต่อไปครับ อันนั้นผมไม่รู้เลย+
+ 5 เลยครับ :25:
อันหลังนี่ผมก็ไม่รุ้เหมือนกั ครับ เอ๊ะ !! หรือว่ารู้ อ๋อแต่รู้แค่นิดเดียว :25:
สนุกดีค่ะ รออ่านต่อ สูงต่ำน่าเอ็นดู :25: + อีก
อ้างคำพูดจาก: จักรี เมื่อ 12 ธ.ค. 2007, 03:07 น.
+ 5 เลยครับ :25:
อันหลังนี่ผมก็ไม่รุ้เหมือนกั ครับ เอ๊ะ !! หรือว่ารู้ อ๋อแต่รู้แค่นิดเดียว :25:
หง่ะ :08: ผมก็รู้นิดเดียว ออกแนวสคริปถึก
ถ้าให้พวกปั้นเหน่งหรือพวกฮาร์ดคอร์แฟลชเซียนๆสคริปสั้นจุ๊ดจู่เลย
เดี๋ยวคราวหน้าลงสคริปให้ดูด้วย แล้วจะรู้ว่า ถึกเถื่อนสุดๆ :39:
โอ้ เพิ่งเรียนไปเมื่อเทอมที่แล้ว
กลับมาฟื้นฟูความจำกันอีกรอบ
ขอบคุณมากๆเลยค่ะ :46: :46:
ต่อ...
เรื่อง
Drag&Depth ตอนที่ 2 จากตัวอย่างอันที่แล้ว เรามีปัญหาตรงที่ว่า พอเอาเม้าส์หยิบแล้วลาก มันจะซ้อนกันมั่วไปหมด
ไม่มีการจัดลำดับชั้น และบางครั้งซ้อนกันแล้วปล่อยไม่หลุดก็มี :38:
ที่ปล่อยเม้าส์แล้วไม่หลุดเพราะ พอเรากดอันนึง แล้วลากไปอีกอันนึงซึ่งอยู่ ชั้นหนือกว่า
พอเราเอาเม้าส์ไปแตะหรือ rollOverมันก็เลยไปจับเหตุการณ์อันนั้นๆแทน
ปล่อยให้ไอ้อันแรกที่กดติดไว้นั้นค้างเติ่ง อารมณ์ค้างอย่างน่าสงสาร :23:
ต้องกดย้ำให้เม้าส์กลับมาจับเหตุการณ์ของอันเดิม ถึงจะเสร็.. เอ้อ หลุดเหมือนเดิม :42:
==========================================
ว่าด้วยเรื่อง
Depth ( มีสาระนิดหน่อย อ่านไว้ๆ เดานิดหน่อยตามความรู้ที่มี )
เมื่อเราสร้างอะไรก็แล้วแต่บน stage ระบบจะมีการจัดระดับความลึกของ Object ชิ้นนั้นๆ
ถ้าเดาไม่ผิด ชิ้นแรกที่สร้าง จะอยู่ลึกสุดใจ เป็นค่าเริ่มต้นที่ -16383 :31:
ก็คิดง่ายๆ ไอ้ชิ้นที่สร้างอันแรกอ่ะ อยู่ใต้ดินลึกลงไป 16383 ชั้น
อันที่สอง (สร้างอะไรก็แล้วแต่) อยู่สูงขึ้นมาหนึ่งชั้น คือ อยู่ใต้ดินลึกลงไป 16382 ชั้น
เพื่อไม่ให้มันทับกันเองหากอยู่เลเยอร์เดียวกันน่ะ และอีกหลายๆเหตุผล
ตามนั้น เอาง่ายๆ อธิบายแค่นี้พอนะครับ (มากกว่านี้ หรือเพิ่มเติม เชิญได้เลยครับ ยินดีๆ)
=========================================
กรณีงานที่แล้วของผม อันที่มีปัญหาน่ะ สรุปง่ายๆคือ
ปัญหาแค่ลำดับชั้นอย่างเดียว เพราะเราต้องการจะ "หยิบอันไหน อันนั้นอยู่บน"
อันที่แล้วเราสร้าง ก้อนสี่เหลี่ยมมา แล้วทำเป็น MC 5 ชิ้น
ลำดับชั้นก็เลยต่างกัน 5 ขั้น (โดยประมาณ...เดา)
//ตรงนี้ไม่แน่นอนนะ เกิดเราสร้างอะไรๆไปก่อนหน้านี้ แล้วลบออก มันก็จะรันไปเรื่อยๆ
=================================================
ทีนี้เราอยากจะทำให้มันอยู่"บน"ล่ะ
สคริปง่ายๆที่สั่งงานเกี่ยวกับลำดับชั้นคือ
อ้างอิง
???.swapDepths(ค่าที่ต้องการ) // ??? ในวงเล็บแรกคือ MC หรือ ปุ่ม หรือ TextField ใดๆที่ต้องการสั่งงาน
//ค่าที่ต้องการ คือ ลำดับชั้นที่ต้องการ และสามารถใช้วิธีเปรียบกับลำดับชั้นตัวอื่นได้ด้วย แต่เราจะไม่พูดถึงครับ(เพราะ...ตูไม่เคยใช้น่ะ)
ตัวอย่างง่ายๆ
อ้างอิงmc.swapDepths(20); // คือ สั่งให้ mc ไปอยู่ชั้นที่ 20 เลย :27: ง่ายเนอะ
=======================================================
สคริปที่แล้ว เราได้ออกมาว่า
อ้างอิงon(press){ //เมื่อเอาเม้าส์มากดปุ่มนี้
startDrag(this); //ให้้เกาะติดเม้าส > this คือตัวเอง - แปลได้ว่า "ให้ตัวเองเกาะติดเม้าส์"
}
on(release){ //เมื่อปล่อยปุ่ม
stopDrag(); //"ให้ตัวเองเลิกเกาะติด"
}
นี่คือสคริปที่ใส่ใน mc ทั้งห้าตัวนั่นนะ
ทีนั้เราต้องการบังคับให้ มัน "หยิบปั๊ป อยู่บน"
นึกสคริปเป็นภาษาไทยได้ว่า "กดปั๊ป สั่งให้ mc ตัวที่กด ไปอยู่ชั้นสูงกว่า mc อื่นๆ"
ตอนนี้เราจำไม่ได้หรอกว่าอันไหนสร้างก่อนหลัง อันไหนอยู่ลำดับที่เท่าไร
เราจะเพิ่มสคริปแบบไหนดีครับ?
ขอวิธีคิดครับ เอาสคริปแนวคิดแบบภาษาไทยนะครับ เดี๋ยวมาเฉลยยย
ขอบคุณมากครับพี่ :46:
เมื่อคืน บอกบวกไป 5 แต่เพิ่งบวกไป 3 เอง งั้น เดี๋ยวบวกไปเรื่อยๆจนกว่าจะเบื่อละกัน :12:
ถ้าจะทำให้เวลาแด๊กเมาส์ออกนอกจากพื้นที่ที่กำหนด แล้วให้มันเด่งกลับคืน แบบนี้ พี่คิดว่า จะทำแบบไหนดีอะครับ
มีหลายวิธีนะ แต่ที่คิดออกแบบง่ายๆเลยคือ
"เมื่อตำแหน่ง mc นั้นๆ มากกว่าหรือเลย ตำแหน่งที่เรากำหนด"
"ให้ mc นั้นๆ กลับมาอยู่ที่เดิม"
ใช้เอนเตอร์เฟรม เป็นตัวจับ หรือใช้ hitTest ก็ได้ง่ายดีไม่หน่วง
สมมุติว่าเรากำหนดขอบเขตโดย stage
สัก 300 X 300
เราก็ สร้างฟังชั่น ง่ายๆ ขึ้นมา 2 อัน
อ้างอิง
function drag(mc:MovieClip) { // ฟังก์ชั่น drag(mc:MovieClip)ในวงเล็บคือ mcที่เราส่งเข้าไปให้มันทำงาน
startDrag(mc); // อันนี้คือ "เอา mc ที่ส่งมา เกาะติดเม้าส์"
mc.onEnterFrame = function() { // จับการทำงานของ mc ตลอดเวลาขณะที่ยังลากอยู่
if(mc._x>300 or mc._y>300){ // ถ้าตำแหน่ง mc เกินขอบเขตที่กำหนด
stopDrag(); //ให้ หลุดจากเม้าส์
mc._x = ตำแหน่งที่เด้งกลับคืน; //และ mc วิ่งกลับไปตำแหน่งที่ต้องการ
delete mc.onEnterFrame; //ลบการทำงานนี้ทิ้ง กันหน่วงเครื่อง
}
}
}
function stop_drag(mc:MovieClip) {// ฟังชั่นปล่อยเม้าส์แล้วหลุด
mc.stopDrag();
delete mc.onEnterFrame; //ลบการตรวจจับขอบเขต หากปล่อยเม้าส์โดยไม่ออกนอกกรอบ
}
ง่ายจริงๆด้วยครับ :12: แต่ เอนเทอร์เฟรมนี่มันไม่หน่วงใช่มั้ยครับ
ถ้าไม่มี อันอื่นๆใช้อยู่
ในไฟลนึง มีโผ่ลมาสัก เอนเตอร์เฟรมนึง ก็ไม่หน่วงครับ
แต่นี่มัน เอนเตอร์เฟรมชั่วคราว ใช้แล้วลบ จึงไม่เป็นปัญหา
อันบนนั้นถ้า ลากๆอยู่แล้วเลยขอบเขตมันเด้งเลย
แต่ถ้าจะปล่อยก่อนแล้วค่อยเช็คขอบเขต
เราก็เอาส่วนที่เช็คมาไว้ที่ฟังชั่น stop_drag() เอา
อ้างอิง
function drag(mc:MovieClip) { // ฟังก์ชั่น drag(mc:MovieClip)ในวงเล็บคือ mcที่เราส่งเข้าไปให้มันทำงาน
startDrag(mc); // อันนี้คือ "เอา mc ที่ส่งมา เกาะติดเม้าส์"
}
function stop_drag(mc:MovieClip) {// ฟังชั่นปล่อยเม้าส์แล้วหลุด
mc.stopDrag();
if(mc._x>300 or mc._y>300){ // ถ้าตำแหน่ง mc เกินขอบเขตที่กำหนด
mc._x = ตำแหน่งที่เด้งกลับคืน; //และ mc วิ่งกลับไปตำแหน่งที่ต้องการ
}
}
จะสั้นกว่า และไม่ต้องใช้ เอนเตอร์เฟรม เพราะไม่ต้องตรวจจับตลอดเวลา
ตรวจตอนปล่อยเท่านั้น
ตอนปล่อยถ้าจะให้เด้งสวยงามก็ใช้ LMC เข้ามาช่วยเลย
:07: เฮ้ยย นี่ อนุบาลงาน actionscript นะ
:17:
อันนหลังนี่ดีครับ ดีกว่า เอนเทอร์เฟรมที่มันเช็คตลอด :45:
ฮ่าๆๆๆ................ :33:
ชักจะยากแล้ว :44: แต่ขอบคุณนะคะ +
+เหมือนกันครับ ชักยากแล้วจริงๆ ด้วย :44:
ต่อ....จากอันบนนั้นที่ไม่มีใครสนใจ :34:
เฉลย ในแบบผมเอง ด้วยสมองน้อยๆคิดแบบง่ายๆ
เพราะี้จำไม่ได้หรอก ว่า mc อันไหนสร้างก่อนหลัง mc อันไหนอยู่ลำดับที่เท่าไร ใช่ไหมจ๊ะ
ผมจึงตั้งค่าแรกของลำดับชั้นไว้ เอาสูงกว่าทุกตัวเยอะๆหน่อยก็ได้ เอาไว้อ้างอิงไง
จากตรงนี้ ถ้าใครเผลอมาอ่าน ลองคิดตามช้าๆด้วยสมมุติว่า ให้
ื
อ้างอิงn = 1 //ใส่สคริปที่เฟรมหลักเลย
ตอนนี้ n เป็นค่าลอยๆที่ mc ทุกตัวต้องหยิบเอามาใช้อ้างอิง depth เพื่อสั่งลำดับชั้นตัวเอง
คือจัดลำดับชั้นกันใหม่เริ่มจากค่านี้เลย
โดยให้ mc ตัวไหนก็ตาม swapDepth() ด้วยค่า n และใหบวกเพิ่มขึ้น 1
และลำดับชั้นของตัวแรกที่กด ก็คือ 2 เพราะเราบวกค่า n เพิ่มขึ้น 1 แน่นอนสูงสุดๆเลย ห่างจากลำดับล่างๆเป็นหมื่นชั้น
ตอนนี้ n กลายเป็น 2 แล้วนะจ๊ะ เพราะเรา บวก 1 ไปแล้ว
พอตัวที่สองกดปั๊ปก็ swapDepth() ด้วยค่า n อีกและให้บวกเพิ่มขึ้น 1 ค่า
ซึ่งลำดับชั้นของตัวที่สองที่กด ก็คือ 3 สูงกว่าเมื่อกี้อีก 1
ตอนนี้ n กลายเป็น 3 แล้วนะจ๊ะ เพราะเรา บวกเพิ่มอีก 1
.... 4
.. 5
. 6
มันก็จะเพิ่มค่า n เรื่อยๆโดยไม่มีการซ้ำกันของลำดับชั้นในแต่ละ mc ครับ
งงไหมครับ :22: ไม่งงนะ
ทีนี้มาดูสคริปกัน
จากอันที่แล้ว เราจะเพิ่ม swapDepths() กันล่ะ
อ้างอิงon(press){ //เมื่อเอาเม้าส์มากดปุ่มนี้
startDrag(this); //ให้้เกาะติดเม้าส > this คือตัวเอง - แปลได้ว่า "ให้ตัวเองเกาะติดเม้าส์"
this.swapDepths(_root.n+1); // เซ็ทลำดับชั้นของตัวเองด้วยค่า n อีกและให้บวกเพิ่มขึ้น 1 ค่า
}
on(release){ //เมื่อปล่อยปุ่ม
stopDrag(); //"ให้ตัวเองเลิกเกาะติด"
}
เอาสคริปนี้ใส่ใน mc ทั้งห้าตัว ก็จะได้ตามตัวอย่างนี้แล้วครับ :22:
// อันนี้ผมทำให้เห็นลำดับชั้นของแต่ละตัวด้วยครับ และใช้ฟังชั่นง่ายๆเอาครับ
จริงๆแล้วเริ่มลำดับที่ -16000 ก็ไ้ด้ครับ จะเห็นว่าค่าแรกเริ่มมันก็ -163xx โน่นแน่ะ :08:
http://img2.f0nt.com/flash/29d916d550236c0f3db8eb194c713dfe.swf
หวังว่าคงเข้าใจกันบ้างนะครับ
หากไม่เข้าใจ :05: ลองค่อยๆอ่านนะครับ จริงง่ายๆครับ แต่ตัวหนังสือเยอะไปนิดนึง ไม่รู้จะพิมพ์ทำไมเยอะแยะ
ขอบคุณค่ะกำลังทำความเข้าใจอยู่ คือสมมุติ เรามีสี่เหลี่ยม 5 อัน (ในที่นี้เรียกว่า mc รึเปล่า แหะๆ)
ก็เอาสคริปที่พี่สอนในกล่องนั่น ใส่ลงไปกับทุกสี่เหลี่ยมเลยใช่มั้ยคะ โดยค่า n+1 เหมือนกันทุกอันเลยใช่มั้ยคะ
เข้าใจถูกมั๊ยน๊า :44:
อ้างคำพูดจาก: น้องเกดลดาค่ะ เมื่อ 13 ธ.ค. 2007, 02:23 น.
ขอบคุณค่ะกำลังทำความเข้าใจอยู่ คือสมมุติ เรามีสี่เหลี่ยม 5 อัน (ในที่นี้เรียกว่า mc รึเปล่า แหะๆ)
ก็เอาสคริปที่พี่สอนในกล่องนั่น ใส่ลงไปกับทุกสี่เหลี่ยมเลยใช่มั้ยคะ โดยค่า n+1 เหมือนกันทุกอันเลยใช่มั้ยคะ
เข้าใจถูกมั๊ยน๊า :44:
จะถูกก็ว่าถูกครับ
สี่เหลี่ยมพวกนั้นนั่น ให้ทำเป็น movieClip ก่อนครับ เรียกย่อๆว่า mc
และเข้าใจตรง n+1 ไหมครับ
อธิบายไม่ค่อยเก่งซะด้วย :44:
น้าแอด นี่สุดยอดจริงๆครับดูแลนักเรียนในคลาสอย่างดี :12: :12: :12: :12: :12:....
ส่งค่ะ :07:
http://img2.f0nt.com/flash/f5830530ef2b408a4f59dbeac3616f32.swf
:46: เข้าใจมากเลยครับน้าแอ๊ด+
จริงๆ แล้วเหมือนสอนข้ามขั้นไปหลายสเต็ปเลยนะ :30:
น่าจะกลับมาเรื่องตัวแปรง่ายๆ ก่อน :44: เช่น บวกเลขอะไรงี้
กรอบของเกดอยู่ไหนครับ :37:
นั่นสิ ดูโล๊งโล่งฮ่าๆๆๆ
อ้างคำพูดจาก: น้องเกดลดาค่ะ เมื่อ 13 ธ.ค. 2007, 03:22 น.
ส่งค่ะ :07:
http://img2.f0nt.com/flash/f5830530ef2b408a4f59dbeac3616f32.swf
:05: ดีใจ มีคนส่ง
ทำถูกต้องแล้วครับ
แต่ประเด็นคือหลักการครับ ว่าเข้าใจกันมากน้อยแค่ไหน
อันนี้มีสคริปให้ง่ายหน่อย แต่อันต่อๆไปจะมีแต่ตัวอย่างงาน และตัวอย่างคร่าวๆเท่านั้น
อ้างคำพูดจาก: น้องไอ้แอน เมื่อ 13 ธ.ค. 2007, 03:25 น.
:46: เข้าใจมากเลยครับน้าแอ๊ด+
จริงๆ แล้วเหมือนสอนข้ามขั้นไปหลายสเต็ปเลยนะ :30:
น่าจะกลับมาเรื่องตัวแปรง่ายๆ ก่อน :44: เช่น บวกเลขอะไรงี้
ใช่ครับ ข้ามไปนิสนึง :30: เดี๋ยววกกลับเรื่องอนุบาลสคริปแล้วกัน
เบิ้ลเลย
ย้อนกลับมาเรื่องเบื้องต้นกันหน่อยนะ
ถ้าเราจะเขียนสคริปต่างๆสิ่งนึงที่ ทุกภาษาสคริปจะขาดไม่ได้เลยคือ การ output เพื่อดูผลลัพธ์ :22:
ในแฟลชคือการใช้ trace() function
อ้างอิง
trace(expression:Object)
You can use Flash Debug Player to capture output from the trace() function and display the result. If any argument in a trace statement includes a data type other than a String, the trace function invokes the associated toString() method for that data type. For example, if the argument is a Boolean value the trace function invokes Boolean.toString() and displays the return value.
ตามนั้นเลย แต่ output ตัวนี้จะแสดงผลออกมาที่ส่วนหน้า output ของโปรแกรมแฟลชเท่านั้น
หากนำมาเล่นบน flash player หรือ บนหน้าเวบ หรือ publish ออกมาเล่นแบบ .exe
ส่วนของ trace() นี้จะไม่แสดงผล และไม่มีความหมาย
ตัวอย่างการใช้ trace()
- เปิดงานมาหนึ่งงาน
- คลิกที่เฟรมแรก
- กด F9 เพื่อเปิด panel Actionscript เราจะใส่สคริปที่เฟรมกัน
- พิมพ์ว่า...
อ้างอิงtrace("hello F0NT");
- กด Ctrl+Enter เพื่อทดสอบ แล้วดูผล ก็จะเป็นเช่นนี้แล มันจะแสดงผลออกมาที่ส่วนหน้า output ของโปรแกรม
(http://img2.f0nt.com/13/9984b44a8d9d8b3c267f430a929d3136.jpg)
ใส่สคริปที่เฟรมแรก เมื่อทดสอบเปิดงานปั๊ป มันก็จะรันคำสั่งตามที่เราเขียนเลย
output เพื่อ อะไร .........ก็ เพื่อเอาไว้ทดสอบตัวแปรต่างๆ การส่งค่่า เช็คว่าไอ้ตัวแปรนั้นน่ะ มาจากไหนมีค่าเท่าไร ฯลฯ สารพัด
ต่อไปจะใช้งานมันบ่อยเลยล่ะ หากอยากเขียนสคริปให้งานเรา Interavtive แบบแนวๆ
- อันนี้ตัวช่วยเบื้องต้นที่ควรใช้บ่อยๆ
(http://img2.f0nt.com/13/7e6970dc9f11fe53828f3e0068855a77.jpg)
==========================================================
มาถึงเรื่องการแทนค่า การประกาศตัวแปรตัวอย่าง
อ้างอิงvar test_txt:String = "hello F0NT"; //อธิบายว่า "ประกาศให้ test_txt เป็นตัวแปรประเภทตัวหนังสือ มีค่าเท่ากับ "hello F0NT"
//หรือ
test_txt = "hello F0NT"; // กรณีนี้ เราไม่ได้ประกาศว่า test_txt เป็นตัวแปรประเภทอะไร แต่ flash จะสร้างให้เองเมื่อเราแทนค่าใส่เข้าไป
ที่นี้ ตัวแปร test_txt จะเป็น String เพราะเราใส่ค่าให้มันเป็นตัวหนังสือ
สองตัวอย่างเขียนแตกต่าง แต่ผลลัพธ์เหมือนกัน
ความต่างอยู่ตรงที่...... :08: .....ลืมไปแล้ว แต่เป็นเรื่องที่สำคัญระดับหนึ่ง ติดไว้ก่อนไม่อยากมั่วมาก
ทดสอบดูได้เลยโดย
อ้างอิงvar test_txt_1:String = "hello F0NT";
test_txt_2 = "hello F0NT";
trace(test_txt_1);
trace(test_txt_2);
// output ออกมาว่า
อ้างอิงhello F0NT
hello F0NT
ทีนี้เราจะผสมเอาตัวหนังสือกับตัวแปรมาต่อกันใน trace() แล้วแสดงผล
ด้วยการใช้ "+" เป็นตัวรวมเข้าด้วยกัน
อ้างอิงvar test_txt_1:String = "hello F0NT";
test_txt_2 = "hello F0NT";
trace("test_txt_1 is "+test_txt_1);
trace("test_txt_2 is "+test_txt_2);
// output ออกมาว่า
อ้างอิงtest_txt_1 is hello F0NT
test_txt_2 is hello F0NT
เข้าใจแล้วใช่ไหมครับ เดาเอาว่าเข้าใจ :05:
อีกนิดนึงว่า
การทำงานของสคริปจะทำงานเริ่มที่บรรทัดแรกและไปสุดจบที่บรรทัดสุดท้ายเสมอทดสอบง่ายโดยเขียนลำดับใหม่
อ้างอิงvar test_txt_1:String = "hello F0NT";
trace("test_txt_1 is "+test_txt_1);
trace("test_txt_2 is "+test_txt_2);
test_txt_2 = "hello F0NT";
// output ออกมาว่า
อ้างอิงtest_txt_1 is hello F0NT
test_txt_2 is undefined
จะเห็นว่าตัวแรก output ออกมาตรงตามต้องการ
แต่ตัวที่สอง เราเสือก ให้มัน output ก่อนประกาศตัวแปร
ผลก็เลย undefined ครับ
อ้างอิง
undefinedly = [ADV] อย่างไม่มีคำบรรยาย, Related: อย่างไม่แน่ชัด, อย่างคลุมเครือ, Ant. definably
คือประมาณว่า
ไม่มีค่าใดๆอยู่ทีนี้ลองทดสอบบวกเลขง่ายๆดู ด้วยเครื่องหมาย " + - * / "
อ้างอิงtrace(20+50);
trace(90/2);
trace(15*4);
trace((20*5)/2);
+2
ชัดเลยครับ
ลุงแอ๊ดครับ ที่ว่า trace ไม่แสดงผลที่อื่นเนี้ย
แต่มันรันด้วยรึเปล่าครับ ประมาณว่ากิน cpu เราไปด้วยใช่มั้ยครับผม :46:
อ้างคำพูดจาก: ซ้อซั้ว เมื่อ 13 ธ.ค. 2007, 14:18 น.
ลุงแอ๊ดครับ ที่ว่า trace ไม่แสดงผลที่อื่นเนี้ย
แต่มันรันด้วยรึเปล่าครับ ประมาณว่ากิน cpu เราไปด้วยใช่มั้ยครับผม :46:
ไม่แน่ใจครับ แต่น่าจะมีผลนะ เพราะเวลารัน ยังไงๆมันก็ผ่านบรรทัดที่เราเขียนนี่นะ
แต่ทางที่ดี ตามหลักสคริปที่ถูกที่ควร น่าจะลบไปครับ เพื่อ optimise สคริป
หรือคอมเม้นท์ไว้ด้วย "//" หรือ " /* xxx */ " หากไม่อยากลบ (เผื่อเอาไว้เช็คตอนแก้งาน)
ขอบคุณครับ :46:
ต่อ..
Convert to Symbol & InstanceSymbol ในแฟลชคงหมายถึง ต้นแบบ (ประมาณนั้นในความคิดผม)
เมื่อเราทำ object ใดๆ ให้เป็น symbol แล้วนั้น
ตัว symbol จะเข้าไปอยู่ใน Library
เราสามารถ ดึง symbol หรือ ต้นแบบนี้มาใช้ใด้ โดยไม่ต้องสร้างใหม่ (งานต่องานนะ แต่สามารถดึงไปใช้ได้)
โดยเมื่อดึงจาก symbol มาแล้วนั้น ตัวที่ดึงมา จะถูกเรียกว่า
instanceลองทดสอบดูโดย
- วาดสี่เหลี่ยม หนี่งอัน
- คลิกที่สี่เหลี่ยม กด F8
เราจะเห็น...
(http://img2.f0nt.com/13/14cf22722c589e5d87c15e7f07fc7e3b.jpg)
เราจะเห็นว่ามีให้เลือก 3 type คือ
- Movie clip - เรียกย่อๆว่า mc คิดง่ายๆ เหมือนเราสร้างคลิบวีดีโอขึ้นมาชิ้นหนึ่ง ซึ่งในนั้นจะมี ไทม์ไลน์ ของตัวเอง
- Button - ปุ่ม คือ... มันเป็นปุ่มน่ะ ในนี้จะมีแค่ สี่เฟรม คือ เฟรม แสดงผล,เม้าส์มาแตะ,กดปุ่ม,ขอบเขต แสดงผลแต่ละเฟรมแบบออโต้
- Graphic - คล้าย mc แต่คุณสมบัติมีความแตกต่างนิดหน่อยและน้อยกว่า mc
ในที่นี้ ผมจะเน้นที่ mc กับปุ่มนะ ไม่เน้น Graphic (ไม่ค่อยใด้ใช้น่ะครับ ใช้แต่ mc ใครมาอธิบายความต่างหน่อย)
เอาเป็นว่า ทำเป็น mc ก่อนละกันนะ :39:
เราก็จะใด้ mc มาหนึ่งตัวแล้วใช่มั๊ย
ทีนี้ลอง ลบ mc ที่อยู่บน stage ไปเลยครับ
- แล้วกด Ctrl+l เปิด ไลแบรี่ เราจะเห็น symbol ที่เราสร้างไว้ครับ
- ทีนี้ลากมาวาง ที่ stage เยอะๆ หลายๆตัวเลย
- เลือกอันใดอันหนึ่ง ดับเบิ้ลคลิกเข้าไป
เราก็จะเข้าไปแก้ไขต้นแบบกันล่ะ
(http://img2.f0nt.com/13/d92b1c4f6ef9d645750ad35341f77b86.jpg)
ลองดัดๆ ตัดๆ ต่อๆ แล้วดูผล
(http://img2.f0nt.com/13/50686e2e28eb7e68799d0d3d042c541c.jpg)
จะเห็นได้ว่า instance ทุกตัวที่ลากไปวาง เปลี่ยนไปตามต้นแบบทั้งหมด
กลับไปที่หน้ารูท หรือ stage ที่ปุ่ม Scene 1 (ตรงนี้จะบ่งบอกว่า ตอนนี้เราอยู่ที่ไหน เช่น ใน mc ใน bt ฯลฯ)
(http://img2.f0nt.com/13/16a08073abe5f8f698214d3ba6fd778d.jpg)
คงพอเข้าใจนะครับ
มากกว่านี้คงจะต้องโดนย้ายไปกระจู๋ อนุบาลแฟลชแน่ๆ เพราะยังไม่เข้าเรื่องสคริปเลย :08:
เอาล่ะกว่าจะเข้าเรื่อง :22:
มาเขียนสคริปลั่งงานตำแหน่ง mc กันดีกว่าคุณสมบัติ หรือ property ของ instance ที่ใช้บ่อยๆแรกเริ่มคือ (เอาแค่นี้ก่อนนะ :22: )
คือเกี่ยวกับ พิกัด ขนาด transparent สเกล อันนี้แบบรวมๆ ใช้กันได้หมด
อ้างอิง
_alpha : The alpha transparency value of the movie clip.
_height : The height of the movie clip, in pixels.
_width : The width of the movie clip, in pixels.
_x : An integer that sets the x coordinate of a movie clip relative to the local coordinates of the parent movie clip.
_xscale : Determines the horizontal scale (percentage) of the movie clip as applied from the registration point of the movie clip.
_y : Sets the y coordinate of a movie clip relative to the local coordinates of the parent movie clip.
_yscale : Sets the vertical scale (percentage) of the movie clip as applied from the registration point of the movie clip.
เอาล่ะนะ
เราจะเขียนสคริปที่เฟรมกัน :27:
ก่อนอื่น ต้องตั้งชื่อก่อน
ในที่นี้ชื่อ mc_mc
คลิกที่เฟรม กด F9 เปิด panel action
พิมพ์ลงไปว่า
อ้างอิง
_root.onMouseDown = function() {
mc_mc._x = _xmouse;
mc_mc._y = _ymouse;
};
แล้วกด Ctrl+enter ดูผลลัพธ์ แล้วลองกดเม้าส์ดู
อธิบายสคริปได้ว่า
" เมื่อกดเม้าส์ ให้ ตำแหน่ง x y ของ mc เท่ากันกับตำแหน่งของเม้าส์ "
http://img2.f0nt.com/flash/dfca653d24543ad0e789f93982160d69.swf
ลองทำตามครับ เดี๋ยวจะมาอธิบายสคริปแบบละเอียด
เจี้ยมอีกแล้วครับน้า :12:
:46: + อีกรอบ
มันอยุ่ในระดับที่ผม ไม่รู้และรู้ได้ไม่ยากจริงๆครับ จัดมาอีกก็ขอบวกอีกไม่มีอะไรจะตอบแทนได้นอกจากขอบคูณ :21:
:46:
สุดยอดเลยค่ะน้าแอ๊ด เดี๋ยวเกดลองไปทำเล่นดูค่ะ สนุกจัง+ ขอบคุณที่ให้ความรู้ค่ะ :46:
ต่อ..โอ๊ยยฟิตชิบเป๋งเลย :22:
จากตัวอย่างที่แล้ว เราจะเพิ่มตัวแสดงผลพิกัดง่ายๆโดยใช้ text box
- เลือก text tool
(http://img2.f0nt.com/14/1d2de2bccb080449fc5aac0c73f5a0b1.jpg)
- วาดลงไปที่ stage แล้วเปลี่ยนมันเป็น dynamic text ใส่ตรง var ว่า txt (หรือชื่ออะไรก็ได้)
(http://img2.f0nt.com/14/9e8acb5abe07f81e1f9bbd2b89f5ada6.jpg)
ที่เฟรมแรก เดิมเราเขียนสคริปไว้ เราเพิ่มต่อท้ายไปว่า
อ้างอิง_root.onMouseDown = function() {
mc_mc._x = _xmouse;
mc_mc._y = _ymouse;
txt = "x = "+mc_mc._x+" & y = "+mc_mc._y; // จำวิธีที่ให้ลอง trace() ได้ไหม นั่นล่ะเหมือนกัน
};
มันก็จะแสดงพิกัดให้เราทราบแล้ว เมื่อเรากดเมา้ส์ หรือเมื่อ event mouseDown มีการกระทำ :22:
มาต่อเรื่องหนักกระโหลกกัน :37:
จากตัวอย่าสคริปนั้น เราจะเห็นวิธีเขียนสคริปที่ดูแล้ว งงดีจัง
ว่าไปแล้ว ........ อธิบายยากจัง :31:
อ้างอิง
_root.onMouseDown = function() { // เมื่อมีการกดเม้าส์ที่รูท หรือหน้าเมนหลักชั้นนอกสุด..น่ะ :08:
//จะให้ทำอะไรก็แล้วแต่
//จะให้ทำอะไรก็แล้วแต่
};// สิ้นสุดการทำงาน
คือจะเป็นฟังชั่นหนึ่งๆที่เรากำหนดขึ้น
เมื่อกดเม้าส์แล้ว ก็จะ
รันคำสั่งต่างๆในปีกา ตั้งแต่บรรทัดแรก จนสิ้นสุดการทำงาน ก็จบฟังชั่น
นั่นคือการกดหนึ่งครั้ง
เมื่อกดซ้ำ ก็จะรันทั้งหมดอีกครั้ง
ถ้าเราใส่ไว้ที่เฟรมแรก
เมื่อเราสั่งเล่นมูวี่ที่รูท ไปสัก 25 เฟรมแล้วหยุด
แม้เฟรมที่ 25 ไม่มีสคริปนี้ก็ตามแต่เมื่อกดเม้าส์
ฟังชั่นนี้ก็ยังทำงานอยู่ เพราะเราได้ประกาศไว้ตั้งแต่แรกแล้วไงครับ :22:
ไม่งงนะ :44:
แต่ อ้าววว ยังงี้ก็ไม่ถูกหลักการน่ะสิ เพราะไอ้ mc ที่เราต้องการสั่งงานมันอยู่เฟรมแรก
พอเราเล่นเลยมา มันไม่มี mc ตัวนั้นอยู่ ฟังชั่นนี้ก็ไม่จำเป็นที่จะใช้น่ะสิ
:07: เออ ใช่เลย สคริปก็รันฟรีๆน่ะสิ กิน cpu เปล่าๆซะงั้น :07:
เอาน่า :21: มีผูก ก็ต้องมีแก้ ใจเย็นพี่น้องครับ
เราสามารถ ลบ ฟังชั่นแบบที่เขียนเนี่ย ได้โดย
อ้างอิง
delete _root.onMouseDown // :27: แค่นี้แหล่ะ ง่ายๆเลย งงล่ะสิ
เราก็ใส่ใว้ที่เฟรม 25 ซะ เมื่อมาถึงเฟรม ก็ลบฟังชั่นนี้ซะเลย เป็นการ Optimise อย่างดีเลยนะ :52:
ทดสอบยังไงดีล่ะ
เอาแบบนี้
จากงานที่แล้ว
เราสร้างปุ่มขึ้นสักอัน
แล้วใส่ที่ปุ่มว่า
on(press){
delete _root.onMouseDown
}
ลองดูครับ
http://img2.f0nt.com/flash/6c355014dc8530be56f679969a317b9b.swf
:22: :22:
พักยก
เดี๋ยวจะเอาไฟลนี้ ทำเกมส์ง่ายๆมาให้เล่น
:46: อันนี้ไม่รู้เลยครับ ขอบคุณมากๆ หลายๆ+
ถามครับ
คำสั่ง delete น่ใช้ได้ครอบจักรวาลเลยเปล่าครับ
เช่น delete พวก on enterFrame ต่างๆ ไรงี้
อ้างคำพูดจาก: น้องไอ้แอน เมื่อ 14 ธ.ค. 2007, 01:42 น.
:46: อันนี้ไม่รู้เลยครับ ขอบคุณมากๆ หลายๆ+
ถามครับ
คำสั่ง delete น่ใช้ได้ครอบจักรวาลเลยเปล่าครับ
เช่น delete พวก on enterFrame ต่างๆ ไรงี้
ใช่เลยครับผม :12:
เกมส์พิกัดนรก :27:
อิอิ มั่วแหลก
วิธีเล่น :21: คงไม่ต้องอธิบายนิ :07: ลุยโลด !!!!
http://img2.f0nt.com/flash/eed2aaa28d12a37cb0400fdb331854d2.swf
ใครทำได้คลิกเดียว เซฟมาดูหน่อย :22:
คิดสคริปสดๆ แบบไม่วางแผน ขนาดนี้ยังตั้งหนึ่งชั่วโมงแน่ะ :39:
อ้างอิง_root.onMouseDown = function() {
_root.chk(_root.rndx,_root.count);
txt = "x = "+mc_mc._x;
};
count = 4;
rndx = random(400)+50;
targt_txt = "X = "+rndx;
txtn = "คุณคลิกได้อีก "+_root.count+" ครั้งเท่านั้น";
function chk(rndx) {
_root.count -= 1;
if (_root.count == 0) {
_root.gotoAndStop(3); // แพ้
}
mc_mc._x = _xmouse;
mc_mc._y = _ymouse;
if (_xmouse == rndx) {
_root.gotoAndStop(4);//ชนะ
}
txtn = "คุณคลิกได้อีก "+_root.count+" ครั้งเท่านั้น";
}
จริงๆมีสามเฟรมน่ะ เอาง่ายๆ
เอาไฟล fla มาให้ชำแหล่ะด้วย เต็มที่เลย :40:
ใครอยากเพิ่มแรนดอมเป็นมีพิกัด Y ด้วยก็ได้ สลับกัน
:07: โห แค่นี้ก็เอามาทำเป็นเกมได้ด้วย
แถมสนุกด้วยนะ นัีบถือครับน้า
(กดบวกเรื่อยๆ เลยเนี่ย)
(http://img2.f0nt.com/14/f8b15f214f520f11196f93965712ed22.png)
ได้แล้ว :25: :25: :25:
(http://img2.f0nt.com/14/a370e2d60cdc06358f6da14d1de60770.png)
:25:
ทำได้ ว้าว
:25:
(http://img2.f0nt.com/14/d059e76f31f7dc041c6dac85ee2979ee.jpg)
+ น้าแอ๊ด
ทำดีได้เท่านี้ครับ :52:
(http://img2.f0nt.com/14/c3039b43c960ce87c4545124be5e8202.jpg)
อ้างคำพูดจาก: ซ้อซั้ว เมื่อ 14 ธ.ค. 2007, 09:56 น.
(http://img2.f0nt.com/14/f8b15f214f520f11196f93965712ed22.png)
ได้แล้ว :25: :25: :25:
:14: :14: :14: :14: แม่นโคตรๆ :37:
:25: :25: จำตำแหน่งไว้นะครับ แล้วกะๆ เอา
ไม่โชว์หรอก :11: :05:
:05:
ยังไม่ถูกเลย
จ๊าบ :12:
กี๊ซ :25:
(http://img2.f0nt.com/15/5ef759740a5a72d97c9db9b52a12fbf6.png)
อ้างคำพูดจาก: น้องเดือน เมื่อ 15 ธ.ค. 2007, 05:30 น.
กี๊ซ :25:
(http://img2.f0nt.com/15/5ef759740a5a72d97c9db9b52a12fbf6.png)
:14: :14: :14: :14: มาอีกคนแล้วววววววว
คราวหน้าจะทำให้ยากๆ :37:
:12: สุดยอดเลยครับพี่
random() , Math.random() , แรนด้อม , สุ่มค่า :44:
มาแรนด้อมกันเถอะ :33:
สคริปในการแรนด้อม มี แบบง่ายๆ กับแบบยุ่งยากแต่ใช้งานใด้กว้างกว่า
โดย
อ้างอิง
random(2) //จะสุ่มออกมา 2 ค่า คือ 0 และ 1 คือมันจะเริ่มจากค่า 0
อ้างอิง
random(5) //จะสุ่มออกมา 5 ค่า คือ 0 - 1 - 2 - 3 - 4
ถ้าอยากให้เริ่มสุ่มค่าจาก 1 ก็
อ้างอิง
random(5)+1 //จะสุ่มออกมา 5 ค่า คือ 1 - 2 - 3 - 4 - 5
ทดสอบง่ายๆโดย
- วาดปุ่มหนึ่งอัน ตั้งชื่อว่า _btn
เขียนสคริปที่เฟรม 1
อ้างอิง
_btn.onRelease=function(){ //สร้างฟังชั่นการกดปุ่มให้กับ _btn "เมื่อกดแล้วปล่อยปุ่มนี้"
var n:Number = random(5)+1; // สุ่มค่าระหว่าง ( 0 - 4 ) แล้วบวกด้วย 1 จึงส่งค่าให้ n
trace(n); // output ดูผล
};
ลองกดดูครับ :33:
ทีนี้มาแบบยุ่งยากกันแต่ใช้งานได้กว้างกว่าการแรนด้อมอีกแบบที่ดูไฮโซโก้เก๋ เขียนแล้วทำให้ดูแมน เท่ห์มากๆ :07:
อ้างอิง
Math.random()
Math.random() จะสุ่มค่าระหว่าง 0 <= n < 1 คือประมาณ 0 ถึง 1 ประมาณนั้น :31:
อ้างอิง
//นี่คือค่าที่ลองสุ่มมาโต้งๆโดย trace(Math.random())
0.0668929731473327
0.488828447181731
0.326484804507345
0.828786731231958
0.562446332536638
0.105749536305666
0.14902024064213
0.542757675983012
0.0336807980202138
0.854372425936162
0.229754942003638
0.696945054456592
0.994662169367075
0.524953804910183
ดูแล้วหลายๆท่านอาจจะถามว่า แล้วมันเอามาเหียกอะไรได้วะนั่น :31: นั่นน่ะสิ
เลยลองไปเปิด help แล้วก้อปมาแปะให้ดู
อ้างอิง
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
:30: งงอ่ะดิ่ ผมยังงงเล้ยยยย
อีฟังก์ชั่นตัวอย่างนี้ เป็น "ฟังก์ชั่นสุ่มค่าระหว่าง" ลองดูวิธีใช้ง่ายๆ (ไม่อธิบายโค้ดตัวนี้นะลองเดาๆกัน :31: )
วิธีใช้คือ
อ้างอิง
var n:Number = randRange(4, 11)
trace(n);
จากตัวอย่าง มันก็จะ output ออกมาระหว่าง 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11
ก็ก้อปไว้ใช้เลยไม่หวงครับ :22:
ทีนี้มาอธิบายวิธีใช้อี Math.random() กัน แบบง่ายๆนะ หนูก็ไม่ค่อยเชี่ยวอีตัวนี้เท่าไรนัก
ในเมื่อมันแรนดอมค่ามาเป็นทศนิยมหลายตำแหน่ง เราลองคูณมันสักหน่อยเพื่อให้ค่ามันมากขึ้นแล้วดูผล
อ้างอิง
trace(Math.random()*10);
1.40259014908224
9.36946127098054
4.92358196061105
0.599591666832566
2.37592985853553
อาาาาา ลองคูณด้วย 10 เราเห็นอะไรมากขึ้นแล้วววว แต่ยังมีทศนิยมยั้วเยี้ยอยู่
เราลองมาตัดเศษทศนิยมกันด้วย
อ้างอิงMath.floor()
รวบรัดล่ะนะ เวลาใช้จริงก็
อ้างอิง
Math.floor(Math.random()*10) // แบบนี้เราก็จะได้จำนวนเต็มล่ะครับ จะแรนดอมค่า 0 - 9
อ้าวเฮ้ย :38: ก็เหมือนกับอันนี้น่ะสิ random(10) ใช่ครับเหมือนกัน :08:
(เท่าที่ความรู้ผมมีนะ)
จากตัวอย่างที่ผ่านมา จะเห็นใด้ชัดๆเลยล่ะว่า Math.random() ทำอะไรได้เยอะกว่า แรนดอมค่าเป็นทศนิยมได้
คือมันจะละเอียดกว่าครับ :31: เอาง่ายๆแค่นี้ละกัน (จริงๆรู้ไม่ค่อยเยอะเกี่ยวกับตัวนี้เท่าไร ใครจะอธิบายเพิ่ม ช่วยหน่อยครับ)
แรกๆเราจะมาใช้ random() กันก่อนครับเอาง่ายๆ ไม่ต้องคิดมาก
ตัวอย่างแรนด้อมง่ายๆ
สร้างดวงดาวนับพันเพียงหนึ่งคลิก
- สร้าง mc จากต้นแบบ มา 1000 ตัว
- แรนด้อมพิกัด _x _y
- แรนด้อมสเกล
http://img2.f0nt.com/flash/0193d2dc3268a886aeca7c3815c86257.swf
ส่วนอันนี้ เพิ่มวิ่งๆแล้วจางหาย
http://img2.f0nt.com/flash/dff020ed4baa1b54566f5b34c548576b.swf
คราวหน้าเราจะทำแบบฝึกหัดกันครับ
:07c: โอ้ว ล้ำมากครับ++
ฟังก์ชั่น random มีข้อควรระวังสำหรับคนที่ต้องการ random จริงๆ นะครับ
เพราะว่าถ้าลองสังเกตดูดีๆ ค่าที่ random ได้จะเป็น pattern เดียวกันหมดถ้าลอง random แล้วพิมพ์ออกมาเยอะๆ จะเจอว่า
ค่าที่ได้จะวนเมื่อถึงขนาดหนึ่ง
จึงมีการใส่ตัวเลข seed ไว้เพื่อให้การ random นั้นเปลี่ยนไปเรื่อยๆ
เช่นถ้าเป็น web slot machine ของ casino ที่คิดเงินจริงๆ เค้าจะ seed ตัวเลขเป็นเวลาตามขณะนั้น แต่ก็ยังมีคนรู้และแฮค - -"
เป็นต้นครับ
อ้อ ถึงว่า สมัยตูเคยใช้ as เป็นแล้วเขียนเกมเป่ายิ้งฉุบ ก็เจอปัญหานี้แหละ
เลยเอาเลขเวลามาแก้เหมือนกัน แต่เดี๋ยวนี้ลืมหมดแล้วตั้งกะเป็นทหาร :52:
โฮ่ เดี๋ยวมาเล่นด้วยๆ
เอาละเว้อยเฮ้ย ผมจะเก่งเพราะน้าแอดนี่แหละ :07:
:12: :12: :12: :12:
โหไม่ได้เข้ามาแป๊บเดียวมีของเล่นใหม่ด้วย น่าสนุกจัง ยังไม่ว่างเลยติดไว้ก่อนค่ะ :25:
เอาล่ะจ๊ะมาแรนด้อมง่ายๆกันด้วย random()
เราจะ แรนด้อม พิกัด _x _y และ สเกล เอาแค่นี้ก่อนง่ายๆ
- เปิดงานมา สัก 400 x 100
- สร้างปุ่มชื่อ _btn มาอันนึง
- สร้าง mc ที่ต้องการแรนด้อมมาอันนึงในที่นี้ตั้งชื่อว่า _mc
ใส่สคริปที่เฟรมแรกเลย
อ้างอิง
_btn.onRelease = function() {
xPos = random(380)+10;
yPos = random(80)+10;
nscale = random(100)+20;
_mc._x = xPos;
_mc._y = yPos;
_mc._xscale = nscale;
_mc._yscale = nscale;
};
ทดสอบเลยยย :33:
http://img2.f0nt.com/flash/9ea76d2ef426857f59aa45f20fd99bcc.swf
คำถาม : ผมอยากจะแรนด้อม mc สัก 10 ตัวบน stage ด้วยการคลิกครั้งเดียว จะทำยังไง
ก็พิมพ์สคริปนี้ใส่ในปุ่ม 10 ชุด แล้วเปลี่ยนชื่อ mc เอา แบบนี้ไง :40:
อ้างอิง
_btn.onRelease = function() {
xPos = random(380)+10;
yPos = random(80)+10;
nscale = random(100)+20;
_mc._x = xPos;
_mc._y = yPos;
_mc._xscale = nscale;
_mc._yscale = nscale;
xPos = random(380)+10;
yPos = random(80)+10;
nscale = random(100)+20;
_mc1._x = xPos;
_mc1._y = yPos;
_mc1._xscale = nscale;
_mc1._yscale = nscale;
xPos = random(380)+10;
yPos = random(80)+10;
nscale = random(100)+20;
_mc2._x = xPos;
_mc2._y = yPos;
_mc2._xscale = nscale;
_mc2._yscale = nscale;
._mc3
._mc4
.
._mc9
};
:33: ถูกต้องงงงงงง เฮ้ยยย :03: ทำไมถึกแบบนั้นล่ะ :07: แบบนี้ถ้าอยากแก้ค่าอะไรสักหน่อย มิต้องไล่แก้กันตาลายเลยเรอะ :08:
อ้าวววว แล้วทำยังไงล่ะ :37:
เดี๋ยวมาเฉลย
+
มาเฉลยล่ะครับ :27:
คำตอบคือมีหลายวิธี แล้วแต่ว่าใครจะคิดได้ ไดนามิคกว่ากัน
แน่นอนทำแบบคำตอบถึกนั้นก็ทำได้ ง่ายด้วย แต่เวลาอยากจะแก้ไขค่าไอ้นู่นไอ้นี่ มันลำบากเกิน :08:
เราจะใช้อันนี้กัน แถ่นแทนแท้นนนนนนนนน
เราจะสร้าง function() ขึ้นมาใช้เองนอกเหนือจาก global function() ที่แฟลชมีให้ เราสามารถสร้างฟังก์ชั่นส่วนตัวขึ้นมาเองได้ง่ายๆ
ตัวอย่าง
อ้างอิง
function myFunc (){ // ประกาศสร้างฟังก์ชั่นชื่อ myFunc
trace("hello F0nt"); // ให้ฟังก์ชั่นนี้ เมื่อเรียกแล้วให้ output ว่า "hello F0NT"
}; //จบการทำงานของฟังก์ชั่น
//ตัวอย่างการใช้ ใส่สคริปไว้ที่ปุ่ม
on(release){
_root.myFunc();
} //output ว่า "hello F0NT"
//หรือกหากใส่ที่เฟรมก็เรียกโดยไม่ต้องใส่ _root ก็ได้
_btn.onRelease=function(){
myFunc();
}; // output ว่า "hello F0NT"
ทีนี้เราจะเขียนแบบมีการส่งค่าเข้าไปด้วย
อ้างอิง
function myFunc (txt:String){ // ประกาศสร้างฟังก์ชั่นชื่อ myFunc(txt จะแทนค่าที่จะส่งเข้าไป ในที่นี้เราจะส่ง text จึงเป็น String)
trace(txt); // ให้ฟังก์ชั่นนี้ เมื่อเรียกแล้วให้ output (ค่าที่ส่งเข้ามา)
}; //จบการทำงานของฟังก์ชั่น
//ตัวอย่างวิธีใช้
อ้างอิง
_btn.onRelease=function(){
myFunc("ทดสอบ ทดสอบ"); //ตัวอย่างเราส่งคำว่า "ทดสอบ ทดสอบ" เข้าไปให้ฟังก์ชั่น myFunc() ทำงาน
};
ฟังก์ชั่นนี้ก็จะ output ค่าที่เราส่งเข้าไป "ทดสอบ ทดสอบ"
*** ส่วนมากเราจะประกาศฟังก์ชั่นไว้ที่เฟรมแรกเลยครับเพื่อให้มีผมตั้งแต่เปิดงาน
งงไหมครับ ไม่งงนะ :40:
เอาอีกตัวอย่างง่ายๆ
อ้างอิง
function num_plus (num1:Number,num2:Number){ // ประกาศสร้างฟังก์ชั่น num_plus(เราจะส่งค่าตัวเลขเข้าไปสองค่าแทนด้วย num1,num2)
trace(num1+num2); // ให้เอาค่าที่ส่งเข้ามา้บวกกันแล้ว output
};
//ลองใช้โดย
_btn.onRelease=function(){
num_plus(10,20); // ส่งค่า 10 กับ 20 เข้าไปให้ฟังก์ชั่น num_plus() ทำงาน
};
// ผล output : 30
ทีนี้กรณีนี้ คือการ trace ดูเท่านั้น มองดีๆจะเห็นว่า ถ้าไม่ trace ออกมาดูค่าที่ส่งเข้าไปนั้นก็จะหายวับเข้ากลีบเมฆ
หากเราอยากใด้ค่านั้นคืนออกมา
จากตัวอย่างบน เราอยากได้ค่า 30 ที่บวกเสร็จแล้วเอามาใช้งาน
เราต้องให้ฟังก์ชั่นมันคืนค่าออกมาให้เราด้วย ...
อ้างอิงreturn()
เราจะปรับสคริปใหม่นิหน่อยให้มันคืนออกมา
อ้างอิงfunction num_plus (num1:Number,num2:Number){ // ประกาศสร้างฟังก์ชั่น num_plus(เราจะส่งค่าตัวเลขเข้าไปสองค่าแทนด้วย num1,num2)
return(num1+num2);// ให้เอาค่าที่ส่งเข้ามา้บวกกันแล้ว คืนค่าออกมา
};
//ทดสอบดู
_btn.onRelease=function(){
my_num = num_plus(10,20); // ส่งค่า 10 กับ 20 เข้าไปให้ฟังก์ชั่น num_plus() ทำงาน แล้วคืนค่าออกมาส่งให้ my_num
trace(my_num)
};
// ผล my_num = 30
มีประโยชน์นะครับลองๆทำความเข้าใจครับ
ทีนี้เราจะเอามันมาสั่งแรนดอมครับ
จากตัวอย่างอันเดิมที่ถามว่า เราจะสั่ง mc ทั้งสิบตัวพร้อมกันยังไง
กรณีนี้ผมยังไม่ใช้ลูปพวก do while for ไว้หลังๆจะมาเขียนเรื่องลูป
ผมจะเขียนแบบนี้ครับ
อ้างอิงfunction myFunction(mc:MovieClip){ //สร้างฟังก์ชั่นขึ้นมาหนึ่งอัน เราจะส่ง mc เข้ามาแรนด้อมค่าต่างๆในฟังก์ชั่นนี้กัน
xPos = random(380)+10; //แรนดอมค่า _x
yPos = random(80)+10; //แรนดอมค่า _y
nscale = random(100)+20; //แรนดอมค่า scale
mc._x = xPos; //ส่งค่าแรนดอมตำแหน่ง _x ให้ mc ที่ส่งเข้ามา
mc._y = yPos; //ส่งค่าแรนดอมตำแหน่ง _y ให้ mc ที่ส่งเข้ามา
mc._xscale = nscale; //ส่งค่าแรนดอม xscale ให้ mc ที่ส่งเข้ามา
mc._yscale = nscale; //ส่งค่าแรนดอม yscale ของ ให้ ที่ส่งเข้ามา
};
_btn.onRelease = function() { // เราก็ส่ง _mc ทั้งสิบตัวเข้าไปฟังก์ชั่น
myFunction(_mc1);
myFunction(_mc2);
myFunction(_mc3);
myFunction(_mc4);
myFunction(_mc5);
myFunction(_mc6);
myFunction(_mc7);
myFunction(_mc8);
myFunction(_mc9);
myFunction(_mc10);
};
จากตัวอย่างเดิม เราสร้าง mc ขึ้นมาอีก 9 ตัว ใส่ชื่อให้ครบ
แล้วลองดูครับ
http://img2.f0nt.com/flash/1fbcf7dbd30a34642d4f7684f90a2aaa.swf
จริงๆใ้ช้ลูปรันเอาก็ได้ง่ายกว่า แต่เอาแบบนี้ก่อนครับ ถึกๆดี
คราวหน้าเรื่อง การเปรียบเทียบ if else ครับ
:46: ขอบคุณครับน้าแอ๊ด+
สงสัยท่อนนี้ครับ
function myFunction(mc:MovieClip){]
ตรง mc:MovieClip นี่คือ
"ข้าขอประกาศสร้าง MovieClip ขึ้นมาจากอากาศ ในตัวแปรชื่อ mc" ใช่ไหมครับ
มีอะไรบ้างครับที่สร้างได้จากอากาศ :09:
อ้างคำพูดจาก: น้องไอ้แอน เมื่อ 16 ธ.ค. 2007, 03:09 น.
:46: ขอบคุณครับน้าแอ๊ด+
สงสัยท่อนนี้ครับ
function myFunction(mc:MovieClip){]
ตรง mc:MovieClip นี่คือ
"ข้าขอประกาศสร้าง MovieClip ขึ้นมาจากอากาศ ในตัวแปรชื่อ mc" ใช่ไหมครับ
มีอะไรบ้างครับที่สร้างได้จากอากาศ :09:
ผมก็มั่วๆเอาตาม help น่ะครับ มันเขียนมาเป็นแพทเทิรนแบบนี้ ก็เลยใช้เรื่อยมา
แต่ว่ายังไม่เชิงว่าเป็นเช่นนั้นมั๊งครับ
คือมันแค่แทนค่าที่จะส่งผ่านเข้าไปน่ะครับ ไม่ได้สร้าง mc ขึ้นมา
ประมาณว่า "ไอ้ค่าที่จะส่งเข้าไปในฟังก์ชั่นเนี่ย คือประเภทอะไรบอกๆไว้หน่อยจะได้จองหน่วยความจำถูก"
(เดาเอาล้วนๆ) :31:
สมมุติ
function xxx(mc:MovieClip,num:Number,txt:String){
mc._x = num
trace(txt)
}
อย่างฟังก์ชั่นนี้ผมจะส่งค่าเข้าไป 3 แบบ สมมุติ xxx(mc_1,500,"สำเร็จ")
ฟังก์ชั่นก็จะเอาค่าที่ส่งไปทำงานตามที่เราตั้งไว้คือ
ทำ mc_1._x = 500
trace("สำเร็จ")
:44: :44: :44: :44:
ไม่รู้ตอบตรงป่าว
แต่ที่แน่ๆ ยังไม่เคยลองส่งค่าไม่ตรงประเภทสักที
เช่นเราประกาศว่า mc:MovieClip แต่ดันส่งตัวแปรประเภทตัวเลขแทน มันจะเป็นยังไงน้อ :31:
เหนื่อยมั้ยคะ :25:
มาบวกให้กำลังใจนะคะ แต่ยังไม่มีปัญญาเรียนง่ะ :05:
แล้วเวลาประกาศไอ้เจ้า MovieClip ขึ้นมานี่
เราต้องมี mc ที่เป็นก้อนๆ จริงๆ อยู่ไหมครับ แล้วใส่ชื่อเอาด้วยการประกาศประเภท
หรือว่ามาจากอากาศก็ได้ :09:
ไม่ต้องมีครับ เหมือนประมาณว่าสร้างท่อรูปกระต่าย เอาไว้ส่งกระต่าย( Rabbit Object )เข้ามา
ไม่สามารถส่งสิงโต ( Lion Object )เข้ามาได้ เพราะจะเออเร่อ
โดยที่สร้างท่อกระต่ายเนี้ย ไม่ต้องมีกระต่ายมาจริงๆ ก็ได้
เพราะเรามี แม่แบบกระต่าย (Rabbit Class) มาเป็นแบบอยู่แล้ว
ตามนั้นเลยครับ
ค่าที่อยู่ในวงเล็บหลังชื่อฟังก์ชั่น เขาเรียกว่า parameter
ซึ่งเป็นการบอกว่า การเรียกใช้ฟังก์ชั่นนี้ ต้องส่งค่าอะไรเข้ามาบ้าง ถึงจะใช้งานได้
มันจะไม่ใช่การสร้าง แต่จะเป็นการอ้างถึงครับ
อ้างคำพูดจาก: ซ้อซั้ว เมื่อ 16 ธ.ค. 2007, 04:42 น.
ไม่ต้องมีครับ เหมือนประมาณว่าสร้างท่อรูปกระต่าย เอาไว้ส่งกระต่าย( Rabbit Object )เข้ามา
ไม่สามารถส่งสิงโต ( Lion Object )เข้ามาได้ เพราะจะเออเร่อ
โดยที่สร้างท่อกระต่ายเนี้ย ไม่ต้องมีกระต่ายมาจริงๆ ก็ได้
เพราะเรามี แม่แบบกระต่าย (Rabbit Class) มาเป็นแบบอยู่แล้ว
:12:
อ่านไปอ่านมาแล้วเริ่มมึน
แต่เข้าใจกว่าคนที่เคยสอนเยอะเลยค่ะ :22:
:46: :46:
ติดตามอยู่นะครับผม +
ถ้า .... ให้ ทำงานต่อไป
แต่ถ้า .... ให ้ทำอันนี้
ถ้า .... ไม่ใช่เลย ให้ ทำอันนี้ :40:
ว่าด้วยเรื่องการเปรียบเทียบ กำหนดเงื่อนไขอีกหนึ่งสิ่งที่สำคัญและจะทำให้โปรแกรมของเราฉลาดขึ้น
เหมือนเป็นยามคอยเฝ้าจับผิดสิ่งที่เราสั่งไว้ :22:
อ้างอิงif(...){ //ถ้า ...
// ให้ทำอะไรก็ว่าไป
}; //จบการทำงาน
//ตัวอย่างเช่น
if(n==1){ //ถ้า n มีค่าเท่ากับ 1 จริง
trace(n); //ให้ทำงาน ที่เราสั่งไว้คือ output ค่า n ออกมา
}; //จบการทำงาน
ทีนี้มาเพิ่มความวุ่นวายกัน :43: จากอันบน แค่ "ถ้า ... จริง ให้ทำงาน"
ด้วยการเพิ่มเงื่อนไขอีกว่า "ถ้าไม่ใช่ หรือไม่จริง ให้ทำอันนี้แทน"
ด้วยการ...
อ้างอิงif(...){ //ถ้า ... จริง
//ทำอะไรก็ว่าไป
}else{ //ถ้าไม่ใช่ หรือ ไม่จริง ให้ทำอันนี้แทน
//ทำอะไรก็ว่าไป
}; จบการทำงาน
เห็นว่าเราจะเพิ่ม else เข้ามาเสนอหน้าด้วย
การใช้งานก็ง่ายๆ เช่น
อ้างอิงif(n==1){ //ถ้า n มีค่าเท่ากับ 1 จริง
trace(n); //ให้ทำงาน ที่เราสั่งไว้คือ output ค่า n ออกมา
}else{ //แต่ถ้าไม่ใช่ หรือไม่จริง คือ n ไม่ใช่ 1 ให้ทำงานอันนี้แทน
n=10; //ให้ทำงาน ที่เราสั่งไว้คือ ในที่นี้เราจะใส่ค่าให้ n = 10;
trace(n); //แล้ว output ค่า n ออกมาคือ 10
}; //จบการทำงาน
ไม่งงนะ :22:
ทีนี้เพิ่มเงื่อนไขเข้าไปอีก ด้วยการมี "แต่ถ้า ... ให้ทำอันนี้แทน" ด้วยการเพิ่มเงื่อนไข else if(...)
อ้างอิงif(n==1){ //ถ้า n มีค่าเท่ากับ 1 จริง
trace(n); //ให้ทำงาน ที่เราสั่งไว้คือ output ค่า n ออกมา
}else if(n==2){ //แต่ถ้า n คือ 2 ให้ทำงานอันนี้
n=5; // ให้ทำงาน ที่เราสั่งไว้คือ ในที่นี้เราจะใส่ค่าให้ n = 5
}else{ //แต่ถ้าไม่ใช่เลย หรือไม่จริงทั้งหมด คือ n ไม่ใช่ 1 n ไม่ใช้ 2 ให้ทำงานอันนี้แทน
n=10; //ให้ทำงาน ที่เราสั่งไว้คือ ในที่นี้เราจะใส่ค่าให้ n = 10;
trace(n); //แล้ว output ค่า n ออกมาคือ 10
}; //จบการทำงาน
เอาล่ะนะ :37: มาหนักกระโหลกกันล่ะ
ผมจะสั่งให้ มูวี่คลิปตัวนึง ให้มันบวกตำแหน่งตัวเองเรื่อยๆๆๆๆๆๆ
แต่เมื่อสุดขอบเขตงาน ก็จะเจอเงื่อนไขว่า "ถ้ามรึงวิ่งไปจนสุดขอบนะ ให้วิ่งกลับไปด้านตรงข้ามเลย"
ถ้าสุดอีก"ก็กลับไปฝั่งตรงข้ามอีก" วนไปวนมา
ทีนี้มาถึงเรื่อง ทำยังไงให้มีการรันตลอดเวลา
เราจะใช้
mc.onEnterFrame = function(){
// ทำอะไรก็ว่าไป
}
โดย ตัวนี้จะทำการ รันตลอดเวลา การทำงานนับเป็น วินาที/เฟรมเรท ที่เราตั้งไว้
สมมุติเราตั้งเฟรมเรทไว้ 25 สคริปนี้จะรัน วินาทีละ 25 รอบ
ฉะนั้นคิดให้ดีในการใช้ เพราะจะกิน cpu ใช้ได้เลยล่ะ :31: (ไม่โหดร้ายขนาดนั้นหรอกครับ :21: ขู่ให้กลัวเฉยๆ)
เอาตัวอย่างไปดูก่อน
แบบนี้คือ
บวกค่าตำแหน่งตัวเองตลอดเวลา ทั้ง _x และ _y
เมื่อพิกัดใด เกินขอบเขตที่กำหนด
ให้เปลี่ยนตัวที่บวกเป็นค่าลบซะ ก็จะวิ่งกลับด้านแล้ว เราก็จะได้สคริปถึกๆแบบนี้มา
- สร้างงานสัก 350 x 130
- สร้างลูกกลมๆเล็กๆ ตั้งชื่อว่า _mc
- ก้อปสคริปไปแปะโลด
อ้างอิง
i = 10;
iy = 5;
_root._mc.onEnterFrame = function() { //สั่งทำงานตลอดเวลา
_mc._x += i; //เพิ่มค่าตำแหน่งตัวเองทุกๆรอบ
_mc._y += iy; //เพิ่มค่าตำแหน่งตัวเองทุกๆรอบ
if (_mc._x>330) { //ถ้าค่า._x มากกว่าที่กำหนดไว้เมื่อไร
i = (i*-1); //ให้เอาค่าบวกตำแหน่งเปลี่ยนเป็นลบซะ ก็จะกลับด้านกัน
}
if (_mc._x<15) { // เหมือนๆกันแล้วลองดู
i = (i*-1);
}
if (_mc._y>110) {
iy = (iy*-1);
}
if (_mc._y<15) {
iy = (iy*-1);
}
};
http://img2.f0nt.com/flash/37bd9e7b95aeace1e22066fa77ac3e76.swf
ยังติดตามอ่านอยู่นะคะ ชอบๆ แต่ยังไม่ได้ลองทำเลยอันหลังๆ ถ้าทำได้แล้วสัญญาจะเอามาส่งค่ะ :25: แอบมา + เพิ่ม
:25: :25: :25: สนุกมาก++
ใครอ่านแล้วคิดว่าพอทำได้ ลองทำดูเลยนะครับ
ตูอ่านไม่ค่อยเข้าใจแต่พอทำดูแล้วเข้าใจขึ้นมาหน่อยเลย :25: :25:
http://img2.f0nt.com/flash/300da36eae53f01daff33f8b45917435.swf
อันนี้ที่มีหยุ่นๆ คือเพิ่มให้ mc มันวิ่งไปเล่นเฟรมหยุ่นๆ ที่ต้องการ เวลาที่ไปติดขอบครับ
:25: เด้งดึ๋งๆ
พักยกเล่นเกมส์ หายหัวไปทำเกมส์แป้ปนึงมีคนทำเจ๋งกว่าของเราอีก :22:
จากตัวอย่างที่แล้ว เราเอามาทำเกมส์ง่ายๆ คลิกนรก episod II :02:
คงไม่ต้องอธิบายวิธีเล่น :07: ลุยโลด !!!!!
http://img2.f0nt.com/flash/e14783489920120274560296d3ef916c.swf
ใครเจ๋ง เซฟมาดูด้วยจ้า อันนี้ยากจริงๆนะ อิอิ
แล้วจะมาสาธยายสคริปที่ใช้ทั้งหมดจ๊ะ (ไม่แนะนำให้ทำตาม) ให้แนวคิดเฉยๆ
//หุหุ
ยากจริงๆ ครับ ถ้าไม่ใช้สูตรโกงคงไม่ได้ยังงี้หรอก :30:
(http://img2.f0nt.com/17/0c8747ccf6c0df18858b96244d8a31fd.png)
// อ้าว มีแมงจริงๆ ด้วย ตะกี้เล่นรอบสองแล้วเจอ
สงสัยว่ากดยังไงได้ 266 ครั้งครับ :07:
สูตรเดิม :52: กดแท็บ > สเปซบาร์ครับ
เอกดได้ไม่ถึง ได้แค่ ห้าสิบกว่าครั้งเอง เลยสงสัยว่ากดยังไงได้เยอะขนาดน้านนนน :07:
(http://img2.f0nt.com/17/a78221eecf8c495d71b7e5d7f508b599.png)
:31:
:30: เลื่อนขึ้นไปดูข้างบน มีตามแก้บั๊กเป็นระยะๆ ด้วย
จริงๆ ก็ยังมีบั๊กอยู่นะคะ :31:
แต่เดือนไม่รู้เจอได้ไงง่ะ จำไม่ได้
(http://img2.f0nt.com/17/21e5aa5d9ea50c4ca3783b453ad14a36.png)
เวลาติดลบนี่แสดงว่าทะลุมิติไปแปล้วนะครับ :25:
เผลอไปได้หลักฐานมาเหมือนกันว่า เราสามารถย้อนเวลาได้
555
(http://img2.f0nt.com/17/36bcc96a7ec1f1d57b48723aed8a65f8.png)
:22: ขอบคุณครับ มันส์ดี บวกให้นะครับ
ขยันมากครับคุณครู :25:
แจ่มมากๆ หลังๆนี่เข้มขึ้นเรื่อยๆ ชอบๆ :12: :12:
:08: ขอบคุณสำหรับกำลังใจครับ แต่ไม่แก้ล่ะ ปล่อยเป็นซากอารยธรรมไปละกัน
ขึ้นบทต่อไปดีกว่า
ว่ากันด้วยเรื่อง การทำซ้ำ หรือ 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 :31: )
จำอันนี้ได้ไหมครับ ตัวแรนด้อมดวงดาว
ผมก็ใช้ duplicateMovieClip() นี่แหล่ะครับช่วยจัดการ
http://img2.f0nt.com/flash/0193d2dc3268a886aeca7c3815c86257.swf
อันบนนั้นมีการใช้ลูปเข้าช่วยให้ทำซ้ำทีละมากๆ เดี๋ยวบทหน้าเราจะมา ลูป กัน :04:
คราวนี้เราจะมา
"คลิกแล้ว ทำซ้ำ 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
จะพบว่า มันสร้างแล้วววววววว :22: .... แต่พอเราจะสร้างอีก :03: มันดันลบอันที่สร้างออกมาเมื่อกี้ไปซะงั้น :38:
สาเหตุคือ อะไรครับ ........ :22:
มาฝึกวิเคราะห์สคริปกันครับ (ฝึกบ่อยๆครับ มองให้ละเอียดจนเป็นนิสัย แล้วเราจะเจอปัญหาเอง และแก้ปัญหาได้เองครับ)
อ่านตามช้าๆ แล้วคิดตามครับ
เพราะเราสั่งให้สร้างจากต้นแบบคือ _mc และชื่อใหม่คือ "mc_1" เมื่อสร้าง mc_1 มาแล้ว
ถ้าจะสั่งให้มันสร้างใหม่อีก มันคงไม่สร้างนิ เพราะบน stage นั้นมี mc_1 อยู่แล้วไงครับ
อ้าวววว :09: แล้วทำไมมันถึง ลบตัวเก่า แล้วสร้างตัวใหม่ล่ะ เห็นอยู่ว่ามันสร้างใหม่ :07:
:21: มันสร้างแค่คลิกเดียวคลิกแรกล่ะครับ :31: คลิกต่อไปมันจะไม่สร้าง แต่จะเอาอันที่สร้างเมื่อกี้มาแป๊ะตรงตำแหน่งเม้าส์ครับ
เพราะมันจะรันผ่านสคริป duplicate ไปเจอกับ สคริปตัวที่สั่งงาน mc_1._x = mc_1._y = ......บลา บลา บลา
มันก็เลยเปลี่ยนตำแหน่งตามเม้าส์ และแรนด้อมสเกลด้วยไงล่ะครับ
พอเข้าใจนะครับ :22:
แล้วเราจะแก้ปัญหาอย่างไรล่ะอย่างน้อย ต้องไม่ให้ชื่อซ้ำกันล่ะ อืมมมมม อันนี้แหล่ะ สำคัญเลย
โดยวิธีง่ายๆ คือ สร้างตัวแปรขึ้นมาตัวนึงเอาใว้ต่อท้ายชื่อ ชื่อจะได้ไม่ซ้ำกันแน่นอนไงล่ะ
- หลักการคือ ให้ตัวแปรนี้เป็นตัวเลข เริ่มจากศูนย์ก็ได้ง่ายๆ
แล้วเมื่อมีการคลิกเม้าส์เพื่อ duplicate ก็ให้เอาตัวแปรนี้ไปต่อท้ายชื่อ mc ที่สร้างใหม่ ก็จะได้ mc0
แล้วบรรทัดสุดท้ายของสคริปก่อนจบ ก็บวกตัวแปรขึ้นไป 1 ค่า ตัวแปรตัวนี้ก็จะเป็น 1
- พอรอบที่สอง mc ที่สร้างใหม่ ตัวแปรที่บวกค่าแล้วมาต่อ ก็จะใด้ชื่อว่า mc1 อ๊ะ.....เห็นไหม ไม่ซ้ำกันแล้วครับ
- รอบต่อไปก็ mc2 mc3 mc4 mc5 ไม่ซ้ำแล้วคร้าบบบบบ :22:
จำวิธี trace ที่กล่าวไปคราวที่...สองสามหน้านู้นได้ไหมครับ ต่อตัวหนังสือ กับแสดงค่าน่ะ
ใช้วิธีคล้ายๆกัน เอามาต่อกัน :22:
อ้างอิง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
:22: :22:
มาดูตรงนี้นิดนึงครับ
_root["mc_"+i] ไม่ขออธิบายว่าทำไมต้องเขียนรูปแบบให้จำยากแบบนี้นะครับ ( มันเขียนมาแบบนี้ครับ :31: )
สมมุติ i = 1 // _root["mc_"+i] ก็คือ _root.mc_1
สมมุติ i = 250 // _root["mc_"+i] ก็็คือ _root.mc_250
รูปแบบการเขียนออกจะงงๆใช่ไหมครับ แต่จำรูบแบบนี้ให้ดีๆครับ
เพราะต่อไปถ้ามีการไดนามิคชื่ออ้างอิงต่างๆ การรันสคริปลูปต่างๆที่ต้องมีการเรียกใช้ชื่อเรียงๆๆกัน สมมุติเป็นพันๆชื่อ
การรันแบบนี้จะใช้ประโยชน์ได้เหลือหลายมากๆครับ
อันนี้สำคัญครับ :22:
เรื่องต่อไปเรื่อง ลูป :04:
:46: ขอบคุณครับ ได้ประโยชน์สุดๆ เลยพี่น้องงงงง :07:+
++++++++++++++ ว้อยยยยยยยยยยย อาร์กซ์ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ ขอบคุณมากพี่ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ
เออ :27: อันนี้ของแถม จากการแรนด้อมคราวนู้น :22:
เคยสั่งแรนด้อมสีครั้งนึง ยุ่งยากพอสมควร เลยสร้างฟังก์ชั่นไว้ใช้เองแบบนี้
อ้างอิง
function randomColor(mc:MovieClip) {
var my_color:Color = new Color(mc);
r = random(256);
g = random(256);
b = random(256);
rr = r.toString(16);
gg = g.toString(16);
bb = b.toString( 16);
RGBcolor = "0x"+rr+gg+bb;
my_color.setRGB(RGBcolor);
delete my_color;
}
จะเห็นว่า :08: นั่นมันอะไรวะน่ะยุ่บยั่บเลย
จนเมื่อเร็วๆนี้(จริงๆ) เพิ่งมารู้ว่ามันสามารถแรนดอมค่าสีแบบง่ายโคตรๆๆๆๆๆๆ
อ้างอิงrandom(0xffffff); // แค่นี้จริงๆ :31:
:03: เฮ้ยยย ไปมุดหัวที่ไหนมาวะนั่น
จากสคริปยาวเหยียด เหลือสั้นจู๋เลย
อ้างอิงfunction randomColor(mc:MovieClip) {
var my_color:Color = new Color(mc);
my_color.setRGB(random(0xffffff));
delete my_color;
}
วิธีใช้ก็
randomColor( mc ที่ต้องการ );
:22:
:30: :48:
อันล่างทำไมต้อง delete my_color; ด้วยครับ
ถ้าไม่ลบจะกินแรม มั้งครับ เพราะไม่ยอมคืนค่าแล้วดันสร้างใหม่เรื่อยๆ
อ้างคำพูดจาก: ซ้อซั้ว เมื่อ 18 ธ.ค. 2007, 01:40 น.
ถ้าไม่ลบจะกินแรม มั้งครับ เพราะไม่ยอมคืนค่าแล้วดันสร้างใหม่เรื่อยๆ
พอ var ปั๊ป มันก็จะจองหน่วยความจำทันทีครับ ก็ถ้าใช้เสร็จ แล้วถ้าไม่ใช้ต่อก็ลบเลยครับ
เพราะยังไงเรียกฟังชั่นมันก็สร้างใหม่อยู่แล้ว
แล้วเวลาตอนเราเอาไปใช้นี่
แต่ลบ my_color ไปแล้ว :09:
หรือตูเข้าใจกระบวนการของมันผิด :44:
ตัดหน้าพอดี ขอบคุณครับ :27:
แอร๊ อันล่าสุดสวยจังเลยค่าาาา
ชอบมากกกกกกกกกกกก :25: :25: :25: :25: :25:
สนุกจังเลย :25:
Loop Loop Loop :27:
ลูป เป็นการทำซ้ำ ........ ครับ แค่นั้น :31:
ไม่ยืดเยื้อแล้ว ... มาเลยมาลูปกัน
พิมพ์นิยมสุดๆเลยก็ต้อง
อ้างอิง
for ( i = 1 ; i < 12 ; i++ ) { //เอาแบบง่ายๆนะครับ ไม่ต้องกลักการมาก
trace("hello F0NT") //หรือจะทำอะไรก็ว่าไป
}
ชุดแรกคือ i = 1 จะกำหนดค่าเริ่มต้นของลูป เราใช้วิธีกำหนดจากข้างนอกก็ได้
ถัดมาชุดสองคือ i < 12 เป็นส่วนกำหนดเงื่อนไข ว่าต้องการอะไร ในที่นี้เราต้องการให้ i ที่เป็นค่าเริ่มต้น รันไปจนมีค่าน้อยกว่า 12 ก็คือ 11
ถัดมาที่สามคือ i++ เป็นการเพิ่มค่าหรือลดค่าไปเรื่อยๆ ในที่นี้ให้บวก i ให้เพิ่มค่ารอบละ 1 เราจะบวกครั้งละเท่าไรก็ได้ครับ ก็ลดรอบกันไปตามค่าครับ
เออ งงไหม ผมยังงงเลยถ้าอธิบายแค่นี้ แล้วมันจะลูปยังไง(วะ) งง
จากตัวอย่างบน ก็คือ เราจะสั่งมันให้
เฮ้ย เริ่มจากหนึ่งนะ ( i = 1) แล้วบวกเพิ่มครั้งละหนึ่ง ( i++ ) ไปจนกว่าจะถึง 11 ( i < 12 )
ในแต่ละรอบมันก็จะทำงานคำสั่งที่เราใส่ไว้ในปีกกา
1 รอบ ทำ 1 ครั้ง
2 รอบ ทำ 2 ครั้ง
.
.
11 รอบ ทำ 11 ครั้ง (มันก็จะเจอเงื่อนไขว่า i < 12 เฮ้ย ไม่เกิน 12 นะ มันก็จะหยุด)
และจบคำสั่ง ออกจากลูป ตัวอย่างบนนั่น ก็จะ output hello F0NT ออกมา 11 ครั้ง
อาจจะดูสลับกัน แต่ประมาณนั้นครับ
่การทำงานนั้นรวดเร็วมาก คือจะทำรวดเดียวเลยครับ เสี้ยววินาทีเท่านั้น แม้ว่าจะลูปเป็นพันรอบก็ตาม พรึ่บเดียวและเราต้องจำกัดขอบเขตมันไว้ด้วยครับ ไอ้ตัวนี้ดื้อพอสมควร เช่นเฮ้ย ทำ i จาก 1 ให้ เกิน 12 นะ เพิ่มค่ารอบละหนึ่ง
เท่านั้นล่ะครับ ถ้าเกินเมื่อไร มันจะไม่หยุดครับมันจะทำไปเรื่อยๆ จนเป็น
ลูปอนันต์์
เพราะว่าเราสั่งให้ มันเกิน แต่มันไม่รู้หรอกครับ ว่าจะเกินเท่าไรดี เกินไปสักสิบแล้วค่อยหยุด หรือเกินไป ห้าสิบแล้วหยุด
:07: " อ้าววว ก็กุไม่รู้นี่หว่าว่าเมิงจะให้กุุเกิน 12 ไปเท่าไหน กุก็ทำไปเรื่อยๆไม่หยุดน่ะสิ "
เออ จริงของมัน :31: โทษมันก็ไม่ได้ เพราะเราสั่งเองให้มันเกินนี่หว่า เกินเท่าไหนก็ไม่บอกมัน มันก็ซื่อทำแม่มไปเรื่อย
แฮงค์ครับ คำตอบสุดท้าย :34:
เอาล่ะ ขู่ไปพอสมควร มาดูตัวอย่างง่ายๆ อีกแบบ
กรณีนี้เราสั่งค่าเริ่มต้นจากด้านนอกเลย
อ้างอิง
i=1
for (i ; i<=12; i++) {
}
หากไม่ได้ประกาศก่อนด้านนอกควรใช้รูปแบบนี้
จำรูปแบบให้ดีครับอ้างอิงfor (var i:Number = 1 ; i < 12 ; i++ ) {
trace("hello F0NT")
}
จะเห็นว่าเราประกาศตัวแปรไปพร้อมกันเลยครับ จะใด้จองหน่วยความจำสำหรับลูปนี้เลยไงครับ (ประมาณนั้น)
อ้างอิงfor (var i:Number = 1; i<12; i++) {
trace(i);
}
อันนี้คือ
(http://img2.f0nt.com/20/16b382fe12b0fba2073b4b27e2ae5e79.jpg)
จะเห็นว่าเราเอา i ออกมาดูค่าก็จะเห็นการทำงานครับว่ามันทำงานกี้รอบ
ทีนี้เราลองเปลี่ยนตัวบวกมั่ง เพิ่มแบบกระโดด บวกทีละ 2 เลย ผลจะเป็นยังไง
อ้างอิงfor (var i:Number = 1; i<12; i += 2) {
trace(i);
}
(http://img2.f0nt.com/20/d8760aa709d37352510d0f9fd97e12b3.jpg)
ยังไม่เข้าใจใช่ไหมครับว่าทำไมเป็นแบบนั้น
งั้นดูอันนี้
อ้างอิงn = 1;
for (var i:Number = 1; i<12; i += 2) {
trace("i รอบที่ "+n+" = "+i);
n++
}
(http://img2.f0nt.com/20/6ca22d3343a60c64889aa9ca119f888c.jpg)
ผมทำตัวตรวจรอบ แล้ว output ออกมาดู ...ชัดเจนครับ เราบวกทีละ สอง เพราะมันถึงเงื่อนไขเร็วขึ้น รอบมันก็ลดลงไงครับ :22:
ไม่งงนะครับ :33: ถ้าไม่งงก็.... :37:
อนุบาลการบ้าน :37:
ให้ output สูตรคูณแม่ 2 มาแบบงามๆ 1 ชุด โดยใช้ for() กับ trace() และตัวแปร 3 ตัว สคริปทั้งหมดเขียนที่เฟรม 1 ใบ้ให้ว่า ตัวแปรทั้งหมดเป็น : Number . มีการคูณจริงๆในแต่ละรอบ . คูณแล้วส่งค่าไปไว้อีกตัวแปรนึง :35:
ส่งแค่สคริปอย่างเดียวก็ได้ ** ไม่ต้องอายครับ เพราะแต่ละคนย่อมมีสูตรการคิดไม่เหมือนกันครับ
และมีมากมายหลายวิธีเลยครับ
อันนี้สคริปผม 5 บรรทัดครับ :21: (http://img2.f0nt.com/20/9e43743c3dae742fab7777a255178e7b.jpg)
ตัวอย่าง output
(http://img2.f0nt.com/20/7f451251417b18049385bc4fb72ef86b.jpg)
จะรอจนกว่าจะมีคนส่ง ถึงจะขึ้นติวเตอร์ต่อไป :37:
ขอบคุณมากครับจานน้าแอ๊ด :25: :25:++
ส่งครับ
อ้างอิงvar n:Number = 2;
for (var i:Number = 1; i<=12; i++) {
trace(n+" × "+i+" = "+(n*i));
}
สี่บรรทัด :30:
ไม่รู้ถูกเปล่าแต่ผลมันก็ออกมาเป็นสูตรคูณเว้ยครับ
มาถึงบทนี้แล้วเริ่มจะถึงจุดที่สมองจะรับไม่ได้แล้วครับ
เลยต้องรีบส่งก่อน
//แก้ๆ เห็นว่าต้องใช้ตัวแปรสามตัว :03:
เพิ่มอีกบรรทัดครับ
อ้างอิงvar n:Number = 2;
for (var i:Number = 1; i<=12; i++) {
x = n*i;
trace(n+" × "+i+" = "+x);
}
:45: :45: :45:
(สรุปแล้วเราบ้ากันอยู่สองสามคนใช่ไหมเนี่ย :31: จักรีอีกคน)
สองสคริปของแอนนนนน อันไหนคิดยากกว่ากัน อันไหนคิดนานกว่า
ฝากวิเคราะห์สคริปสักหน่อยครับ จะได้รู้ว่า เฮ้ย ตูทำเอง ไม่ได้ลอกใคร และเข้าใจอย่างลึกซึ้ง :35:
.
.
.
.
ยังคิดไม่ออกเรื่องต่อไปเอาอะไรดี ที่เหมาะกับอนุบาล :31:
รีเควสได้นะ :22:
อยากเรียนเกี่ยวกับ gravity ครับ :46:
อันแรกคิดยากกว่าครับ
จริงๆ อันที่สองก็แค่เพิ่มตัวแปรขึ้นมาตัวนึงเพื่อให้เป็นไปตามโจทย์เองแหละ
แต่ถ้ามานึกดูดีๆ เวลาใส่เลขอะไรพวกนี้ก็ควรกำหนดตัวแปรให้เป็นนิสัยไว้เลยใช่ไหมครับ
ปัญหาที่เจอในอันแรกคือตอนแรกไม่ได้ใส่ไอ้ :Number ไป
แล้วตอนเขียนเหมือนมันจะเข้าใจผิดอะไรสักอย่าง เลยเติมลงไปก็หายดีละ :31:
เท่านี้แหละครับ
เรื่องที่อยากให้สอนเลยก็คือการดึงค่าจากข้างนอกมาใช้ครับ จะเป็น xml หรือ txt ก็ว่ากันไป
จริงๆ แล้วสิ่งที่อยากรู้ก็คือทำยังไงถึงจะประยุกต์เอาไวยากรณ์ต่างๆ มาใช้งานได้จริงๆ น่ะครับ :46:
อืมม นั่นล่ะครับที่ต้องการ ประกาศไว้เลยจะได้รู้เองด้วย
มีไรก็ส่งเข้าตัวแปรให้หมด ใช้ไม่ใช้ไม่รู้เผื่อไว้ก่อน
เผื่อวันใดต้องใช้ค่าส่วนนั้นๆ เราก็ไม่ต้องแก้เยอะ มีตัวแปรรับค่าไว้แล้ว ดึงมาเลย ทำนองนั้น
อ้างคำพูดจาก: nng เมื่อ 20 ธ.ค. 2007, 14:05 น.
อยากเรียนเกี่ยวกับ gravity ครับ :46:
:38: นี่อนุบาลงาน actionscript นะ :07: (ไอ้คนสอนมันยังไม่รู้เรื่องเล้ยยย :08: )
อ้างคำพูดจาก: น้องไอ้แอน เมื่อ 20 ธ.ค. 2007, 16:13 น.
เรื่องที่อยากให้สอนเลยก็คือการดึงค่าจากข้างนอกมาใช้ครับ จะเป็น xml หรือ txt ก็ว่ากันไป
จริงๆ แล้วสิ่งที่อยากรู้ก็คือทำยังไงถึงจะประยุกต์เอาไวยากรณ์ต่างๆ มาใช้งานได้จริงๆ น่ะครับ :46:
xml คงไม่ เพราะยังไม่ค่อยรู้เรื่อง เห็นมีจุ๋นึงคุยกันอยู่ อ่านอันนั้นไปก่อนนิ
งั้นอันต่อไปเราจะมาดึงค่าจากภายนอกกัน :22: (อันนี้ผมก็มั่วใช้ได้เลย :30:)
มีสอบเลื่อนชั้นด้วยสิครับ
ขึ้นประถม
บรรทัดเดียว :37:
อ้างอิงa = 2;for (b=1; b<=12; b++){c = a*b;trace(a+chr(9)+"x"+chr(9)+b+chr(9)+"="+chr(9)+c);}
ผล
(http://img2.f0nt.com/22/6413f6ac99f1f216adf8c1d6528852f5.png)
:41:
:31:
// เรื่องโหลดข้อมูลจากภายนอก ยังคิดไม่ออกว่าจะทำตัวอย่างกับประยุกต์ใช้ยังไง ให้ง่ายๆและดูรู้เรื่อง ติดไว้ก่อนครับ
//เบิ้ลล่ะ
เอาเรื่องนี้ละกัน เป็นปัญหาที่เคยเจอมา (เรื่องของเรื่องเพราะด้วยความขี้เกียจน่ะแหล่ะ)
มีงานนึงมีหลายหน้ามาก ประมาณ 10 กว่าหน้าหลักๆ คุยไปคุยมาก็สรุป
เป็น html และใช้แฟลชเป็นหัวเพจกับ nav' bar ใช้มันทุกๆหน้าตามสูตร แก้ไขง่าย
ที่หัวแฟลชก็มีลูกเล่นนิดหน่อย ภาพวิ่งๆ เฟดอิน เฟดเอ้าท์ ง่ายๆ 1 ชุด
สรุปเสร็จสิ้น ส่งงาน ผ่านเรียบร้อย :40:
แต่ว่า ่ลูกค้าอยากเพิ่มอะไรนิดๆหน่อยๆ เพิ่มหน้าอีก 3-4 หน้า :37:
และอยากเพิ่ม ว่า ทุกๆหน้า ให้หัวแฟลชเปลี่ยนภาพตามหน้านั้นๆ
:38: :07: :07: :07: "เฮ้ย แล้วไม่บอกตั้งแต่แรก(วะ) งี้แก้หัวแตกเลยนะ(เว้ย)"
"เพิ่มให้หน่อยครับ ไม่งั้นไม่จ่ายครับ"
"ได้ครับ จะจัดให้ครับ" :08:
ตามนั้น
ก็เลยเอามาคิดว่า เอออ ถ้าตูไล่ทำใหม่ให้ครบทุกหน้าเนี่ย มันชักไม่คุ้มราคาแล้วนะ :39:
ถึกทำแฟลชให้ครบทุกหน้า :28: :28: :28: ไม่ไหวๆๆๆๆๆ
ตอนนั้นคิดออกอย่างเดียวว่า
- ต้องโหลดภาพเข้ามา โดยใช้ loadMovie()
- หัวแฟลชอยู่ html หน้าไหน ให้โหลดภาพหรือ swf หน้าที่เตรียมไว้ขึ้นมา ยังยืนยันว่าใช้หัวแฟลชอันเดียวแล้วทำสคริปเช็คหน้าเอา
- แต่จะทำยังไง้ให้หัวแฟลชมันรู้ว่าอยู่ html หน้าไหนแล้ว มันจะได้โหลด ภาพหรือ swf มาได้ถูกต้อง
http://img2.f0nt.com/flash/e45c8fe220ac8c9d03d267973fc7d7e8.swf
ไปสืบค้นข้อมูลเพิ่มเติมได้ว่า ต้องให้ html เป็นตัวบอก
วิธีให้ html ส่งค่าอะไรสักอย่างให้แฟลชเราต้องใช้ไอ้นี่ครับ (จริงๆมี 2-3 แบบ แต่แนะนำอันนี้ครับ)
Flashvarsดูจาก help ในแฟลชเองก็มีบอกวิธีใช้ครับ ง่ายๆ
เมื่อเราเอาแฟลชไปวางบน html เราก็ใช้โค้ดประมาณนี้ครับ
อ้างอิง
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="-http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="myflashvars" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="myflashvars.swf" />
<param name="FlashVars" value="myURL=http://weblogs.adobe.com/">
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" /> //ส่วนนี้คือพื้นหลังแฟลชในส่วนของ html ถ้าไม่ใส่รู้สึกว่าจะเป็นสีขาวอัตโนมัติ
<embed src="myflashvars.swf" FlashVars="myURL=http://weblogs.adobe.com/" quality="high" bgcolor="#ffffff" width="550" height="400" name="myflashvars" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="-http://www.adobe.com/go/getflashplayer" />
</object>
เราเพียงเพิ่ม พารามิเตอร์ FlashVars เข้าไปเท่านั้นเอง ง่ายไหมจ๊ะ
<param name="FlashVars" value="จะส่งค่าอะไรให้แฟลชก็เชิญเลย">และ ตรงส่วน <embed .... ก็
FlashVars="จะส่งค่าอะไรให้แฟลชก็เชิญเลย"จากงานนั้น เราจะบ่งบอกว่าตอนนี้อยู่หน้าไหนใช่มิ
เราก็ใส่ส่งค่าบอกเพจให้แฟลชแบบง่ายๆล่ะ
อ้างอิง
หน้า home.html ผมเพิ่มเข้าไป
<param name="FlashVars" value="page=home">
<embed...... FlashVars="page=home" .........</embed>
หน้า news.html ผมเพิ่มเข้าไป
<param name="FlashVars" value="page=news">
<embed...... FlashVars="page=news" .........</embed>
หน้า about.html ผมเพิ่มเข้าไป
<param name="FlashVars" value="page=about">
<embed...... FlashVars="page=about" .........</embed>
.
.
.
ในที่นี้ ทุกๆหน้า html ผมจะส่งตัวแปร page ให้กับแฟลชครับ และตัวแปร page นั้นก็จะมีค่าที่บ่งบอกว่าอยู่หน้าไหนแล้วครับ
แล้วแฟลชจะเรียกค่านี้มาใช้ได้อย่างไร ก็ซื่อๆทื่อๆเลยครับ
อ้างอิง_root.page :31:
ลองใช้ดูครับ เราก็เอามาเช็คค่าว่า ถ้า page เท่ากับหน้าไหนๆ ให้โหลดหน้านั้นๆ
if(_root.page=="home"){
_mc.loadMovie("home.swf")
}else if(_root.page=="news"){
_mc.loadMovie("news.swf")
} // bla bla bla
จริงๆใช้ switch() ครับ เขียนสั้นกว่าหน่อยนึง
การทำงานจริง พอเราเปิด html หน้าไหนๆก็ตาม
ในหัวแฟลชนั้นก็จะคอยเช็คว่า ตัวแปร page ที่ html ส่งค่ามาคือหน้าไหน
ถ้าส่ง page = home เราก็ให้ _mc.loadMovie("home.swf")
ถ้าส่ง page = news เราก็ให้ _mc.loadMovie("news.swf")
.
.
ประมาณนั้นครับ
พอเข้าใจไหมครับ ไม่งงนะ ต้องลองครับ แล้วจะเห็นชัดเจนกว่านี้
=============================================
=============================================
ทีนี้มีของแถม
ด้วยความมั่วอยากทดลองส่งค่าแบบ php แต่อยู่ในหน้า html
คือจะส่งที่ลิ้งค์เลย >>
<a href="home.html?page=home">home</a>
<a href="news.html?page=news">home</a>
.
.
คือขี้เกียจเปลี่ยนนามสกุลเป็น php น่ะแค่นั้น (จริงๆอยากลองมากกว่า)
เพื่อ get ค่า $page ที่ส่งไปกับ URL แล้วไปใส่ให้ flashvars
แบบนี้
อ้างอิง
หน้า html ทุกๆหน้าเราจะเพิ่มแค่นี้เท่านั้น เป็นไดนามิคเลย
<param name="FlashVars" value="page=<? echo $page; ?>">
<embed...... FlashVars="page=<? echo $page; ?>" .........</embed>
เราสามารถใช้โค้ด php ในหน้า html ได้ครับด้วยการใช้ .htaccess กำกับเข้าไปว่า (จริงๆมี 2-3 แบบนะแต่ใช้อันนี้อยู่)
.htaccess คืออะไร อ่านดูครับ (http://www.widebase.net/knowledge/itterm/it_term_desc.php?term_id=htaccess&term_group=H) (ลองอ่านดูแล้ว..... :44: ยังงงๆอยู่เหมือนเดิม :30: )
อ้างอิง
RemoveHandler .html .htm
AddType application/x-httpd-php .php .php4 .htm .html
เท่านี้เราก็จะ php in html สบายๆครับ
(บอกตรงๆ ก้อปมาลุ่นๆครับ htaccess เนี่ย ลองไปงมๆดูแล้ว งงพอสมควร เลย บาย ก้อปเอาดีกว่า :30: )
โอสสส :07: :25: :25: :25: :25:
โอ้ว :07:+
(เอ๊ะ เหมือนสมัยก่อนเคยทำแล้วทำไม่ได้แฮะ แต่นานมาแล้วนะครับ)
จ๊าก
สุดดดดดยอดดดดด
มาเรื่องโหลด swf จากภายนอกกันจากงานที่แล้วได้กล่าวถึง loadMovie()
อ้างอิงLoads a SWF, JPEG, GIF, or PNG file into a movie clip in Flash Player
วิธีใช้ก็
- สร้าง mc มาหนึ่งตัวชื่อ _mc ให้จุด center อยู่ที่มุมซ้ายบน หรือ x 0 y 0 เพราะตอนโหลดเข้ามาจะอ้างอิงที่ 0,0
หากเราสร้าง mc ไว้ตรงกลาง โหลดอะไรเข้ามาก็แล้วแต่ จะอิง 0,0 ของ mc นั้นๆ
งงมะ ผมยังงงเลย :41: ลองแล้วจะรู้ครับ
อ้างอิงWhen a SWF file is loaded into a target movie clip, you can use the target path of that movie clip to target the loaded SWF file. A SWF file or image loaded into a target inherits the position, rotation, and scale properties of the targeted movie clip. The upper left corner of the loaded image or SWF file aligns with the registration point of the targeted movie clip. Alternatively, if the target is the root Timeline, the upper left corner of the image or SWF file aligns with the upper left corner of the Stage.
สคริปง่ายๆโดย
อ้างอิง_mc.loadMovie("load-file.swf");
หรือ
_mc.loadMovie("image/f0nt.jpg");
หรือ
loadMovie("load-file.swf", _mc);
ครับ แค่นั้นครับ จบ ............แต่มันมีอะไรๆจุกจิกนิดหน่อย
ผมลองโหลดงานเก่าๆที่ทำไว้
_http://img2.f0nt.com/flash/37bd9e7b95aeace1e22066fa77ac3e76.swf
http://img2.f0nt.com/flash/37bd9e7b95aeace1e22066fa77ac3e76.swf
ลองดูครับ
http://img2.f0nt.com/flash/88d2ffec66eb41e6af896d6737a1ac90.swf
อ๊ะๆๆ เห็นอะไรแล้วไช่ไหมครับ
อ่านตามช้าๆ อธิบายแล้วงงใช้ได้ :37:
นั่นคือ โหลดมาที่ mc1 มันไม่ยอมวิ่ง
เพราะ ในไฟล์เก่าบอลวิ่งๆนั่น มีสคริปอ้างอิง _root ตัวเองอยู่ด้วย หากเล่นเดี่ยวๆมันก็อ้างอิงกับ _root ตัวเองได้
ทีนี้ Main-mc ที่สั่งโหลด มันเป็น _root หลักอยู่แล้ว เมื่อโหลด ไฟล์บอลวิ่งๆเข้ามา ตัวมันอ้างอิง _root ของตัวเองไม่ได้
เพราะมาอยู่ที่ _root ของ Main-mc เลยอ้างอิงอะไรไม่ได้
เลยต้อง lockroot ของ ไฟล์บอลวิ่ง เมื่อโหลดเข้ามายัง _root ของ Main-mc ปั๊ป ก็สั่ง lockroot ทันที
เพื่อให้มันล็อค _root ตัวเองไว้ด้วย จะได้อ้างอิงกับ _root ตัวเอง ไม่ต้องอิงกับ _root ของ Main-mc
โอ๊ยยย งงไหม :08: ค่อยๆอ่านนะ
// ใครมาอธิบายเรื่อง _root ทีครับ ผมอธิบายไม่ถูกน่ะ เอาแบบละเอียดยิบๆเลย เกรงว่าเขียนแล้วจะงงกันไปใหญ่
สรุปง่ายๆ หากโหลด swf จากภายนอกเข้ามา ถ้า swf ตัวนั้นมีการอ้างอิง _root ในตัวมันเอง
เมื่อโหลด swf นั้นๆมาแล้วให้ lockroot=true ไว้ด้วย
วิธีเขียนง่ายๆเลย โหลดปั๊ป ก็เขียนต่อท้ายบรรทัดเลยครับ
ตกม้าตายบ่อยๆ ก็เพราะ _lockroot นี่ล่ะ :08:
อ้างอิง
mc2.loadMovie("xxx.swf");
mc2._lockroot = true;
หรือ
loadMovie("xxx.swf",mc2);
mc2._lockroot = true;
หากจะให้มีการ เช็คตอน load ว่าโหลดเสร็จหรือยัง ตอนโหลดให้ทำอะไร ฯลฯ
ให้ลองศึกษาเรื่อง MovieClipLoader(); ดูครับมีประโยชน์ครับ(มาก)
แต่ปกติไม่ค่อยได้ใช้ เพราะถ้าโหลด swf นอกเข้ามา ผมจะมี preLoad ไว้ทุกไฟล์งานอยู่แล้วครับ
คราวหน้าจะแจก preLoad ง่ายๆ เป็น preLoad ที่ผมทำเก็บไว้ใช้เอง ใช้ง่าย ขำๆ
:07:
_lockroot = true; เหรอ :07:
อันนี้แหละที่แก้ปัญหาที่ผมงงมาตลอดเจ็ดสิบปี +10 :07:
:31: ผมด้วย ลืมทุกครั้งที่ทำเหมือนกัน :08:
หาแทบตายว่าเป็นที่อะไร ทำไมมันไม่วิ่งฟะ :41:
เหมือนจะเคยเจอปัญหาที่ว่า
เอ๊ะ หรือไม่เคย จำไม่ได้ เคยทำ as จริงจังแค่ครั้งเดียวเอง :08:
Preload มันมีไว้ทำไม ....สมัยก่อน ตอนเน็ทยังไม่เร็ว.....(ยังกะเดี๋ยวนี้เร็ว :08: )
เวลาเปิดเว็บแฟลชทีนึง นานเป็นชาติ ไม่เคยรู้เลยว่ามันจะมาหรือไม่มา ต้องปิดมันไป เพราะขี้เกียจรอ
ไม่รู้ต้องรออีกนานแค่ไหน ....ไม่รออ่ะ ดูเว็บอื่นดีกว่า
เพราะเว็บนั้นๆมันไม่มี Preload บอก ว่า "โหลดอยู่นะ" "โหลดถึงเท่านี้แล้วนะ" "รอแป๊ะนุง เดี๋ยวก็เสร็จ"
เราทำงานนึง โหลดดู เออ เร็วดี คงไม่ต้องใส่ Preload ให้เมื่อยตุ้ม
แต่ว่า เน็ทแต่ละคนก็เร็วไม่เท่ากัน เราโหลดเร็ว คนอื่นอาจโหลดเป็นชาติ แล้วเขาก็ไม่รอในที่สุด
มันจะมีไว้บอกคนใจร้อน ว่าถึงไหนๆแล้ว รอหน่อยนะ อะไรประมาณนี้ จะได้รู้ว่าควรจะรอ หรือควรจะปิด
ส่วนมากงานแฟลชที่เราๆทำกันนั้นมันมักจะอวดโฉมอยู่บนเว็บซะส่วนใหญ่
การที่เราจะรู้ หรือบ่งบอกว่างานตัวเองนั้น โหลดมาถึงไหนๆ เราจะใช้
อ้างอิง
getBytesLoaded()
getBytesTotal()
ใช้ควบคู่กันไปเพื่อเปรียบเทียบ ว่า โหลดมาแล้วเท่าไร ( getBytesLoaded() ) รวมเท่าไร ( getBytesTotal() )
ตัวอย่างเช่น
อ้างอิง
n=Math.round(_root.getBytesLoaded()/_root.getBytesTotal()*100);
:03: มีอย่างอื่นมาเกี่ยวด้วยรึ ไอ้ Math.round() นี่มันอะไรฟะ แล้วทำไมต้องเอามาหารแล้วคูณให้ยุ่งยาก
getBytesLoaded() และ
getBytesTotal() จะดึงค่ามาเป็น
byte ในส่วนโค้ดตัวอย่างนั้น เราจะทำให้เป็น เปอเซ็นต์ 0-100% ก็เอาค่าน้อยกับค่าที่สุดมาหารกัน แล้วคูณร้อย เท่านั้น
แต่มันจะมีทศนิยมด้วย
เราจึงใช้ Math.round() มาปัดเศษทศนิยมซะ จะได้ดูสวยงาม :22:
เมื่อใช้งานจริง เราจะต้องแสดงค่าแบบเรียลไทม์ และดึงทั้งไฟลงาน เราก็ใช้ _root.getBytesTotal() _root.getBytesLoaded()
เราก็เอามันมาใส่ใน onEnterFrame ซะ
ก็จะได้
อ้างอิง
stop()
_root.onEnterFrame = function() {
n = Math.round(_root.getBytesLoaded()/_root.getBytesTotal()*100);
txt = n+" %"
if(n>=100){
delete _root.onEnterFrame
nextFrame()
}
}
เราหยุดไว้ที่เฟรมแรกด้วย stop() เพื่อให้มันเช็ค load ก่อน
ว่าเราโหลดมาเท่าไรแล้ว และ ไฟลรวมเท่าไร
ในที่นี้ n ก็จะมีค่า 0-100 แสดงที่ txt เป็นเปอเซ็นต์
เราก็สั่งมันไว้ด้วยว่า
เฮ้ย ถ้า n มันมากกว่าหรือเท่ากับ 100 (เปอเซ็นต์)
ลบ _root.onEnterFrame ด้วยเพราะไม่ต้องใช้การตรวจจับแล้ว
และก็ให้ไปเฟรมถัดไปนะ และทำอะไรก็ว่าไป
ไม่งงนะจ๊ะ :22:
=========================================
=========================================
ทดสอบ preLoadส่วนวิธีทดสอบว่างานเราโหลดเร็วไหม ใหญ่ไปไหม สมควรค่าแก่การขึ้นเว็บไหม (ใหญ่ไปไม่มีคนรอหรอกครับ หากไม่เจ๋งพอ)
ในแฟลชเพลเยอร์เองนั้นมีตัว Simulate Downloaded หรือการจำลองแบนต์วิธ เป็นเท่าไรก็ได้
เช่น
เราจะสมมุติว่า
ถ้าใช้เน็ท 56k โหลดงานเรา ในอัตราดาวโหลดอืดๆ 5-8 KB/s แล้วจะเป็นอย่างไร อะไรเทือกนั้น
เราจะทดสอบได้โดย ตรงนี้
(http://img2.f0nt.com/02/66bc29083c8c36a19ad44d4b4e3b4fca.jpg)
และในส่วน
Customize... นั้นเองเราสามารถตั้งค่าต่างๆได้เองตามอำเภอใจครับ
การเทสงานปรกติเราจะกด Ctrl+Enter
ถ้าเราจะทำการทดสอบ Simulate Downloaded
เราก็แค่ กด Ctrl+Enter ซ้ำอีกครั้ง จะเป็นการ Simulate แล้วครับ
และถ้า
ไฟลเล็กๆ มันก็มองไม่ค่อยทันนักนะครับ ลองคิดตามหลักควา่มจริงด้วยครับ
ทีนี้ มาดูอันที่ผมจะแจกกัน :22:
Preload แบบง่ายๆ แจกเลยละกัน :22:
จริงๆกะวางยาไว้นิดหน่อย :39: แล้วให้ไปแก้โค้ดกันเอง (เป็นการฝึกไปในตัว จะได้ไม่เอาแต่ดูดไม่รู้เรื่อง) :22:
แต่ว่า :27: เอาเหอะ แจกก็แจก โค้ดง่ายๆ
(http://img2.f0nt.com/02/d8b3706ff550c86cc558af6a63a800d0.jpg) :22: ง่ายๆ เห่ยๆ แต่ใช้ได้จริง
ก็จะมี เปอเซ็นต์ มีบาร์บอก มีกิโลไบต์รวม ก็ลองเอาไปแก้ไขกันเองครับ
วิธีใช้ครับ
ตัว preload ที่แนบมานี้ เป็น เทมเพลทง่ายๆ ที่สามารถก๊อป แล้ววางใช้ได้เลย
โดย
(http://img2.f0nt.com/02/49010e6804fc7328db4528cd87009187.jpg)
เปิดไฟลงาน คลิกขวาที่เฟรมแรก แล้ว copy frame
แล้วไปวางที่เฟรมแรกของงานท่านได้เลย :22: ง่ายเนอะ
แล้วจะแก้ไข สวยงาม แก้สี แก้นู่แก้นี่ ก็แก้ได้เลยครับ ผมจะกรุ๊ปไว้ ให้เคลื่อนย้ายง่ายๆครับ
และก็ไฟลที่แนบมานี้ read only ครับ เผื่อไว้
ลองทดสอบดูครับ
อย่าลืมว่า ไฟลงานต้องใหญ่นิดนึงนะครับ ถึงจะเห็นชัดเจน
ลองเอารูปใหญ่ๆ มาวางที่เฟรมสอง แล้วลอง กด Ctrl+Enter ซ้ำ ให้มัน Simulate ดูครับ
สุดยอดคำถามของชาว flash มือใหม่ตลอดกาล
ทำ preload ยังไงอ่ะพี่ :30:
เจ๋ง :12: ขอบคุณคร้าบบบ
ปล. ขอถึงติดต่อ database เลยนะครับ
:07c: ตามหาตัว preload สำเร็จรูปมาทั่ว สุดท้ายมาเจอในเว็บนี้ โกรธตัวเองจังเลย :07c:
ขอบคุณอย่างสูงครับ :05: :46:
:30:
ประทานโทษนะครับ คือผมเพิ่งมาติดตามกระจู๋นี้ และลองทำตามไปหลายต่อหลายอันแล้ว ผมมาแปลกใจตรงไอ้สูตรคูณอ่ะครับ เพราะเวลาที่ผม
กำหนดตัวชนิดตัวลงไปด้วยเนี้ยมันไม่ออก เช่น for (var i:Number=1; i<=12; i++) พอให้มัน trace มันไม่ออกตามที่เราต้องการ พอทำหลายๆ ครั้งเข้าความงุนงงเริ่มทวีคูณเลยลอกผลงานของรุ่นพี่ซะเลย แต่ก็ยังไม่ได้ ทำตามที่บอกแบบเนียนๆเลย
สุดท้ายเลยลองเอา " :Number " ออกพอรันปุ้บ สูตรคูณแม่สองออกมาให้ยลโฉมเลยครับ ยังไงแนะนำทีน่ะครับ จะติดตามไปเรื่อยๆ ถ้ากระจู๋ ยังมีต่อไปเรื่อยๆ ติดตามผลงานอยู่นะครับบ :45: :45:
น่าจะต้องประกาศตัวแปรก่อนเข้าคำสั่งมั้งครับ
:06:ตัวข้าพยายามแล้วอ่ะขอรับที่จะประกาศตัวแปรไว้ด้านนอกก่อนจะเข้ามาทำอะไรต่อมิอะไรกัน มันก็หาได้ไม่
กำลังพยายามต่ออีกซักหน่อย ว่าแต่ว่า ท่านอาจารย์ ทั้งหลายหายหน้าหายตากันไปไหนเสียหมด เป็นตายร้ายดีเยี่ยงบ้างก็มิรู้ได้ :46:
ช่วงนี้ ท่านอาจารย์คงจะยังไม่ว่างดอกขอรับท่านขุน ได้โปรดรอสักเพลาเถิดขอรับ
ช่วงนี้ไม่ค่อยว่าง แต่แว๊บๆมาดูตลอดครับ :12:
ติดตรงไหน เอาสคริปมาโพสถามได้เลยครับ ที่นี่มีคนเก่งกว่าผมมากมายที่พร้อมจะตอบครับ
*** ไม่ต้องอายสคริปตัวเอง ผมก็เคยเป็นนะแรกๆ :08:
แบบประมาณว่า สคริปตูไม่เจ๋ง ไม่ตรงคอนเส็ป OOP ไม่ห่า... ไม่เหว.... กลัวว่าเขียนห่วยแล้วยังเอามาโพสอีก
เลยต้องงม หาเองจนมั่วไปหมดเสียทั้งเวลา ทั้งอารมณ์ พาลจะเลิกทำซะ :07:
ไม่เอาสคริปทั้งหมดมาดู บางครั้งบอกไม่ได้ครับว่าติดที่ไหน :39:
หลังๆผมไม่เคยอายสคริปห่วยๆของผมเลย เพราะผมไม่ได้เรียนมา ผิดหลักถูกหลัก ผมก็ไม่รู้หรอก
เอามาโพสนี่ล่ะ เดี๋ยวก็จะมาช่วยแนะแนวเองล่ะครับ ผมยืนยัน
แต่ต้องลองหาทางด้วยตัวเองถึงที่สุดก่อนนะครับ อันนี้สำคัญ :37:
ไม่งั้นก็ต้องป้อนข้าวให้วันยันค่ำ สู้ฝึกหุงข้าวกินเองดีกว่าครับ :40:
แนวคิดนี้น่าบูชามากครับ :12:
แอนนนนน ลอง AC3.0 หรือยัง มาสอนมั่งสิ งงชิบเป๋งเลย :41:
:41: 2.0 ผมยังไปไม่เป็นเลยคร้าบ ไม่งั้นไม่มานั่งเรียนหร๊อก
มาสอนจรเข้ว่ายน้ำกันดีกว่า ช่วงนี้ไม่ว่างมาเขียนเลย :05:
lmc_tweenอันนี้เอามาจากคุณ heart จู๋ที่ถามกันเรื่อง scrollbar
ทำไว้เจ๋งมากๆเลย มีตัวอย่างง่ายๆ พร้อมสคริปเสร็จสรรพ ขอบคุณย้อนหลังอีกครั้ง (อย่างแรงๆ) :12:
อ้างคำพูดจาก: heart เมื่อ 02 ส.ค. 2007, 12:06 น.
ทำมาให้ลองเล่น
อันนี้ไม่ครบทุกคำสั่งนะ
แค่ตัวอย่าง
http://img2.f0nt.com/flash/5890a6c366fed66b86a76fb26d247384.swf
วิธีใช้ แค่ไปโหลด ที่ http://laco.wz.cz/tween/?page=download (http://laco.wz.cz/tween/?page=download) แล้วติดตั้ง ..... เสร็จ
เริ่มเลยครับ (แค่ขยายความ แล้วให้ไปลองเองนะครับ)
เราต้องดึงคลาสมันเข้ามาฝังไว้ที่งานเราก่อนครับ
ใส่ที่เฟรมแรก #include "lmc_tween.as" ** อันนี้สำคัญจำให้แม่นๆนะ
เป็นอันเสร็จ ลองสร้าง MC ขึ้นมาตัวนึง แล้วลองก๊อปสคริปตัวอย่างของคุณ heart ไปลองเล่นดูครับ
หรือลองสคริปอย่างง่ายโคตรๆ :22:
อ้างอิง
mc.tween("_x",200,3); // คือให้ mc ไปที่ตำแหน่ง x 200 ตั้งแต่ต้นจบใช้เวลา 3 วินาที
หรือแบบแรนดอมง่ายๆก็
อ้างอิง
rn = random(400)+100;
mc.tween("_x",rn,3); // คือให้ mc ไปที่ตำแหน่ง rn ตั้งแต่ต้นจบใช้เวลา 3 วินาที
ยังมีรายละเอียดยิบย่อยอีกหลากหลาย ดูที่สคริปตัวอย่างของคุณ heart ครับ มีการเคลื่อนที่หลายแบบ
และ การตรวจจับ event แบบประมาณว่า
"เมื่อ tween เริ่ม จะให้ทำ....."
"เมื่อ tween หยุด จะให้ทำ....." ใช้แบบนี้ครับ
อ้างอิง
ตรวจจับตอน tween หยุด
$tweenManager.broadcastEvents = true; // ตัวนี้สำคัญ
my_obj = {};
my_obj.onTweenEnd = function() {
// จะทำอะไรก็ว่าไป
};
mc.addListener(my_obj);
ตรวจจับตอน tween เริ่ม
my_obj2 = {};
my_obj2.onTweenStart = function() {
// จะทำอะไรก็ว่าไป
};
mc.addListener(my_obj2);
ลองเอาไปประยุกต์ใช้นะครับ ( :17: ขายผ้าเอาหน้ารอดไปวันๆ)
เยี่ยมไปเลยครับน้า :12:
สำคัญคือมันอยู่ที่การประยุคต์นี่แหละเนอะ
หายไปนาน มาไถ่โทษ อ่ะเลยทำเกมส์เล่นๆ
"เพราะ เต่า พาจน"
ไม่ค่อยถนัดทำเกมส์ อืม มันจุกจิกใช้ได้เลย :08: เดี๋ยวเจอนู้นเจอนี้ สคริปเลยยุ่งเหยิงนิดหน่อย
อย่าหวังว่าจะเลิศหรู ลองเล่นดูแล้วจะรู้ว่า ...... :08:
//แก้ช่องเงินให้กว้างขึ้นแล้ว
http://img2.f0nt.com/flash/29540847054d7972e5b9195fa886eacd.swf
ใครอยากเอาไปทำต่อ หรืออยากศึกษา สคริปธรรมดาๆ ไม่เทพ มาโพสขอสคริปได้เลย เอาไปทั้ง .fla เลย
เผื่อใครจะเอาไปทำต่อ แบบมี save โดยใช้ Share Object (รับรองโดนคนแถวนี้แฮกกระจุย :21: )
แต่เลือกคนที่จะให้นิดหน่อยครับ ไม่งกครับ แต่อยากให้คนที่ตั้งใจที่จะศึกษาจริงๆ
สคริปไม่หวือหวา ธรรมดานี่ล่ะครับ
ผมเขียนเป็นสคริปง่ายๆ ที่อยู่ระหว่างรอยต่อ ของ คนเพิ่งหัด กับ คนที่เป็นแล้วในระดับนึง
ตอนที่เขียนไม่ค่อยเป็นผมเจอแต่สคริปเทพๆ ซึ่งเอามาเรียนรู้ไม่ไหว มันยาก แน่นอนมันถูกหลัก
แต่มันไม่รู้เรื่องว่ะ เลยพอเข้าใจคนเพิ่งหัดครับ (จริงๆเขียนได้แค่นี้แหล่ะี้ :30: พล่ามให้ดูดี)
งานนี้แนวคิดง่ายๆคือ
- เลือกจำนวน เลือกเบอร์ที่จะทาย แล้วหมุน
- แรนด้อมหมุนเต๋า ได้เลขอะไร เอามาเทียบกับที่เราเลือก
- ระหว่างหมุนก็ซ่อนปุ่มซะ กันกดซ้ำ
- เมื่อเทียบ ได้ยังไงแบบไหน แล้วก็แสดงผล หักลบ-บวกเพิ่ม อะไรก็ว่าไป
- เมื่อหมดตูด ก็แสดงผล ปุ่ม play again แล้วก็เริ่มใหม่
ไว้จะมาชำแหล่ะสคริปให้ดูครับ ว่าอันไหนทำยังไง (ถ้ามีคนอยากให้ชำแหล่ะ)
ใครรวย เซฟภาพมาชื่นชมหน่อยครับ :07: ห้ามโกง (เล่นเองไม่เคยเกินหมื่นสองเลย :08: )
อย่าลืมช่วยค้นหาแมลงด้วยครับ ขอบคุณครับ
:25:
ลงทีละ 2000 ถูกทีสองงวดติด
เลยได้เป็นหมื่นเลยครับ
แต่มันมีเลขแค่ 4 หลักง่ะ :07:
(http://img2.f0nt.com/21/1644ffa02258bd72b7ea01badda24807.png)
:05: :05:
สุดยอดเลยครับ เรื่อง mc tween นี่ทำให้งานง่ายขึ้นเยอะเลย
ชื่อมันพิกลๆ
ผมลง 2000 ได้คืน 4000 ด้วยแหละ :27:
เพราะเอ็ง นังเต่า :07:
เออ :08: ทำไมเลขมันไม่ชิดขวาฟะ เพราะเต่าแท้ๆ :22:
งานนี้ใช้ lmc_tween script แค่สองอัน
- อันแรก ใช้ tao.frameTo() วิ่งไปเฟรมที่แรนดอมออกมา
- อันสองใช้ แรนดอม tao.rotateTo() หมุนๆ
และตรวจจับ ตอนหยุด ด้วย onTweenEnd
พอหยุดก็เปรียบเทียบ รันฟังชั่นต่างๆ แล้ว เริ่มใหม่
ง่ายๆครับ
เค้าว่ากันว่า ตัวนี้ดีกว่า lmc_Tween ฮะ
http://blog.greensock.com/tweenliteas2
ผมก็ยังไมไ่ด้ลองเลย แต่ลองดูจากที่ เค้าทดสอบให้ดูมันไม่หน่วงจริง ๆ :45:
ขอบคุณครับ เดี๋ยวขอแวะชมก่อน :25:+
โอ๊ะ มันมีของ 2.0 ด้วยรึ นึกว่า 3.0 อย่างเดียว :12:
แต่อ่านแล้วโค้ดมันยากกว่ากันหน่อยนึงง่ะ :30:
ด้วยความมักง่ายเลยขอใช้ของ MC Tween ไปก่อนครับ
จนกว่าจะมีคนใ้กันเยอะๆ จะได้ลองเปลี่ยนดู
จากเกมส์คลิกนรก II ที่ล่อ Tab กันซะ คนทำหมดกำลังใจ :30:
ลองไปหามาเจอแล้ว :31:
โคตรโบราณเลยผม มันมีคำสั่งนี้มาตั้งชาตินึงแล้วแต่ไม่เคยรู้เลย :31:
อ้างอิง
_focusrect = false;
เป็น Property แบบ Global คือใช้รวมกันทั้งหมด ไม่ต้องมี Object หรือ mc มารองรับ
ถ้าเป็น false มันจะสั่งให้ไม่มีกรอบเหลืองๆ คือกด tab แล้วไม่มีการโฟกัสใดๆเกิดขึ้น
คำสั่งจะมีผลต่อเมื่อแสดงบน browser เท่านั้น
นับเป็นคำสั่งที่สำคัญสำหรับเกมส์ที่ใช้เม้าส์เป็นตัวเล่น กันการโกงกระจุย :35:
ว่าไปเกมส์ดังหลายๆเกมส์ก็ยังมีลืมที่จุดนี้เลย :37:
ปกติแล้ว default จะสั่งเป็น true ไว้
อันนี้สั่งแล้ว ลองดูครับ
http://img2.f0nt.com/flash/e14783489920120274560296d3ef916c.swf
:05:
ต๊าย ชั้นเกลียดแก :07:
flash มีคำสั่งนี้ด้วยครับพี่น้อง
yoyo();
:25:
มีปัญหานิดนึงครับ :05:
คือผมลองโหลดตัวพรีโหลดไปลองดู มันดันขึ้น Unexpected file format
ไม่ทราบว่าเป็นที่อะไรครับ ช่วยชี้แนะด้วย
ว่าจะลองใช้พรีโหลดซะหน่อย สงสัยมานาน
อ้อ ผมใช้ flash 8 นะครับ
ปล. เป็นบทความที่เยี่ยมมากครับ ให้กำลังใจครับ
อ้างคำพูดจาก: คุณเต่า เมื่อ 25 ก.พ. 2008, 12:21 น.
flash มีคำสั่งนี้ด้วยครับพี่น้อง
yoyo();
:25:
ใช้ทำการอันใดครับ ? :25:
อ้างคำพูดจาก: =[-L-]= เมื่อ 25 ก.พ. 2008, 15:15 น.
มีปัญหานิดนึงครับ :05:
คือผมลองโหลดตัวพรีโหลดไปลองดู มันดันขึ้น Unexpected file format
ไม่ทราบว่าเป็นที่อะไรครับ ช่วยชี้แนะด้วย
ว่าจะลองใช้พรีโหลดซะหน่อย สงสัยมานาน
อ้อ ผมใช้ flash 8 นะครับ
ปล. เป็นบทความที่เยี่ยมมากครับ ให้กำลังใจครับ
ดัวนู้นเป็น Flash CS3 Format ครับ ต้องเปิดด้วย Flash CS3 ครับ
เดี๋ยวจะทำ Format Flash8 มาให้นะครับ
//อ่ะ ทำมาแล้วครับ วิธีใช้ก็ Preload มันมีไว้ทำไม .... (http://www.f0nt.com/forum/index.php/topic,11542.msg775342.html#msg775342)
อ้างคำพูดจาก: lnwส์ เมื่อ 25 ก.พ. 2008, 15:53 น.
ใช้ทำการอันใดครับ ? :25:
ลองไปค้นมา น่ารักดี :30:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/transitions/Tween.html#yoyo() (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/transitions/Tween.html#yoyo())
เหมือนสั่งให้ทำงาน พอสุดแล้วเด้งย้อนกลับมั้งครับ :25:
http://img2.f0nt.com/flash/d04465af6d13bc14050e79579ecc942d.swf
โอ้ว ขอบคุณมากครับ :33:
กำลังงมอยู่... :01:
ใช้ AS 3.0 ไม่เป็น :05:
เผอิญเพื่อนมาถามให้ช่วยเขียนโค้ดให้ประมาณนี้
เลยทำมาประมาณนี้ ให้เพื่อนไป
http://img2.f0nt.com/flash/35c1e83bb880ee4b42a56f24a111e9bd.swf
ส่วนข้างล่างนี่ คือโค้ดที่ใช้ทั้งหมดครับ
mcRotate.onPress = function(){
startrotate = 1;
}
mcRotate.onRelease = mcRotate.onRollOut = mcRotate.onReleaseOutside = function(){
startrotate = 0;
}
mcRotate.onEnterFrame = function(){
if(startrotate == 1){
xVal = this._x - _xmouse;
yVal = _ymouse -this._y;
rotate =(Math.atan2(xVal, yVal)-1.5) * 60;
rotate = rotate % 360;
if(rotate < 0){
rotate += 360;
}
if((rotate >0 && rotate<180)){
mcRotate._rotation = rotate;
}
}else{
if(mcRotate._rotation > 0){
mcRotate._rotation -=2;
}
}
}
ตัวนี้ เพื่อนบอกมาว่า จะให้หมุนได้แค่ 180 องศาบน พอปล่อยเมาท์ ก็ให้มันหมุนกลับมาน่ะครับ
ซึ่งตัวนี้ ที่ผมใช้หลักๆ คือ ช่วงที่กด กับช่วงที่ปล่อย
แล้วก็ใช้ onEnterFrame ในการให้มันทำ animation ตลอดเวลาที่แสดงผลอยู่
แล้วก็
xVal = this._x - _xmouse;
yVal = _ymouse -this._y;
rotate =(Math.atan2(xVal, yVal)-1.5) * 60;
rotate = rotate % 360;
if(rotate < 0){
rotate += 360;
}
เป็นโค้ดที่ทำให้เราหาได้ว่า ตอนนี้ เม้าท์เรา ทำองศาเท่าไร กับตัว movie clip นั้นอยู่
หลักๆ ก็ประมาณนี้น่ะครับ
ปล. อาจจะมีโค้ดที่ง่ายกว่านี้นะครับในการหาองศา แต่เนื่องจากไม่มีเวลา เลยต้องมานั่งบู้ + มั่วเอาจนได้มา
เยี่ยมครับ
แต่น่าจะใช้วิธี พอปล่อยปุ่ม ลบเอนเตอร์เฟรมเลย
แล้วเอาค่าสุดท้ายให้ lmc_tween เป็นตัวส่งกลับ (หมุนกัลบไปตำแหน่งเดิม)
เดี๋ยวทำมาแบบง่ายๆ พอเป็นแนวทางอีกแบบครับ
แป๊ปนึง
อ่อ ครับผม ขอบคุณครับ ลืมคิดไปเลย เรื่องลบ enterFrame
ความจริง ยังมีอีกหลายตัว ที่ได้เขียนเอาไว้
ไว้จะเอามาให้พี่ดูอีกทีครับ เพื่องานหน้า จะได้ทำให้ดีขึ้น :52:
ตอนนี้แค่ปั่นงาน ก็หมดเวลาไปหลายละ ไม่กล้าแก้ เดี๋ยวไม่ทันส่ง :41:
แบบนี้ก็เยี่ยมแล้วครับ มาช่วยกันโพสนะครับ เอากรณีใช้จริงนี่ล่ะ เจ๋งนักแล
เป็นแนวทางอีกแบบครับ อันนี้ไม่เหมือนกันนะครับ ไม่ได้กั้นไว้ 180 องศา
หมุนรอบ แล้ววิ่งกลับ เวลาวิ่งกลับมันจะเลือกทางที่ใกล้ที่สุด :22: เอาไว้ ประยุกต์ต่อ (ไปลองงมกันดู)
http://img2.f0nt.com/flash/38bc5da94243ec0b7957c00b3982d7d3.swf
อ้างอิง
stop();
#include "lmc_tween.as"
chk = new Boolean(false);
_mc.onPress = function() {
chk = true;
rotate_me();
};
_mc.onRelease= _mc.onReleaseOutside =function(){;
chk=false;
rotate_me();
_mc.tween("_rotation",0,2);
};
function rotate_me() {
if (_root.chk) {
_mc.onEnterFrame = function() {
rdn = Math.atan2((_root._ymouse-_root._mc._y), (_root._xmouse-_root._mc._x)); //บรรทัดนี้ หาค่าตำแหน่งค่ามุมเม้าส์
_root._mc._rotation = rdn*180/Math.PI+180; //แปลงเป็นองศา ส่งกลับไปหมุน
};
} else {
delete _mc.onEnterFrame;
}
}
// อย่าหวังว่าผมจะคิดสูตรเองนะครับ :22: เอามาจากหนังสือน่ะ คิดสูตรแบบนี้ คิดเองคิดทั้งปีก็ไม่ออก :30:
แจกด้วยจ้า เอาไปเลย เป็น FL8 แล้ว
อุอุ ดูดๆ อย่างเดียวครับ แซบหลาย :04:
อ่ะ เต็มที่เลยครับพี่น้อง :39:
จากโค้ดด้านบน ที่ดึงค่า radian ของเม้าส์ เอามาแปลงเป็นองศา แล้วหมุน
อ้างอิง
rdn = Math.atan2((_root._ymouse-_root._mc._y), (_root._xmouse-_root._mc._x)); //บรรทัดนี้ หาค่าตำแหน่งค่ามุมเม้าส์
_root._mc._rotation = rdn*180/Math.PI+180; //แปลงเป็นองศา ส่งกลับไปหมุน
ตัวอย่างการประยุกต์
เอาง่ายๆเลยอันนี้
คลิก แล้วตามมานะ หันหน้ามาด้วย :22:
http://img2.f0nt.com/flash/63362828c0f6815a422cc53105cbb074.swf
อ้างอิง
stop();
#include "lmc_tween.as"
n=1
var someListener:Object = new Object();
someListener.onMouseDown = function () {
rdn = Math.atan2((_root._ymouse-_root._mc._y), (_root._xmouse-_root._mc._x));
_mc.tween("_rotation",rdn*180/Math.PI+90,0.5) //***
_mc.tween("_y",_ymouse,3)
_mc.tween("_x",_xmouse,3)
point()
};
Mouse.addListener(someListener);
function point(){
pt._x = _xmouse
pt._y = _ymouse
pt.gotoAndPlay(1)
}
ส่วนสีแดงนั่น ให้ดูจุด pivot เริ่มต้น ของ mc ครับ หาก ตั้งตรงก็ 90 หันซ้ายก็ 180
ลองทำดูนะครับ
ไม่แจกครับ :37:
อ่ะล้อเล่น :21:
:14: เป๋แล้ว นี่ไม่อนุบาลแล้วนะครับ
:05: ขอโต๊ดดด
แก้ตัวงานหน้านะ :05:
:46: ขอบคุณมากค่ะ มีอะไรสนุกๆมาให้ศึกษาตลอดเลย :40:
:25: +
เจ๋งครับป๋า
สวัสดีครับ หลังจากไล่อ่านกระทู้นี้มาตั้งหลายวัน :05:
ได้ความรู้เพิ่มอีกหลายอย่างเลยเกี่ยวกับการเขียน AS
ตัวผมเองก็พอจะเคยเขียนมาบ้างแต่ก็ไ่ม่ได้เก่งเท่าไหร่
ขอบคุณ คุณน๊าแอ๊ดที่ตั้งใจเขียนบทเรียนดีๆ แบบนี้ให้ชาวฟอนต์ได้อ่านกันนะครับ :12:
จะติดตามต่อไป ถ้าเกิดมีอะไรที่พอจะทราบจะขออนุญาติร่วมด้วยคนนะครับ
ฝากเนื้อฝากตัวด้วยครับผม :42:
:30: น้าแอ๊ด
:22: แฮ่ๆ
ผมทำอะไรผิดไปรึเปล่า :16:
:46:กราบงามๆ ตรงหว่างอกแม่ยกซักที :02: มิได้เข้ามาไม่นาน วิทยาของท่านอาจารย์มากมายเสียจิง ข้าคงต้องขอเวลาย้อนหลังและเก็บเกี่ยวซักชั่วครู่ชั่วยามดอก จึงจะตามเด็กนักเีรียนคนอื่นเขาทัน :26:
เยี่ยมครับ
รู้สึกจะไม่ใช่อนุบาลแระจริงๆด้วย :08:
ข้ามขั้นไปมัธยมเลย
as3
เวลาผมคลิกที่ button
ผมหาที่ใส่ getURL ไม่เจอครับมันไม่ให้ใส่ :05:
as3
รู้สึกว่าจะใส่ script ที่ปุ่มไม่ได้แล้วนะครับ
ต้องประกาศจากเฟรมเลย
.
.
.
.
หรือว่าได้ ชักไม่มั่นใจ :37:
อ้างคำพูดจาก: nng เมื่อ 29 ก.พ. 2008, 18:24 น.
as3
รู้สึกว่าจะใส่ script ที่ปุ่มไม่ได้แล้วนะครับ
ต้องประกาศจากเฟรมเลย
.
.
.
.
หรือว่าได้ ชักไม่มั่นใจ :37:
มายก๊อด :07b:
ทำไมมันยากอย่างงี้
ใส่ที่ปุ่มมันหนักครับ
การอ้างถึงตัวแปรก็ไม่สากลโลก
จึงเปลี่ยนมาประกาศเป็น function กันให้หมดทั้งมวล
อ้างคำพูดจาก: คุณเต่า เมื่อ 29 ก.พ. 2008, 23:47 น.
ใส่ที่ปุ่มมันหนักครับ
การอ้างถึงตัวแปรก็ไม่สากลโลก
จึงเปลี่ยนมาประกาศเป็น function กันให้หมดทั้งมวล
AS3.0 ผมไม่กระดิกเลย ถามเซียนเต่าแน่นอนกว่าครับ
ช่วงนี้ห้อง flash เงียบจังเรย คุณน๊าแอ๊ด หายไปไหนแล้วครับ ^^
คิดไม่ออกจริงๆว่าจะเขียนอะไรครับ
และหลังจากนี้จะพยายามเน้นที่การนำไปใช้ครับ
เดี๋ยวมาเรื่อง KEY basic ครับ ยังไม่ได้เขียน ( ลืม :03: )
อยากให้เขียนเรื่องอะไรก็ลองขอมาได้นะครับ (ถ้าพอทำเป็น ถ้าไม่เป็นก็จะลองดูครับ)
เอาเรื่องง่ายๆหน่อยนะครับ เน้นที่อนุบาลนะครับ ถ้าระดับมัธยมผมยังมั่วๆไม่ค่อยได้เรื่องครับ
ตรงไหนงง ตรงไหนติด ตรงไหนไม่รู้เรื่อง โพสขึ้นจู๋ใหม่ถามมาได้ครับ
มันคืออะไรอ้ะ ไม่เคยได้ยินมาก่อน :44:
พวก ....
กดขึ้น ลง ซ้าย ขวา อะไรทำนองนี้มั้งครับ
เยส รออยู่นะคร้าบบ :25:
ความรู้เต็มไปหมดเลยเก็บไม่ทันแล้ว :28:
Key : เช็คการกดปุ่มบนคีย์บอรด และ
Listener Event แบบมั่วสุดๆ
KEY บอกตามตรงว่าไม่ค่อยได้ใช้ครับ :31: เพราะงานส่วนมากไม่ค่อยมี ...ไม่เคยได้งานน่ะแหล่ะ :05:
เลยเอาตัวอย่างจาก Help ครับ และจะเอามาเพิ่มเติมประยุกต์นิดๆหน่อยๆ
โดยหลักๆ มีแค่ สอง event คือ
กด และ
ปล่อย ... ฮะๆ ง่าย :42:
และโดยพิมพ์นิยม เราจะใช้
Listener event มาตรวจจับ
ใครก็ได้ มาอธิบาย Listener ทีครับ ผมยังให้คำจำกัดความของคำสั่งนี้ไม่ได้เลย ( คือไม่รู้น่ะแหล่ะ)
รู้แต่ว่า เป็นการตรวจเช็ค เท่าที่เดาๆได้ คือ มันจะทำงานต่อเมื่อมีำ event นั้นเกิดขึ้น
ผมไม่อายเลยที่จะบอกว่า งานนี้ผมเดา 100% ออกจะมั่วด้วยเพราะไม่ค่อยเข้าใจเท่าไรจะอธิบายแบบมวยวัดและเท่าที่ผมรู้นะครับ หากผิดพลาดช่วยออกมาชี้แจงกันหน่อยนะครับ จักเป็นพระคุณยิ่ง
Using event listeners
Event listeners let an object, called a listener object, receive events broadcast by another object, called a broadcaster object.
The broadcaster object registers the listener object to receive events generated by the broadcaster. For example, you can
register a movie clip object to receive onResize notifications from the Stage, or a button instance could receive onChanged
notifications from a text field object. You can register multiple listener objects to receive events from a single broadcaster,
and you can register a single listener object to receive events from multiple broadcasters.
The listener-broadcaster model for events, unlike event handler methods, lets you have multiple pieces of code listen to the
same event without conflict. Event models that do not use the listener/broadcaster model, such as XML.onLoad(), can be
problematic when various pieces of code are listening to the same event; the different pieces of code have conflicts over
control of that single XML.onLoad callback function reference. With the listener/broadcaster model, you can easily
add listeners to the same event without worrying about code bottlenecks.
ในแฟลชหากเราจะตรวจจับอะไรสักอย่างแบบ
ตลอดเวลา เรามักใช้ EnterFrame กันใช่ไหมครับ นั่นคือการทำงานทุกๆเฟรม
แต่ Listener จะเป็นการทำงานต่อเมื่อ event เกิดขึ้น จะแบบว่า
เมื่อ Object ใดๆที่เราสร้าง Listener ตรวจจับไว้ มีการทำงานตาม Event ที่เราตรวจจับไว้
ไม่ว่าที่ไหน เมื่อไร หาก Object นั้นๆยังอยู่ และยังไม่ลบ Listener event นั้นๆออก
มันก็จะเรียก ฟังชั่นที่เราแหมะไว้กับ Listener Event นั้นๆให้ทำงาน
โอ๊ยยย งง ไหม งงสิ ผมยังงงเลย ดูตัวอย่างละกัน :07:
อ้างอิง
var keyListener:Object = new Object(); //สร้าง Listener Object มารองรับ
keyListener.onKeyDown = function() { //ใส่ Function เข้าไปใน Event อันนี้คือ กดปุ่มใดๆปั๊ปฟังชั่นนี้ทำงาน และเอามันใส่ไปใน Object "keyListener"
txt1 = Key.getCode(); // จะให้ทำอะไรก็ว่าไป
txt2 = Key.getAscii(); // จะให้ทำอะไรก็ว่าไป
}; //จบฟังชั่น
Key.addListener(keyListener); // ยัดมันเข้าไปใน Key คือสั่งตรวจจับการกดปุ่มไว้ใน Key นั้นๆ
ฮะๆ ไม่รู้เรื่องเลย :08: อธิบายไม่ถูกแฮะ
จากตัวอย่างสคริปข้างบน พล่ามออกมาได้ว่า ...สมมุตินะ
- keyListener เป็น ยาชนิดหนึ่งที่มีความสามารถ onKeyDown ติดตัวอยู่ และยังลอยอยู่ในอากาศ
และพร้อมจะฉีดให้ใครก็ใด้่ ใครโดนฉีดก็จะมีความสามารถแบบนี้ได้เลย
- กรณีนี้ เราจะเอาความสามารถของ function มันมาให้ปุ่มบนคีย์บอรด
- เราก็เลยจับ keyListener ยัดใส่เข็มฉีดยา ฉีดใส่ KEY ต่างๆบนคีย์บอรด (KEY ครอบคลุมหมดทุกปุ่ม)
- ทีนี้ ปุ่มบนคีย์บอรดก็ใด้ยาชนิดนี้มาเป็นพลังพิเศษ คือมีการตรวจ onKeyDown ได้เลย
คล้ายๆสร้างการตรวจจับไว้ทุกๆปุ่ม แต่
่จะมีการตรวจจับจริงๆเมื่อมี Event onKeyDown เกิดขึ้น (อันนี้ล่ะครับผมเดามั่วสุดๆ)
โอ๊ยยย ยิ่งอธิบาย ยิ่งบ้า :08:
สคริปตัวอย่างข้างบน เป็นสคริปที่เช็ด code กับ ascii บนปุ่มแบง่ายๆ
โดย (รวบรัดล่ะนะ)
เมื่อ Key ใดๆบนคีย์บอรด มีการกดปุ่ม
ให้ดึง key code ของปุ่มนั้นๆแสดงผลที่ txt1 โดยคำสั่ง getCode()
และให้ดึงรหัส ASCII code ของปุ่มนั้นๆแสดงผลที่ txt2 โดยคำสั่ง getAscii()
อ้างอิงgetCode (Key.getCode method)
public static getCode() : Number
Returns the key code value of the last key pressed.
Note: The Flash Lite implementation of this method returns a string or a number, depending on the key code passed in by the platform. The only valid key codes are the standard key codes accepted by this class and the special key codes listed as properties of the ExtendedKey class.
A Flash application can only monitor keyboard events that occur within its focus. A Flash application cannot detect keyboard events in another application.
getAscii (Key.getAscii method)
public static getAscii() : Number
Returns the ASCII code of the last key pressed or released. The ASCII values returned are English keyboard values. For example, if you press Shift+2, Key.getAscii() returns @ on a Japanese keyboard, which is the same as it does on an English keyboard.
A Flash application can only monitor keyboard events that occur within its focus. A Flash application cannot detect keyboard events in another application.
ตัวอย่างจ๊ะ หากปุ่มใดๆมี shortcut ต่างๆ หรือเป็นคีย์เฉพาะ มันก็ไม่ขึ้นโค้ดนะครับ
เพราะคำสั่งหลักมาก่อนแฟลช(รึเปล่า) เช่นกด PrtSc วินโด่ ก็จะสั่ง printscreen ก่อนครับ (ประมาณนั้น ... วุ๊ย ไม่รู้เรื่องไรสักอย่างเลยตู)
แต่หากเรารู้โค้ดปุ่มนั้นๆ ในส่วนแฟลชเองก็เช็คใด้ครับ มันทำงานครับ ( เดานะคร้าบบบบ )
http://img2.f0nt.com/flash/5157263579bf043a8950a596257b2c8b.swf
งานนี้มั่วกันเช็ดเม็ดเลย :08: ผิดพลาดประการใด น้อมรับผิดอย่างแรงๆครับ :46:
ถ้าไม่เข้าใจอย่างไรก็ลองๆอ่านใน Help และลองจากตัวอย่างนะครับ
เดี๋ยวงานหน้ามา กดๆ ปล่อยๆ กันครับ วันนี้แค่นี้ก่อนนะครับ ไอ้นี้ใช้พลังงานในความเข้าใจเยอะมากเลย :05:
ผมหามานานแล้วครับ ขอบคุณมากครับพี่ ผมใช้แบบจำรหัสปุ่มแล้วไปสั่งเลย เขียนโค้ด get ออกมาไม่เป็น
ถ้าได้นี่ไป ผมจิ้มปุ่มไหนก็รุ้เลยนะซิครับว่าปุ่มไหนรหัสว่าไง แจ่มจริงๆ
ว่าแต่ว่า โน๊ตบุ๊คมันมีรหัสปุ่มไม่เหมือนกันใช่มั้ยครับ อันนี้ไม่รุ้เลย
:31: ไม่เหมือนจริงรึ อันนี้ไม่รู้เลยครับ
อ้างคำพูดจาก: Layiji เมื่อ 29 ก.พ. 2008, 17:19 น.
as3
เวลาผมคลิกที่ button
ผมหาที่ใส่ getURL ไม่เจอครับมันไม่ให้ใส่ :05:
ช้าไปหรือเปล่าครับ เหอๆ
ใช้ navigateToURL แทน getURL ครับ
button.addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void{
navigateToURL(new URLRequest("http://www.f0nt.com"), "_self");
}
พี่ก่อออออ :25: :27:
ขอบคุณเรื่อง Key ครับน้าแอ๊ด+
สงสัยว่าอธิบายรอบเดียวจะไม่เข้าใจแน่ๆ เพราะยิ่งอ่านยิ่งงง :30:
ถ้าเป็นไปได้ช่วยสอนแบบมีเวิร์กช็อปประกอบจะเป็นการรบกวนไปไหมครับ :46:
เห็นกระทู้นี้เงียบเหงามานาน ก็ปั่นซะหน่อยละกัน :21:
มาดูการทำกระดานวาดรูป**อันนี้ผมเปิดจากหนังสือมานะครับ
คำสั่งหลักๆที่เกี่ยวกับการสร้างเส้น มันจะมี
lineStyle(lineWidth,lineColor,lineAlpha);
ซึ่งจะเป็นตัวกำหนดรูปแบบ และลักษณะของเส้นที่เราจะวาดไป
moveTo(startX,startY);
จะเป็นฟังก์ชั่นเพื่อกำหนดว่า เส้นนั้น จะถูกเริ่มต้นจากตรงไหน
lineTo(lastX,lastY);
หรือ
lineTo(curveX,curveY,lastX,lastY);
จะเป็นตัวบอกว่าเส้นที่จะลากต่อไป นั้นจะไปยังจุดไหน
และถ้าเราใส่ curveX curveY เข้าไป จะทำให้เส้นนั้น โค้งเข้าหาจุด {curveX,curveY} นั้นด้วย
clear();
จะเป็นการลบรูปต่างๆ ที่เราวาดลงไปให้มันหายไป
ตอนนี้ เมื่อเราเข้าใจคำสั่งคร่าวๆแล้ว ก็มาดูตัวอย่างเลย
http://img2.f0nt.com/flash/22d80bc704b7fdf033cfeb58695847b8.swf
อ้างอิง
_root.onMouseDown = function(){
_root.clear(); // เมื่อมีการเริ่มวาดเส้นใหม่ ก็จะทำการลบรูปเก่าทิ้งไป
isDrawing = true; //เป็นตัวเพื่อไปกำหนดใน onMouseMove ว่าจะให้เกิดเส้นขึ้นมาหรือไม่
_root.lineStyle(1,0xaaff00,100);// เส้นขนาด 1 px สีเขียวอ่อน ไม่โปร่งใส
_root.moveTo(_root._xmouse,_root._ymouse);// กำหนดจุดเริ่มต้น ไปยังพิดกัดปัจจุบันของเม้าท์
}
_root.onMouseMove = function(){
if(isDrawing){
//_root.lineStyle(1,0xaaff00,100);// สามารถแทรก lineStyle ตรงนี้ได้ ถ้าต้องการเปลี่ยนขนาดเส้น สี หรือ ความโปร่งใส
_root.lineTo(_root._xmouse,_root._ymouse);// ลากจากจุดล่าสุดไปยังพิกัดใหม่
updateAfterEvent();// สร้างภาพขึ้นใน Stage ทันที
}
}
_root.onMouseUp = function(){
isDrawing = false;//กำหนดเพื่อไม่ให้ทำงานในฟังก์ชั่น onMouseMove
}
ซึ่งถ้าไม่ต้องการให้เวลาปล่อยเม้าท์ แล้วจะกดต่อ ก็ให้เอา _root.clear() ออกไป ก็จะสามารถวาดต่อเนื่องได้เรื่อยๆ
(ค่อยเอาสคริปนี้ไปแทรกในปุ่มกดก็ได้ แล้วแต่ต้องการ)
ยังไง ถ้าต้องการลองเขียน หรือเอาไปประยุกต์
ก็ลองเอาวิธีการเชกการกดปุ่มของพี่หนึ่ง(ejsing)
มาเพิ่มทำเป็น short key เพื่อเพิ่มขนาดเส้น หรือเปลี่ยนสีก็ได้ครับ
(คำแนะนำเล็กๆน้อยๆ**
ค่าที่จะใส่ใน lineStyle ควรจะเป็นตัวแปร เพื่อง่ายต่อการเขียนโค้ดให้มันเปลี่ยนแปลงได้ง่ายๆ
แล้วเวลากดปุ่มต่างๆ ก็ให้มันเปลี่ยนค่าในตัวแปรเท่านั้นเป็นพอ)
ตัวอย่างงานประยุกต์
http://img2.f0nt.com/flash/09c58c49fe9385aeb0d218b527848e47.swf
ใครว่างๆ ก็ลองทำดูนะครับ
ปล. ยังไง ช่วงหลังสงกราน เดี๋ยวเอาโค้ดตัวนี้ขึ้นให้อีกทีนึง ตอนนี้กั๊กไว้ก่อน
ปล. 7= เส้นสีดำ ,8= เส้นสีขาวนะครับ :52:
:25: โอ้วสุดยอด+
สุดๆ :25: +
:25: :12:
สุดๆครับ
:52: มีคนเข้ามาดูด้วยแฮะ
แต่เขียนคำอธิบายสลับกันยังไม่มีคนทักเลย :07:
แต่ไม่เป็นไร เอาโค้ดไปดูแล้วถ้าสงสัยก็ถามมาละกันครับ
อ้าว เหรอครับ เม้มมั่วนี่หว่า :17:
เปล่าหรอกครับ มาดูแค่คอนเสปต์ ก็รุ้แล้วว่ามันสุดยอดเก็บไว้เป็นเสบียง ตอนที่ ต้องการใช้จะได้มาอ่านอีกทีไงครับ ฮ่า :25:
ว่าแล้วก็บวกอีกรอบ
อ้อ ถึงว่าสิแปลกๆ (ทำเนียน :17a:)
อันนี้เอาพวกคำสั่งวาดเส้นมาลองทำอะไรแปลกๆได้หลายอย่างเหมือนกัน
http://img2.f0nt.com/flash/86d3ec91fa83f186f2cdee1c119062fe.swf
http://img2.f0nt.com/flash/9af6bc246a895a9798851dc1a97a0b21.swf
http://img2.f0nt.com/flash/2af848af2f1136e963d56a312f2c725c.swf
แต่ทำงานปกติ คงไม่ค่อยได้ใช้มันเท่าไร :42:
โว้ว โว้ว ฮะ โฮ่ วะ วะ วะวะวะวะวะวะว้าวววววววววววววววววววว ว้ายยย กรี๊ดดดดดดดดด โว้ววววย ว.....
โอ้ว สุดปรี๊ด :07c:
อ้าว มัวแต่ตะลึง เลยลืมถามเลยครับ ว่า นี่ ใช้ as 3 หรือ 2 ครับเนี่ย
ใช้แค่ 2 ครับ
3 ยังเขียนไม่เป็น :41:
+เต็มๆ :25: :25:
อยากจะบอกว่า มันบังเอิญนะครับนั่น :52:
ที่ทำ Drawing pad 1 กับ 2 ออกมาได้เพราะความบังเอิญล้วนๆ
(เพราะต้องการทำแบบ4.3 นั่นแล)
ไว้เดี๋ยวจะอธิบาย การทำ drawing pad 1 กับ 2 ให้ครับ
โค้ดยาวประมาณ 50 บรรทัดเท่านั้น เผื่อใครจะเอาไปอแด๊ปกับงานอื่น
แบบ 4.3 เหมือนว่าไม่ต้อง drag นะครับ แค่ลากผ่านก็เป็นแล้ว
แต่ชอบ 4.3 สุดๆ ครับ :25:
ทำยังไงถึงจะได้โปรแกรมเขียนฟอร์ทค่ะ
สาวกใหม่ค่ะ อยากเขียนฟอร์ทเป็นจังเลย :33:
มันเป็นโปรแกรมใหม่เหรอครับ เจ้า ฟอร์ท เนี่ย เหมือนกับ flex มั้ยอ่ะ
:14: สุดยอดๆๆๆ แตะเปลี่ยนให้ poloh สอนต่อเลยละกัน ผมหมดแล้ว (ฝีมือ :05: และเวลา)
:07: อย่าเพิ่งครับพี่ จะรีบเปลี่ยนไปไหน
ผมเอง หมดอันนี้ ก็หมดมุขแล้ว :31:
เบิ้ลเลยละกัน
อันนี้โค้ดของตัว
drawing pad1หลักคร่าวๆ ที่ผมทำก็คือเกี่ยวกับการเคลื่อนไหวของเม้าท์
ยิ่งจังหวะนั้น เคลื่อนไหวเร็ว ตัว clip นั้น ก็จะเคลื่อนที่เร็วขึ้นด้วย
ก็เลยต้องมีตัวแปรที่ชื่อว่า oldX , oldY , newX , newY
เพื่อเก็บค่าของตัวแปรเหล่านั้่นว่า แต่ก่อนกับ ปัจจุบัน เม้าท์ของเราอยู่ระยะห่างกันเท่าไร
(เพื่อใช้ในการคำนวณความเร็วของการเคลื่อนที่ของเม้าท์)
ซึ่งเวลาที่จะเกิดพวกนี้ จะขึ้นตาม frame rate ของที่เราสร้างไว้
(หมายถึงในโค้ดที่ผมเขียนนะ)
เพื่อให้แต่ละตัวมีการเคลื่อนไหวของตัวมันเอง
ผมก็เลยสร้าง movie clip ให้มัน แล้วก็เซตค่าพวก speed เก็บไว้ที่ตัวมันเอง
(จะเห็นว่ามีตัวแปรที่ชื่อ obj อยู่ ตัวแปรนี้จะเพิ่มค่าไปเรื่อยๆ
เพื่อไม่ให้ชื่อตัวแปร หรือ movieClip มันซ้ำกัน)
คำสั่งวาดรูปงานนี้ จะเห็นว่า ผมเขียนเส้นใส่ตัว movieClip ที่ผมสร้างมาใหม่เลย
ดังนั้นเวลาย้ายตัว movie เส้นก็จะย้ายไปด้วย
---------------------------------------------------------------------------------
เพิ่มเติม เมื่อกี้ลืมอธิบาย :42:
ตัว mc.counter จะ เป็นตัวนับเรื่อยๆว่า ตัวนี้วิ่งครบ 100 frame หรือยัง ถ้าครบแล้วจะลบตัวเองออก
เพราะถ้ามี movie clip มากๆแล้วนั้น มันจะกระตุก
อ้างอิง
obj = 0;
_root.onMouseDown = function(){
counter = 3;
isDrawing = true;
newx = _root._xmouse;
newy = _root._ymouse;
}
_root.onMouseMove = function(){
if(isDrawing == true){
oldx = newx;
newx = _root._xmouse;
oldy = newy;
newy = _root._ymouse;
obj++;
counter += 0.1;
if(counter > 10){
counter = 0
}
_root.createEmptyMovieClip("line"+obj,obj);
size = Math.abs(counter-5);
var myMc:MovieClip = eval("line"+obj);
eval("line"+obj).lineStyle(size,0xaaff00,100);
eval("line"+obj).moveTo(oldx,oldy)
eval("line"+obj).lineTo(newx,newy);
eval("line"+obj).endFill();
eval("line"+obj).speedx = newx - oldx;
eval("line"+obj).speedy = newy - oldy;
eval("line"+obj).counter = 0;
eval("line"+obj).onEnterFrame = function(){
this.counter++;
this._x += this.speedx;
this._y += this.speedy;
if(this.counter > 100){
delete this.onEnterFrame;
removeMovieClip(this);
}
}
myMc.useHandCursor;
updateAfterEvent();
}
}
_root.onMouseUp = function(){
isDrawing = false;
}
ปล. drawing pad2 จะเป็นการกลับค่าของ speedX กับ speedY เท่านั้นเองแล :52:
โอ้ว ไว้จะบวกให้ ตอนนี้บวกยังไม่ได้ :08:
ทำไมต้อง updateAfterEvent(); ครับ ใส่กับไม่ใส่ต่างกันตรงไหนครับ
ชงกันเองนี่ล่ะ :30: (ขอคำตอบแบบแจ่มๆหน่อยนะครับ เอาแบบเข้าใจง่ายๆ)
เอาอย่างนั้นเลยนะครับพี่ :44:
updateAfterEvent(); ถ้าดูจากความหมายของมันที่เป็นภาษาอังกฤษแล้ว
จะหมายความว่า ให้อัพเดท หลังจากที่เหตุการณ์นี้เสร็จสิ้น
คือ ให้โปรแกรมมันประมวลภาพออกมาหลังจากที่ทำโค้ดข้างบนเสร็จเนี่ยแหละครับ
เพื่อความรวดเร็วและทันใจ
ปล. ผมเป็น โปรแกรมมั่วนะครับ อะไรมาก็มั่วไว้ก่อน :52:
:49: อันนี้ อธิบายจากความเชื่อของผมล้วนๆ อาจจะไม่จริงก็ได้นะครับ
เริ่มเข้าสู่ดาวนาเม็กกันแล้วนี่ :07:
ยังไม่ถึงดาวนาแม๊กหรอกครับ
อันนี้ แค่เอาอนุบาล หลายๆอย่างมาประกอบกันเท่านั้นเอง :52:
ที่ไม่เข้าใจ เป็นเพราะว่า ผมอธิบายไม่ดีพอมากกว่า :42:
(เพราะอันนี้ เขียนคอมเม้นอธิบายไม่มีเลย (อธิบายแนวคิดซะมากกว่า))
poloh ครับ ฝากเรื่อง อาเรย์ ด้วยนะครับ :04: ยังไม่ได้เขียนเลย ผมอธิบายไม่เก่ง :52:
ขอบคุณมากเลยครับ
ได้เวลาฝึกอีกรอบละ :45:
เจ๋งดีค่ะ ชอบๆ + :25:
script พวกนี้สนุกดีจัง แต่ตอนนี้ก็คงเหมือนมาดาวนาเม็กแบบพี่แอนฮ่าๆ อ่านตรงนั้นไม่รู้เรื่องเลย แต่ชอบดู
มีอะไรใหม่ๆมาให้เล่นอีกนะคะ ติดตามๆ :45:
นึกถึงจู๋นี้เลยค่ะ :25:
http://www.f0nt.com/forum/index.php/topic,7961.0.html
http://www.f0nt.com/forum/index.php/topic,8070.0.html
ดีใจที่หลายคนชอบมันนะครับ :40:
(ผมชอบ อันที่ 1 ที่สุดละ)
:08:ส่วนเรื่อง อธิบายหลักการนี่ ผมไม่ค่อยแม่นเท่าไรนะครับ
เอาตามที่ผมเข้าใจ แล้วใช้งานมันแทนได้หรือเปล่า??
ว่าแต่ พี่ ej_sing ตัว array จะเอา workshop อะไรดีครับพี่ ??
คิดไม่ออก :31:
:: อธิบายคร่าวๆก่อนละกัน
array นั้น จะเป็น ตัวแปรประเภทหนึ่ง ที่สามารถเก็บตัวแปรได้หลายค่าไว้ในตัวมันเอง
โดยจะมีอันดับแยกไปในตัวแปรแต่ละค่า และจะมีหลายฟังก์ชั่นที่สามารถเอามาใช้งานได้กับตัวแปรประเภทนี้
ไว้เดี๋ยวมีตัวอย่าง น่าจะเข้าใจได้ง่ายขึ้นนะครับ
รบกวนหน่อยค่ะ คือกำลังทดลองคำสั่ง removeMovieClip()ค่ะ
ตอนแรกสั่งให้ duplicateMovieClip ขึ้นมาเลยเมื่อเล่น
แล้วพอกดปุ่ม _btnRE
MC ที่สร้างขึ้นใหม่ก็หายไป
ตรงนี้ตรงตามที่ต้องการแล้วค่ะ
แต่พอ duplicateMovieClip โดยใช้ปุ่ม _btnADD
แล้วกด _btnRE ไม่สามารถลบได้
(ได้ลองเอาคำสั่ง "ตอนแรกสั่งให้ duplicateMovieClip ขึ้นมาเลยเมื่อเล่น"
ออกไปแล้ว แล้วให้ duplicateMovieClip โดยใช้ปุ่ม _btnADD อย่างเดียว
ก็ลบไม่ได้อยู่ดี)
งง งง งง
รบกวนช่วยชี้แนะด้วยค่ะ
duplicateMovieClip(_mc, "_mcNew", this.getNextHighestDepth());
_mcNew._x = 50; // เรียกชื่อให้ถูกว่าตัวไหนเป็นตัวไหน
_mcNew._y = 200; //
_btnRE.onRelease = function(){
removeMovieClip(_mcNew)
txt ="Remove!!!!"
}
_btnADD.onRelease = function(){
duplicateMovieClip(_mc,"_mcNew", this.getNextHighestDepth());
_mcNew._x = 50; // เรียกชื่อให้ถูกว่าตัวไหนเป็นตัวไหน
_mcNew._y = 200; //
txt =""
}
เท่าที่เอาโค้ดมาลองทดสอบดู ก็ขึ้นนิครับ :09:
ยังไง ลองเซฟ แล้วปิดโปรแกรม แล้วเปิดมาลองใหม่ดู
ถ้าไม่ได้ก็หาทางส่งไฟล์ .fla มาให้ดูหน่อยก็ดีครับ จะได้ลองหาทางแก้ดู
ปล. ถ้าว่าง มาช่วยกันอธิบายเนื้อหา flash action script ด้วยนะครับ :25:
:46:
ขอบคุณค่ะที่ช่วยดูให้
คือลองปิดแล้วเปิดใหม่ดูแล้วก็ยังไม่ได้ค่ะ
พอกดปุ่ม _btnADD ให้ duplicateMovieClip ใหม่
แล้วกด _btnRE ก็ลบไม่ได้
:05:
//(//)
:09: :09: :09:
ที่จะทำ คือแบบนี้หรือเปล่าครับ ??
http://img2.f0nt.com/flash/96e24237e68d60f8ba1cf5b204936052.swf
ก็ก๊อปโค้ดมแปะ แล้วเขียนตัวแปรตามล้วนๆเลยนะครับ
--- ผมใช้ flash cs3 เขียน as 2.0 นะครับ ไม่รู้เกี่ยวไหม
//http://D:\Kwantrai\Flash%20animation\Training\ActionScript\removeMovieClip2.swf
ใช้ flash CS2 ค่ะ
ไม่รู้ว่าเกี่ยวรึเปล่า :16:
ขอโทษค่ะบอกผิดไป
ใช้ flash 8 ค่ะ
//http://D:\Kwantrai\Flash%20animation\Training\ActionScript\removeMovieClip2.exe
อ้างคำพูดจาก: มือใหม่ เมื่อ 26 เม.ย. 2008, 10:07 น.
[flash=200,200]http://D:\Kwantrai\Flash animation\Training\ActionScript\removeMovieClip2.swf[/flash]
ใช้ flash CS2 ค่ะ
ไม่รู้ว่าเกี่ยวรึเปล่า :16:
เอ่อ แทรกแฟลชแบบนั้นไม่ได้นะครับ ไม่มีใครเห็นหรอกครับ :44:
อืม... ถ้ายังไงลองส่งไฟล์ให้ผมมาทาง email ก็ได้ครับ
น่าจะช่วยกันดูได้ง่ายกว่า :31:
------------------------------------------------------------------------------------------
เข้าสู่เรื่อง Array array นั้นส่วนใหญ่ที่ผมใช้ จะใช้เพื่อเก็บข้อมูลที่เป็นชุดคล้ายๆกัน
เพื่อนำมาแสดงผลได้ง่าย ต่อการใช้พวก loop ต่างๆ
เช่น ถ้าผมจะทำพวก link banner ให้แสดงต่อลงมาเรื่อยๆ อะไรทำนองนั้น
เช่น
http://img2.f0nt.com/flash/eae5cec5e6f8d69528cd072c1ed0b7a7.swf
อันนี้ผมใช้แค่ array 1 ตัว
แล้วเก็บค่า
"http://www.f0nt.com"
"http://www.thaiflashdev.com"
"http://www.itemstudio.org"
ตามลำดับ
ซึ่งเวลาจะอ้างถึงค่าต่างๆในตัวแปร array นั้น ก็จะเรียกโดย
link[i] // สมมุติให้ link เป็นตัวแปรประเภท array ของข้างบน และ ค่า i แสดงถึง ตำแหน่งที่ต้องการดึงค่าออกมาเช่นถ้าเราเรียก
link[0] ก็จะมีค่าเท่ากับ "http://www.f0nt.com" นั่นเอง
** อันนี้ มี 3 ตัว ก็จะมีตำแหน่งเป็น 0 , 1 ,2 ตามลำดับ
อ้างอิง
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org"];
trace(link[0]);
trace(link[1]);
trace(link[2]);
หรือ
อ้างอิง
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org"];
for(i=0;i<3;i++){
trace(link);
}
การใช้ ตัวแปรประเภท array ยังมีข้อดีอีกอย่างนึง คือเราไม่จำเป็นต้องหาความยาวของ array เพราะมันจะมี property ให้เราใช้คือ
link.length
อ้างอิง
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org"];
trace(link.length);
for(i=0;i<link.length;i++){
trace(link);
}
พักเหนื่อยกันก่อน แล้วเดี๋ยวมาต่อกัน :52:
โอ้ว ขอบคุณครับ
โอ้ว ขอบคุณอีกทีหลังโรลแบ็กครับ
เยี่ยมเลยครับ :12:
ขอบคุณนะครับ ที่เข้ามาอ่านกัน
ถ้างงตรงไหน บอกให้ผมรู้ด้วยนะครับ
จะได้พัฒนาวิธีการเขียนด้วย :53:
จากโค้ดข้างบน ผมได้ใช้ array เพื่อเก็บค่า url แล้วก็นำมาแสดงเป็นชื่อ กับ ลิ้ง
แล้วถ้าต้องการให้ชื่อที่แสดง ไม่ใช่ลิ้งที่เป็น http://www.?????~ อะไรพวกนี้ล่ะ จะทำยังไง
ใครว่างๆ คิดออก แล้วลองทำดูก็ได้ครับ
ไว้พรุ่งนี้จะมาอธิบายวิธีทำวิธีนึงให้ดู
(มันทำได้หลายวิธีนะครับ
ได้ผลลัพธ์ออกมาตามที่ต้องการได้ก็โอเคละ :52:
อย่าไปซีเรียสกับวิธีการทำ)
ปล. ขออภัยที่ทิ้งช่วงไปนานด้วยนะครับ เผอิญป่วย + งานเข้าเล็กน้อย :42:
มาอธิบายโค้ดตัวเก่าที่ผมทำไปก่อนละกันครับถ้าใครเปิดตัว fla ที่ผม zip ไปตัวเก่า ก็จะเห็นโค้ดตามข้างล่างนี้
อ้างอิง
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org"];
for(i=0;i<link.length;i++){
_root.attachMovie("mc_menu","menu_"+i,i);
_root["menu_"+i]._x = 100;
_root["menu_"+i]._y = 50*i + 25;
_root["menu_"+i].txtUrl = link[ i ];
_root["menu_"+i].onRollOver = function(){
this.gotoAndStop(2);
}
_root["menu_"+i].onRollOut = _root["menu_"+i].onReleaseOutside = function(){
this.gotoAndStop(1);
}
_root["menu_"+i].onRelease = function(){
getURL(this.txtUrl);
}
}
และจะเห็น Movie Clip ใน library อีก 2 ตัว คือ
-mc_menu
-mc_whitebox
ในตัว mc_menu นั้น ลองคลิกขวา เลือก linkage ดู จะเห็นว่า ผมได้ตั้งชื่อ Identify ว่า mc_menu
สาเหตุที่ผมต้องตั้งชื่อตรงนี้นั้น เพราะว่าผมสามารถอ้างถึง movieclip นี้ได้โดยไม่จำเป้นต้องจับมันมาวางใน stage ก่อน
** ตัวอย่างตามในโค้ด _root.attachMovie("mc_menu","menu_"+i,i);
//สร้าง movieClip ตัวใหม่ ถ้า i มีค่าเท่ากับ 2 MovieClip ตัวใหม่ก็จะมีชื่อว่า menu_2
//โดย movie ที่สร้างขึ้นนั้น จะเป็นตัวเดียวกับที่เราตั้งชื่อไว้ใน Identify
โค้ด_root["menu_"+i].txtUrl = link[ i ];
ตัวนี้ ผมใช้เพื่อแสดงข้อความ โดยนำข้อความจาก array มาใส่ในตัวแปร txtUrl ที่เราสร้างขึ้นเองไว้ภายใน MovieClip ตัวนั้น
โค้ด_root["menu_"+i].onRelease = function(){
getURL(this.txtUrl);
}
ตัวนี้ ผมใช้เพื่อเมื่อมีการคลิกที่ปุ่มนั้น ให้มันลิ้งไปยังurl ที่ txtUrl ของตัวที่ถูกกดเก็บค่าเอาไว้
(ใช้ this เพื่อหมายถึง ตัวปุ่มที่ถูกกด และ .txtUrl เพื่อเอาค่าของ txtUrl มาใช้ )
อันนี้ คือตัวที่ผมแนบไปครั้งที่แล้วนะครับ ถ้าเข้าใจแล้ว ค่อยอ่านช่วงต่อไป :52:
อันนี้คือวิธีนึงในการทำแบบที่ผมถามไปตอนแรกนะครับ
คือให้สร้าง array มาอีกตัวควบคู่กันอ้างอิง
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org"];
var txt = ["f0nt", "TFD", "ItemStudio"];
for(i=0;i<link.length;i++){
_root.attachMovie("mc_menu","menu_"+i,i);
_root["menu_"+i]._x = 100;
_root["menu_"+i]._y = 50*i + 25;
_root["menu_"+i].txtUrl = txt[ i ];
_root["menu_"+i].txtLink = link[ i ];
_root["menu_"+i].onRollOver = function(){
this.gotoAndStop(2);
}
_root["menu_"+i].onRollOut = _root["menu_"+i].onReleaseOutside = function(){
this.gotoAndStop(1);
}
_root["menu_"+i].onRelease = function(){
getURL(this.txtLink);
}
}
http://img2.f0nt.com/flash/b6aa689289ec2ed1f42fd4cd26496ace.swf
เดี๋ยวต่อไปจะเอา array 2 มิติ มาใช้แทนวิธีนี้กัน :52:
ว่าแต่ผมอธิบายเร็วไปไหมนิ? :44:
:12: เยี่ยมยอด ++
กรณีตัวอย่างแจ่มๆของคุณ poloh ดูจากสคริป ทำไมต้องทำให้มันยุ่งยากมากมายอย่างนั้น
ผมขออนุญาตขยายแนวคิด และอธิบายนิดหน่อยนะครับ (นี่มันอนุบาลน่ะครับ เผื่อมีคนอื่นไม่ยังไม่เก็ท)
จริงๆเบ็ดเสร็จมันก็แค่
ปุ่มธรรมดา ที่มีลิ้งค์ เราสามารถ ถึกสร้างเอาก็ได้นี่ สามปุ่ม โอะๆ หมูๆ แป๊ะเดียวก็เสร็จ
จากตัวอย่าง หากเราทำเองโดยสร้างเอาเลย ก็แป้ปเดียว ใช่ใหมจ๊ะ
แต่วิธีนี้ จะสามารถ เพิ่ม หรือ ลด ปุ่ม อย่างง่ายดายมากๆ ไดนามิคดีครับ
เหนื่อยตอนแรก ตอนแก้ หรือ นำมาใช้ทีหลังจะสะดวกมาก (ในบางกรณี)
ด้วยสองตัวแปรนี้
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org"];
var txt = ["f0nt", "TFD", "ItemStudio"];หากจะลดเหลือสองปุ่มก็
var link = ["http://www.f0nt.com", "http://www.itemstudio.org"];
var txt = ["f0nt", "ItemStudio"];ถ้าเพิ่มก็
var link = ["http://www.f0nt.com", "http://www.thaiflashdev.com", "http://www.itemstudio.org" , "http://www.download.com"];
var txt = ["f0nt", "TFD", "ItemStudio" , "Download"];ประมาณนั้นครับ เราแก้แค่สองตัวแปรนี้ สคริปก็จะทำงานเองเลยครับ
เพราะตัวสคริปเอง จะนับเองครับว่ามีสมาชิกอาเรย์กี่ตัว
ด้วยสคริปส่วนนี้
อ้างอิงfor(i=0;i<link.length;i++)
คำสั่งนี้จะวนลูป ตามจำนวนสมาชิกอาเรย์ครับ ถ้ามีสมาชิกสองตัว ก็รันลูปสองครั้ง ครับ
ในลูปก็จะสั่งให้ทำอะไรๆ ตามที่คุณ poloh บอกไปนั่นแล
ส่วนถ้าเป็นอาเรย์สองมิติก็อาจจะเหลือตัวแปรเดียว จัดการง่ายขึ้น(ไหม)
55 + ขอบคุณครับพี่
ไม่ต้องขออณุญาติก็ได้ครับ :40:
ช่วยๆกันอธิบายหลายคน จะได้เข้าใจกันทั่วถึง :12:
ต่อเรื่องการใช้แบบ array 2 มิติ
var link = [["http://www.f0nt.com","f0nt"],
["http://www.thaiflashdev.com","TFD"],
["http://www.itemstudio.org","ItemStudio"]];
for(i=0;i<link.length;i++){
_root.attachMovie("mc_menu","menu_"+i,i);
_root["menu_"+i]._x = 100;
_root["menu_"+i]._y = 50*i + 25;
_root["menu_"+i].txtUrl = link[i][1];
_root["menu_"+i].txtLink = link[i][0];
_root["menu_"+i].onRollOver = function(){
this.gotoAndStop(2);
}
_root["menu_"+i].onRollOut = _root["menu_"+i].onReleaseOutside = function(){
this.gotoAndStop(1);
}
_root["menu_"+i].onRelease = function(){
getURL(this.txtLink);
}
}
จากข้างบน จะเห็นว่า ผมได้เขียน url กับชื่อไปพร้อมกันเลย
เพื่อป้องกันอาการหลงลืมแบบ เพิ่มที่ตัวนึง แล้วไปลืมเพิ่มอีกตัวนึง
ส่วนการเรียกใช้นั้น ก็เรียกใช้โดยเรียกแบบ
link[ i ][0] ซึ่งจะหมายถึงค่าแรก ของ array ชุดนั้น
(งงไหมครับ ถ้างง ก็ลอง trace ค่าออกมาดูตามก็ได้ จะได้เข้าใจได้ง่ายขึ้น)
:52: หมดสต๊อคแล้วครับ ขอคืนไม้ให้พี่ ej-sing ต่อเลยครับ
เดี๋ยวลองนะครับ :12:ล
ขอบคุณมากๆๆๆๆๆๆ
บททดสอบอนุบาล ขำๆ :07:
ตัวอย่างครับ
http://img2.f0nt.com/flash/86aa1646eb27b0afe35c1ed21702beba.swf
จากตัวอย่าง
จะเห็นว่า ตัวสามเหลี่ยม จะหมุนอยู่ในวงกลม (กดหมุน ปล่อยหยุด แรนด้อมด้วยนะ :22:)
วงกลมจะหมุนอยู่ในสี่เหลี่ยม
พอลากสี่เหลี่ยม มันก็มากันทั้งหมดเลย ทั้งๆที่ยังหมุนอยู่
-เป็นการซ้อนมูวี่คลิป เข้าไปสามชั้น :37:
สี่เหลี่ยม เป็นตัวหลัก มีวงกลมอยู่ข้างใน ข้างในวงกลม มี สามเหลี่ยมเก้าอัน
=========================================================
แบบทดสอบบทที่ 1 ทดสอบการอ้าง Path โดยไม่ใช้ _root นำหน้าชื่อ
=========================================================
- ให้สั่งหมุนตัวสามเหลี่ยมแบบแรนด้อม 3 ตัว ด้วยการกดปุ่ม ตามตัวอย่าง พอปล่อยปุ่มจึงหยุดหมุน
ข้อบังคับ !!
- ห้ามมี _root หรือ level0 ,level ต่างๆ นำหน้าชื่อ mc ทุกตัว ให้ใช้ this ได้
- เขียนสคริปที่เฟรมแรก ของ Main Timeline เท่านั้น
ทำไฟลแบบทดสอบไว้ให้แล้วครับ
โหลดไฟล์ที่แนบมาด้วย ไปลองทำดูครับ ( ทุกอย่าง สร้างไว้ให้แล้ว แต่ไม่มีสคริป :37: )
ไฟลนี้ทำข้อสอบได้หลายบทเลยครับ :43: ใครว่างๆก็ลองดูนะครับ
// ส่งงาน กรุณาแนบไฟลมาด้วยย :37: จะเอามาตรวจ
=========================================================
=========================================================
สาระเล็กๆ สำหรับคนใช้แฟลช ควรอ่าน
ผิดตกบกพร่องประการใด ขออภัยไว้เลยนะครับ ผมก็มั่วๆตามประสบการณ์ กรุณาชี้แนะเพิ่มเติมด้วยครับ
หาก ไม่มีการโหลดมูวี่ย่อย ที่มีสคริปในตัวเอง ไอ้ที่กำลังจะเขียนๆนี่ก็ไร้ประโยชน์ครับ
- ทำไม บทนี้ ถึงไม่ให้ใส่ _root หน้าชื่อ (วะ) ก็มันเป็น Path แรกสุดที่จำเป็นเลยนี่
คำตอบคือ เป็นการฝึกเล็กๆน้อยๆครับ อ่านตามช้าๆนะครับ มั่วใช้ได้
เพราะบางที บางงาน มูวี่หลักที่ต้องโหลดมูวี่ย่อยๆเข้ามา _root ก็จะเป็น มูวี่หลักครับ
มูวี่ย่อยต่างๆที่มีสคริปที่อ้าง _root อยู่ในตัวอยู่แล้ว จะมีปัญหาแน่นอน จึงมีคำสั่งนี้ mc._lockroot = true
เพื่อมาล๊อค _root ให้เป็นของตัวเอง เพื่อให้สคริปตัวเอง อ้าง _root ของตัวเองได้
แล้ว _root มูวี่หลักก็จะไม่มีเพราะ ล๊อคมาให้มู่วี่ย่อยแล้ว (จำได้วาเป็นเช่นนั้น) แต่ที่แน่ๆคือ มีปัญหาแน่นอน
หาก มูวี่หลักมีการอ้าง _root. บลา บลา บลา รับรองยุ่งสุดๆเลย
เพราะเคยเจอ(บ่อยๆ) งานที่เป็น อนิเมชั่นเล็กๆ ผสมสคริปถึกๆ
มีการใช้ฟังชั่น อ้างถึงตัวแปรต่างๆ อยู่ใน มูวี่หลักเอง พอไปเฟรมหลังๆ การอ้างก็ต้อง _root.ฟังชั่น นั่นเป็นเรื่องปกติ
แต่พอเราโหลดมูวี่จากภายนอกเข้ามาแล้ว มูวี่ที่โหลดมา มันก็มีสคริป ที่ต้องอ้าง _root ของตัวเองด้วย
ทีนี้ก็ต้องเดือดร้อน ._lockroot = true กันให้วุ่น สคริปในมูวี่ย่อยถึงจะใช้ได้
ที่ซวยน่ะคือสคริปบนมูวี่หลัก อ้าง _root. ก็ไม่มาแล้วววว เพราะ ไปล๊อคอยู่ที่อีตัวโน้น บรรลัยแน่ๆ
---------------------------------------------------------------------------------
วิธีแก้ปัญหาแบบแอดว้านซ์ อย่างง่ายก็สร้าง _global ฟังชั่น และตัวแปร _global ซึ่งเรียกจากที่ไหนก็ได้ ไม่ต้อง _root
แหม่่ เทพจริงๆ แต่ บางทีเฉพาะที่เฉพาะทาง มันก็ไม่เหมาะไม่ควร ยุ่งยากเปล่าๆ
เราก็แก้ด้วยวิธีง่ายๆโคตรๆ
การ ไม่ต้องอ้าง _root ในมูวี่ย่อยๆ ไง
พยายามหาทางอ้าง path ให้มันทำงานในตัวมันเองให้ได้ โดยไม่มี _root. นำหน้า path
พอโหลดมามูวี่หลัก สคริปต่างๆมันก็ยังทำงานได้เพราะ มันไม่ต้องอ้าง _root ในตัวเอง
ทีนี้ก็สบาย ไม่ต้อง _lockroot กันให้ปวดกบาลแล้วครับ เฮ้อออววววว
อย่าลืมทำบททดสอบกันนะจ๊ะ :33:
จ้ะ เดี๋ยว จะส่งนะจ้ะ
เอ้า เล่นกันเอง ซะฉิบ แล้วเรา น้าแอด :39:
ครั้งนี้ขอเข้าสอบด้วยครับ :46:
สี่วันนี้ งานเร่งบรรลัยเลยครับ
แต่พออ่านที่น้าแอดแนะนำแล้วไม่เข้าสมองเลยครับเดี๋ยวงานเสร็จจะมาอ่านใหม่ :08:
แต่อยากปั่นบอร์ด :37:
อ่าขอบคุณครับ + +
เข้ามาเล่นของเล่นค่ะ :40:
ส่งการบ้านครับ :46:
ทำแบบนี้คนนั่งข้างหลังก็มองไม่เห็นน่ะสิ
:44: ยังไงนะครับ
กะว่าจะ quote ไว้ว่าาเป้น code แต่กลัวจะเป็นสปอยล์ เลยนวลไปอีกที :44:
:07: ไม่ต้องลงเลยดิ
เอาผลมาแสดงเฉยๆ
แล้ว ก็ส่งงานทาง จมล. :37:
โอเค แสดงผลไม่เป็น จักรีทำให้หน่อย :37:
ขึ้นไปเก็บโค๊ดก่อน
http://img2.f0nt.com/flash/842d0b608c809f5ebc0a4553a07c943a.swf
เอาไฟล์ swf มาอัพโหลดเลยเหมือนภาพไง แกล้งรึเปล่าเนี่ย :07:
ได้รับ จมล ของ คุณเอ แล้วครับ :07: :12: ให้ 9 / 10 คะแนน ครับผมมมมม ( :05: อยากบวกให้ครับแต่ ทำไม่ได้ )
ตรวจดูแล้ว :07: สคริปเจ๋งมาก แนวคิดเจ๋งด้วย ถูกต้องตามข้อบังคับทุกประการ
ส่งงานเกินคำสั่งอีกต่างหาก ฝีมือร้ายกาจมั่กๆ ข้าน้อยขอคาราวะ
ถ้าว่างพอ... รบกวนแก้ให้นิดนึงได้ไหมครับ
คือ ไม่เอา onEnterFrame รันตลอดเวลา ทั้งสองตัวครับ ผมก็ยังคิดไม่ออกว่าของคุณเอจะทำยังไง
ของผมกดแล้วค่อยรันครับ (แบบง่ายๆเร้ยย สคริปถึก ยาวเหยียด)
ถ้าแก้ได้ ให้ 10 เต็มครับ
และเดี๋ยวจะขออนุญาตเอาบางสคริปมาเรียนรู้และขยายแนวคิดกัน
ของผมยังให้คะแนนตัวเอง ไม่ถึง 7.5 เล้ย :08:
:46: ขอบคุณครับ
คือว่าตอนนี้ใช้เป็นแค่ onEnterFrame อะครับ :08:
มีตัวอย่างกดแล้วให้รันบ้างมั้ยครับ :05:
เราสามารถ delete mc.onEnterFrame ได้ครับ หากไม่ใช้งาน
ประมาณว่า
อ้างอิง
BT.onPress = function(){
mc.onEnterFrame = function (){
// run function... bla bla bla ....
}
}
BT.onRelease = function(){
delete mc.onEnterFrame
}
ขอบคุณครับ :46:
อยากแตกหน่อจู๋นี้เป็นเรื่องๆ จังเลย
มันดีมากๆ เลยนะครับ
แต่ท่าทางตูจะไม่ทันแล้ว งงกะตัวอักษรเยอะๆ :05:
แจ่มเลยครับพี่
แตนิดนึงนะครับ คือไอเส้นสีเทามันคลิกยากไปนิดน่ะครับ
ถ้าเพิ่มพื้นที่ให้คลิกออกมาข้างๆอีกนิดนึงจะดีมากๆเลยครับ :40:
จะสั่งให้มัน กด ปุ่ม uj พร้อมกันแล้วทำงาน ต้องเขียนยังไงเหรอค่ะ พยายามเขียนตามที่อ่านกระทู้แล้ว ไม่ได้เลยค่ะ
if ((Key.getCode() == 85) && (Key.getCode() == 74)){
trace("กด u กับ j");
}
:08: ยังไม่เคยทำเหมือนกันครับ ยังนึกไม่ออกเหมือนกัน
ถ้าเป็นพวกปุ่มหลักเช่น Ctrl+.. หรือ Shift+... อะไรเทือกๆนั้นก็พอไหว (ไม่เคยเหมือนกัน) :05:
และเวลาเทสปุ่มบนคีย์บอรด อย่าเทสในโปรแกรมนะครับ (Ctrl+Enter)
หากปุ่มนั้นๆ เป็นปุ่ม Shortcut ของแฟลชเอง มันจะไม่ทำงานตามสคริปครับ
ให้ออกมาเทสกับ swf ไฟลตรงๆ
จริงๆลองเทสในโปรแกรมก็ได้นะครับ
แต่ต้องติ๊กถูกตรง Disable Keyboard Shortcuts ก่อน
(http://img2.f0nt.com/15/8a1142e2c4fb36122f954e043d862aa3.png)
:07: ใช่ๆ ลืมไปได้ยังไงฟะ ขอบคุณแมคมากครับ
จากบททดสอบ อนุบาลขำๆ :05:
เอามาเฉลยแบบของผมhttp://img2.f0nt.com/flash/258d06ee9192ab34c3db07e17875a984.swf
สคริปจ๊ะ :17:
อ้างอิง
bt.onPress = function() { // ปุ่มแรนด้อมหมุนตัวสามเหลี่ยม 3 ตัว(ใดๆ)
i = random(3)+1;
n = random(3)+4;
m = random(3)+7;
ret_mc.cir_mc["tri_mc"+i].onEnterFrame = function() {
this._rotation += 25;
};
ret_mc.cir_mc["tri_mc"+n].onEnterFrame = function() {
this._rotation -= 25;
};
ret_mc.cir_mc["tri_mc"+m].onEnterFrame = function() {
this._rotation += 25;
};
};
// พอปล่อยให้หยุด
bt.onRelease = bt.onReleaseOutside = function() {
delete ret_mc.cir_mc["tri_mc"+i].onEnterFrame;
delete ret_mc.cir_mc["tri_mc"+n].onEnterFrame;
delete ret_mc.cir_mc["tri_mc"+m].onEnterFrame;
};
bt2.onRelease = function() { // ปุ่มหมุนวงกลม
ii = random(2);
ret_mc.cir_mc.onEnterFrame = function() { // แรนด้อมทิศทาง
if (ii == 1) {
ret_mc.cir_mc._rotation += 3;
} else {
ret_mc.cir_mc._rotation -= 3;
}
};
};
bt2_stop.onRelease = function() { //ปุ่มหยุด
delete ret_mc.cir_mc.onEnterFrame;
};
// หยิบ mc
ret_mc.onPress = function() {
this.startDrag();
};
ret_mc.onRelease = function() {
this.stopDrag();
};
งานนี้ตัวเอกคือ วิธีอ้าง path mc และ วิธีเชียนชื่อเพื่ออ้างถึงได้สะดวกครับ
ret_mc.cir_mc["tri_mc"+i] สมมุติ i = 1 จะได้ชื่อจริงๆก็คือ
ret_mc.cir_mc.tri_mc1 :22:
ลบ onEnterFrame ตลอดหากไม่ใช้งาน
===============================================================
ส่วนอันนี้ของผู้ร่วมสนุก ไฮโซมั่กๆอ้างอิงvar speedCircle
var speedtriangle;
//ตัวขับเคลื่อน
ret_mc.onEnterFrame = function() {
ret_mc.cir_mc._rotation += speedCircle;
}
ret_mc.cir_mc.onEnterFrame = function() {
for(i=0; i<speedtriangle.length; i++) {
eval("ret_mc.cir_mc.tri_mc"+(i+1))._rotation += speedtriangle;
}
}
// option เสริม
function rotateTriangle(amount) {
speedtriangle = [0, 0, 0, 0, 0, 0, 0, 0, 0];
for(i=0; i<amount; i++) {
speedtriangle[random(speedtriangle.length)] = random(30)+1;
}
trace(speedtriangle);
};
function rotateCircle(speedRotate) {
ret_mc.speedCircle = this.speedRotate;
};
bt.onPress = function() {
rotateTriangle(random(9)+1);
};
bt.onRelease = bt.onReleaseOutside = function() {
speedtriangle = [0, 0, 0, 0, 0, 0, 0, 0, 0];
};
bt2.onRelease = function() {
if(speedCircle < 0) {
speedCircle = 2;
}
else {
speedCircle = -2;
}
};
bt2_stop.onRelease = function() {
speedCircle = 0;
};
เดี๋ยวมาต่อ ครับ ง่วงแล้ว :17:
ขอเบิ้ลครับ มาตาลาย + ปวดกระโหลกกัน
ประเด็นของงานข้างบนนั้นคือ
การอ้างชื่อ path ครับ ในกรณีที่เป็นการเรียกแบบลูป
หรือ ชื่อ mc มีการเรียงกันโดยตัวแปร(เพื่ออะไรสักอย่าง แรนด้อมเรียกชื่อใดๆ ลูปเรียง ฯลฯ )
ของผมเรียกโดยวิธีนี้
ret_mc.cir_mc["tri_mc"+m]
ของ...^-FakE-^ ( ขออภัย :46: จำชื่อจริงๆไม่ได้ เปลี่ยนชื่อกันซะงง :08: ) ที่ส่งมาแบบไฮโซ
เรียกโดย ใช้ eval()
eval("ret_mc.cir_mc.tri_mc"+(i+1))
สังเกตุวิธีเขียนครับ สำคัญทีเดียวครับ
ที่เอามาอธิบายก็เพราะ.........ชอบลืมน่ะครับ :08: เอามาลงไว้จะได้ไม่ลืม มาดูได้ตลอด
ตัวอย่างง่ายๆ
ถ้าสมมุติเราจะแรนด้อม mc ตัวใดตัวนึงในสามตัวให้ทำอะไรสักอย่าง
เช่น คลิกแล้วแรนด้อมเรียก mc ตัวใดตัวนึงให้หมุน
เราก็ตั้งชื่อ mc สามตัวให้มีการเรียงกันโดยตัวเลข(ง่ายที่สุด)
mc1 - mc2 - mc3
var i :Number;
_root.onMouseDown = function(){
i = random(3)+1;
_root["mc"+i].onEnterFrame = function(){
this._rotation += 15;
}
}
ดูวิธีเขียนนะครับ
_root["mc"+i] ก็คือ ถ้า i ที่แรนด้อมมาเท่ากับ 2 ก็จะได้ชื่อ mc ออกมา _root.mc2
ไม่งงนะ
สังเกตุ ไม่มี "." ต่อท้าย _root แต่ใช้ [] เอามาติดกันเลย :41: วุ๊ยยยอธิบายไม่เป็น ดูเอาคงเข้าใจนะครับ
ทีนี้ถ้ากรณี path ลึกเข้าไป อย่างในตัวทดสอบขำๆนั่น ก็ซ้อนๆกันจนถึงชื่อที่ต้องการ
แบบนี้ไงครับ ret_mc.cir_mc["tri_mc"+m] ไม่อธิบายนะ คงเข้าใจเนาะ
เอาล่ะ ทีนี้ ประเด็นหลัก (ทำไมมันหลายหลักจังวะ) .......อันนี้หลักกว่าๆครับ :23:
ไม่เอา _root หรือ this นำหน้า _root["mc"+i] ได้ไหม เขียนโต้งๆเลย ["mc"+i] ?เพราะเคยคุยไว้ว่า หากมีการโหลดมูวี่เข้ามาจากภายนอก (จริงๆอธิบายคร่าวๆไปครั้งนึงแล้วครับ (http://www.f0nt.com/forum/index.php?topic=11542.msg911009#msg911009))
ก็จะสับสนเรื่อง _root อีกน่ะสิ ต้อง _lockroot = false โอ๊ยวุ่นวาย
หากเขียนจาก _root["mc"+i]._x += 20
เป็น ["mc"+i]._x += 20
ได้ไหม ...........
ไม่ได้ครับ เพราะ ......อะไรวะ นั่นน่ะสิ ก็ syntax error อ่ะ
เพราะหากมีการทำอะไรๆกับฝั่งซ้ายของสคริป มันไม่ได้ นั่นเป็นเกือบทุกภาษามั๊ง (เดา)
แต่แก้ได้โดยใช้ อ้างอิงeval function
eval(expression:Object) : Object
eval(expression:String) : Object
Accesses variables, properties, objects, or movie clips by name. If expression is a variable or a property, the value of the variable or property is returned. If expression is an object or movie clip, a reference to the object or movie clip is returned.
If the element named in expression cannot be found, undefined is returned.
eval() คือ มันจะคืนค่า ตัวแปร หรืออะไรๆ ออกมาเป็นชื่อ (ผมอธิบายถูกมั๊ย ....ไม่รู้แล้วเสือกมาทำเก่งอีก :23: )
//แก้ให้ถูกต้อง
eval น่าจะเป็นการคืนค่า Object นั้นๆ ตามชื่อที่ใส่เข้าไปนะครับ (ถ้ามีอยู่จริง)ขอบคุณ ^-FakE-^ ครับที่อธิบายเพิ่มเติม
จากอันนั้นเราก็เอามาใส่ eval()ซะ
var i :Number;
_root.onMouseDown = function(){
i = random(3)+1;
eval(["mc"+i]).onEnterFrame = function(){
this._rotation += 15;
}
}
หรือ
eval(["mc"+i])._x += 20
เท่านี้ก็ไม่ต้องใส่ _root หรือ this นำหน้าให้วุ่นวายแล้ว (ดูแล้ววุ่นวายกว่าเดิมไหมน่ะ)
จริงๆ eval() มันน่าจะมีมากกว่านี้นะ แต่ผมใช้แค่นี้เอง
ครับ น่าจะพอเข้าใจเนาะ
เรื่องหยุมหยิมที่ไม่มีใครมาอธิบายหรอกครับแบบนี้
นอกจากไอ้ขี้ลืมอย่างผม มาอธิบายให้ตัวเองไว้กลับมาอ่านน่ะครับ :42:
จริงๆ แล้วที่ใช้ eval เพราะแค่ต้องการให้วนลูปตัวแปร Object นี่ละครับ
ถามพี่ที่ทำงานเขาบอกมายังงี้ก็เลยใช้ :08:
eval น่าจะเป็นการคืนค่า Object นั้นๆ ตามชื่อที่ใส่เข้าไปนะครับ (ถ้ามีอยู่จริง)
สงสัยนิดนึงครับต้องใส่ [] ด้วยเหรอครับ :09:
ตอนนี้ผมไม่ได้ตามเลยครับ น้า :05: ขออภัยจริงๆ สงสัยเป็นเพราะ งุ่นง่านแต่กับงานเอกสารมั้ง
ถ้าโดนถีบหัวให้มาทำพวกนี้อีกคงกลับมางัวเงียอีกเป็นแน่แท้ :25:
กร๊าก ตอบช้าไป ..โดนตัดหน้าซะแล้วต๋อย
โอ้ ขอบคุณครับ ผมไม่เข้าใจคำสั่งจริงๆของมันสักเท่าไร แต่เสือกใช้เป็น :08:
ขอบคุณครับ อธิบายสั้นๆ แต่เข้าใจขึ้นเยอะเลยครับ (ผมเขียนแต่น้ำแฮะ)
//จักรีนี่ใครเหรอ ........... ลืมไปแล้ว :42:
เอก็ไม่ค่อยเป็นหรอกครับ :08:
ลอกๆ เขามา จากหน้าแรกๆ ด้วยซ้ำ นึกคำสั่งไม่ออก
อ้างคำพูดจาก: ^-FakE-^ เมื่อ 18 มิ.ย. 2008, 00:40 น.
สงสัยนิดนึงครับต้องใส่ [] ด้วยเหรอครับ :09:
ถ้าเรียกเดี่ยวๆ ไม่ต้องก็ได้ครับเป็น
eval("mc"+i).onEnterFrame = function(){
this._rotation += 15;
}
ลืมเอาออก :03:
แต่ถ้ามีการเรียก path ลึกๆ ซ้อนๆกันก็ต้องมีครับ
eval(mc_fee["mc"+i]).onEnterFrame = function(){
this._rotation += 15;
}
แต่ถ้า มีชื่อนำหน้าแบบอันบน eval(mc_fee["mc"+i])
ก็ไม่ต้องใช้ eval() แล้วก็ได้ โล่งๆ
mc_fee["mc"+i].onEnterFrame = function(){
this._rotation += 15;
}
eval("mc_fee.mc"+i) ไม่ได้เหรอครับ
ได้นะครับ
เรียกถึงระดับ property ใช้ eval เลยก็ได้(มั้ง ? เหมือนเคยทำ :47:)
โอ้วไม่ได้เข้ามานาน จู๋นี้ไปกันไกลลิบลิ่วแล้ว
แวะมาทักทายน๊าแอ๊ดครับ ^^ :02:
:45: ขอบคุณมาก ๆ ครับ
ได้้รับความรู้มากมาย
แต่ทำไมมัน เงียบ ๆ ไป แล้วล่ะครับ :08:
คงจบคอร์สอนุบาลแล้วล่ะครับ
เพราะเห็นมีหลักสูตรมัธยมโผล่มาแจมเยอะแยะเลย ตูยังอยู่แค่ปอเตรียม :05:
ไม่ไหว advance เกินตามไม่ทัน T^T เฮ้อ หนักใจ..
ขอรบกวนถามหน่อยค่ะ
คือว่าไม่เข้าใจโค้ด
var mySound:Sound = new Sound();
mySound.attachSound("try.mp3", true);
mySound.start();
เข้าใจว่าอันที่เป็น load sound เป็นการโหลดไฟล์จากข้างนอก (โฟลเดอร์เดียวกับไฟล์แฟลช)
แต่ว่าเวลาเซฟไปเปิดที่อื่นก็ต้องมีโฟลเดอร์ที่มีไฟล์นั้นอยู่ด้วยใช่มั้ยคะ
ก็เลยเลือกใช้ attach sound ที่ใช้ไฟล์จาก library
ซึ่ง ลองเปลี่ยนชื่อไฟล์หลายแบบแล้ว เสียงมันก็ยังไม่ออก
(จะเอาไปใช้กับฟังก์ชั่น if ถ้าได้คะแนนมาก ออกเสียงนึง ถ้าคะแนนน้อยออกอีกเสียงน่ะค่ะ
นั่งงงกับโค้ดนี้มาเป็นชั่วโมงแล้วอ่ะค่ะ :05: มันใช้ยังไงเหรอคะ)
ปกติดาใช้เป็น mc แล้วโยนไฟล์เสียงลงไปเลย สคร้งสคริปไม่สนใจ :37:
ใช้เสียงใน library จะต้องตั้งชื่อ identifier ให้กับไฟล์เสียงนั้นๆ ด้วย
จากหน้าต่าง library คลิกเลือกที่ไฟล์เสียง
ที่เมนู library option ให้เลือก linkage
จะมีหน้าต่าง properties
แล้วก็กำหนดชื่อในส่วนของ identifier
แล้วกด ok
ส่วนการนำเสียงมาใช้ก็
mySound.attachSound("ชื่อของ identifier ที่ได้ตั้งไว้");
ตามนี้จ้ะ
ลบโปรแกรมไปแล้วเลยเปิดหนังสือปกน้ำเงินมาอธิบายแทน :27:
กรี๊ด ขอบคุณค่ะ :25:
เดี๋ยวลองไปทำดูก่อน
เห็นสคริปยาวๆแล้วไมเกรนเริ่มจะถามหา
1. พี่ๆคะ ใส่ as ให้ปุ่มหยุดใน Time line หลักแล้วแต่ทำไม mc ไม่หยุดคะ
ใส่โค๊ดไว้ว่าอย่างไรเล่า แม่นาง..
ใส่
on (release){
stop();
}
คะ
อ้างคำพูดจาก: shampoo เมื่อ 16 ก.ย. 2008, 21:37 น.
1. พี่ๆคะ ใส่ as ให้ปุ่มหยุดใน Time line หลักแล้วแต่ทำไม mc ไม่หยุดคะ
ให้ mc หยุด ก็ต้องสั่ง mc ด้วยครับ
on (release){
_root.mc.stop();
}
ใส่ไว้ที่ปุ่มก็แบบนี้ครับ
ถามได้เข้ากับชื่อกระจู๋ดีมาก เห็นพักหลังเป๋ไปชั้นประถมกันหมดเลย
:30: ใช่ๆ
หลังจากนี้ หรืออ่านมาถึงตรงนี้ก็ไปซื้อหนังสือ actionscript (http://www.f0nt.com/forum/index.php/topic,14015.0.html) มาเก็บไว้ได้แล้วครับ :12:
หรือรอให้เซียนๆ มาต่อเรื่อง ประถม มัธยมนะ ผมหมดมุขแล้ว
ความรู้มีเท่าหางอึ่งที่เห็นๆนั่นแหล่ะครับ :12:
อ้างคำพูดจาก: ej_sing เมื่อ 22 ก.ย. 2008, 23:38 น.
หลังจากนี้ หรืออ่านมาถึงตรงนี้ก็ไปซื้อหนังสือ actionscript (http://www.f0nt.com/forum/index.php/topic,14015.0.html) มาเก็บไว้ได้แล้วครับ :12:
หรือรอให้เซียนๆ มาต่อเรื่อง ประถม มัธยมนะ ผมหมดมุขแล้ว
ความรู้มีเท่าหางอึ่งที่เห็นๆนั่นแหล่ะครับ :12:
ขอบคุณครับ ช่างเป็นอึ่งที่หางยาวยิ่งนัก
อยากรู้เรื่อง tweener อะครับ อยากให้่ผู้รู้มาช่วยสอนต่อให้หน่อยครับ
กำลังหัดลองเขียนอยู่ครับ
tweener AS2.0 หรือ AS3.0
ถ้า AS2.0 รออาจารย์ก่อแกว่างๆมาสอนนะครับ
ถ้า AS3.0 ก็.............รออาจารย์ก่อแกว่างๆมาสอนนะครับ :42:
ผมไม่รู้เรื่องเลย ไม่เคยลอง
ถ้ายังอยู่ที่ AS2.0 แนะนำ lmc_tween (http://laco.wz.cz/tween/) ครับ ง่ายมาาาาาาาากกกก ติดตั้งก็ง่าย ใช้ก็ง่าย
// ลองคุ้ยๆดูครับมีเกริ่นๆไว้บ้าง
เจอล่ะ http://www.f0nt.com/forum/index.php/topic,11542.msg817201/topicseen.html#msg817201 (http://www.f0nt.com/forum/index.php/topic,11542.msg817201/topicseen.html#msg817201)
:30: น้าแอ๊ด
---------
Tweener = Library ฟรีตัวนึงครับ ที่ช่วยเรื่องเกี่ยวกับ Transition ของวัตถุหลายชนิด เช่น การเคลื่อนที่, เปลี่ยนสี, เปลี่ยนความดังเสียง ฯลฯ โดยที่เราไม่ต้องออกเเรงเขียนคำสั่งยาวๆ ด้วยตัวเอง อะตัวอย่างครับเช่น
สมมติว่ามี Movie Clip ตัวหนึ่งบน Stage ตั้งชื่อ Instance name ว่า _mc ให้
- เคลื่อนที่จากจุด 0,0 ไปยังจุด 10,300 แบบมีความหน่วง* ภายในเวลา 1 วินาที
(*ความหน่วง หมายถึง การที่วัตถุเคลื่อนที่ด้วยความเร่งติดลบ หรือก็คือ เหมือนเราขับรถมา แล้วเหยียบเบรกนั่นแหละครับ)
วิธีเดิมเนี่ย เราก็ต้องทำแบบนี้ครับ
(AS1.0, AS2.0)
_mc._x = 0;
_mc._y = 0;
_mc.onEnterFrame = function(){
this._x += (10-this._x)/8;
this._y += (300-this._y)/8;
if(Math.abs(this._x - 10) <= 0.5 && Math.abs(this._y - 300) <= 0.5){
delete this.onEnterFrame;
}
};
(AS3.0)
_mc.x = 0;
_mc.y = 0;
_mc.addEventListener(Event.ENTER_FRAME, onMoving);
function onMoving(evt:Event):void{
var _mc:MovieClip = evt.target as MovieClip;
_mc.x += (10-_mc.x)/8;
_mc.y += (300-_mc.y)/8;
if(Math.abs(_mc.x-10) <= 0.5 && Math.abs(_mc.y-300) <= 0.5){
_mc.removeEventListener(Event.ENTER_FRAME, onMoving);
}
}
ยาว ยาก มึน :08:
Tweener เลยเป็นพระเอกขี่ม้าขาวมาช่วยครับ
(โหลดที่ http://code.google.com/p/tweener/ )
วิธีใหม่
AS1.0 => ให้โหลดตัว mc_tween2 มาใช้ครับ [ http://hosted.zeh.com.br/mctween/ ]
(คนทำคนเดียวกันครับ)
#include "mc_tween2.as"
_mc._x = 0;
_mc._y = 0;
_mc.slideTo(10,300,1,"easeOutExpo");
AS2.0 => คือ AS1.0 ที่เขียนเป็นคลาสครับ
import caurina.transitions.Tweener;
_mc._x = 0;
_mc._y = 0;
Tweener.addTween(_mc, {_x: 10, _y: 300, time: 1, transition: "easeOutExpo"});
AS3.0
import caurina.transitions.Tweener;
_mc.x = 0;
_mc.y = 0;
Tweener.addTween(_mc, {x: 10, y: 300, time: 1, transition: "easeOutExpo"});
อูย.. สั้นกว่าเห็นๆ (เหลือบรรทัดเดียวเองครับ)
แล้วมันสะดวกตรงที่ เราไม่ต้องไปจัดการเรื่องการ enterFrame ที่ฟุ่มเฟือยเลยครับ
ตัว Tweener จะจัดการให้เองเสร็จสรรพ ไม่ต้องห่วงว่า enterFrame เยอะแล้วมันจะอืดครับ
สะดวกอีกอย่างตรงที่ เราสามารถตรวจเช็คว่ามันเคลื่อนที่เสร็จรึยังได้ด้วยนะ
ลองอ่าน Document เค้าดูนะครับ [ http://hosted.zeh.com.br/tweener/docs/en-us/ ]
:12:
----------
แถมให้ครับ
วิธีการ Transition เสียง -- การทำเสียงค่อยๆ เบาลงด้วย Tweener
สมมติว่า มีเสียงใน Library ตั้ง Linkage ว่า sound1 นะครับ
(AS1.0)
#include "mc_tween2.as"
var s = new Sound();
s.attachSound("sound1");
s.start();
s.volumeTo(0, 1); //ค่อยๆ เบาเสียงจากดังสุด (100) ไปจนไม่มีเสียง ภายในเวลา 1 วินาที
(AS2.0)
import caurina.transitions.Tweener;
import caurina.transitions.properties.SoundShortcuts;
SoundShortcuts.init();
var s:Sound = new Sound();
s.attachSound("sound1");
s.start();
Tweener.addTween(s, {_sound_volume: 0, time: 1});
(AS3.0)
import caurina.transitions.Tweener;
import caurina.transitions.properties.SoundShortcuts;
import flash.media.SoundChannel;
SoundShortcuts.init();
var s:Sound = new sound1();
var sc:SoundChannel = s.play();
Tweener.addTweener(sc, {_sound_volume: 0, time: 1});
-----------
ยังไงถ้ามีปัญหา ก็ถามมาได้เลยนะครับ :42:
โอ้ว ขอบคุณมากเลยครับ น้องก่อ
พูดถึงเรื่องเสียงแล้ว ถามต่อเลยนะครับ
คือสมมติว่า มีเสียงอยู่สองไฟล์ใน Library
แล้วต้องการทำปุ่ม บอกว่า กดปุ่มนี้ เสียง1 เล่น กดปุ่มนี้เสียงสองเล่น ละครับ
แล้วเราเขียนโค้ดคอนโทล อะไรเกี่ยวกับเสียงได้บ้างครับ ถามคนอื่นๆ ด้วยนะครับ ว่าใครเคยเขียนความคุมเสียง ในรูปแบบไหนบ้าง
อย่างเช่น สมมติมีไฟล์เสียงอยู่ไฟล์เดียว เราจะเขียนโค้ดให้เวลากดปุ่ม แล้วไปเล่นเสียงในวินาที ที่เท่าไรๆ ได้มั้ยครับ....
(ถามแบบนี้ให้ความรู้สึกแบบอนุบาลเลยใช่มั้ยละ )
ตอนที่ดาใส่เสียงใน cai ด้วยความมั่ว
ดาก็เลยทำไฟล์เสียงเป็น stream แล้วตั้งคำสั่ง goto อ้ะ
อย่างปุ่มพอส ดาก็ใช้ stop ปุ่มเพลย์ ก็ใช้คำสั่ง play ให้มันเล่นต่อ
ส่วนปุ่มหยุดสี่เหลี่ยม ก็ใช้เป็น goto เฟรมแรก พอกดเพลย์ มันก็จะเล่นจากเริ่มต้น
อย่างงี้ถ้าจะให้เล่นแบบที่แจ๊กกี้ว่า ก็เป็นโกทูเฟรมนั้นๆเอา อย่างงี้พอได้มั้ยอะ
ป.ล. มะพร้าวห้าวขายสวนมั้ยหว่าเนี่ย ไม่ได้สคริปต์เลย :37:
ป.ล. อันนี้เป็นเวอร์ชั่นเตรียมอนุบาลเลยรึเปล่า :30:
จารย์ก่อหายไปไหน มาแจมแทนละกัน
ขอบคุณเรื่อง tweener ด้วยนะครับ ขอ tweenlite อีกตัวด้วยนะครับ แหะๆ
Sound เริ่มจากแบบง่ายๆ โหลดภายนอกนะ
อ้างอิงvar my_sound:Sound = new Sound();
my_sound.onLoad = function(success:Boolean) {
//ตรงนี้เป็นส่วนที่บอกว่า ระหว่างโหลด จะทำอะไรก็ว่าไป
//อย่างในที่นี้ ก็จะดึงค่าเวลาทั้งหมดของเพลงมาแสดง ( sound.duration = เวลาทั้งหมดของเพลง )
var totalSeconds:Number = this.duration/1000;
trace(this.duration+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
trace(minutes+":"+seconds);
};
my_sound.loadSound("test.mp3", true); //ไฟล์เพลงที่โหลดจากภายนอก
ในตัวอย่างถ้าลองดู
ในหน้าต่าง output จะแสดงค่าว่า เพลงที่โหลดนั้นมีความยาวเท่าไร
กี่ ms กี่วิ กี่นาที
เรื่องควบคุมเสียง ทำได้หลายอย่างครับ มีทั้ง ตำแหน่ง ปรับบาล้านซ้ายขวา ปรับโวลลุ่ม เล่นเป็นโมโน สเตอริโอด้วย setTransform()
อย่างอยากไปตำแหน่งไหนก็
อ้างอิงmy_sound.start(วินาทีที่ต้องการ)
เช่น อยากให้เล่นที่ วินาทีที่ 25
อ้างอิงmy_sound.start(25)
หรืออยากทำบาร์บอกตำแหน่งก็
var pos:Number = Math.round( ค่าตำแหน่งล่าสุดที่เพลงนั้นเล่น / เวลาของเพลงทั้งหมด * 100 )
ก็จะได้ pos = ตำแหน่งล่าสุดเป็นเปอเซ็นต์
เช่น
อ้างอิงvar my_interval:Number;
var my_sound:Sound = new Sound();
my_sound.loadSound("test.mp3", true);
my_interval = setInterval(updateProgressBar, 1000, my_sound);
function updateProgressBar(the_sound:Sound):Void {
var pos:Number = Math.round(the_sound.position/the_sound.duration*100);
trace(pos+"%");
}
ในที่นี้เราใช้ setInterval เป็นตัวทำเหตุการณ์
คือทุกๆ 1 วินาที ระหว่างที่เล่น จะเรียกใช้ฟังชั่น updateProgressBar()
โดยส่งพารามิเตอร์เป็น object my_sound เข้าไปทำงานในฟังค์ชั่น
ในฟังค์ชั่น updateProgressBar ก็จะนำค่าต่างๆใน my_sound ที่ส่งเข้ามา
มาคำนวณค่าตำแหน่งที่เล่นไปออกมาแปลงเป็นเปอร์เซ็นต์
แล้วก็ output ค่า % ที่เล่นไปออกมา
โอ๊ยยย ไม่งงนะ :32:
ต่อด้วยการจะไปที่ไหนๆในตำแหน่งของเพลง แบบคลิกที่บาร์บอกตำแหน่ง
แล้วเพลงก็เล่นตรงนั้นเลย เหมือนๆ flash media player ทั่วไป
เขาทำกันยังไง .......... :09:
คำตอบ
จาร์ก่อครับ ....ฝากด้วย :46:
(เดี๋ยวผมไปมั่วในแบบของผมมาด้วย ช่วยๆกัน)
ปล. เอาง่ายๆนะครับ
:55: เฮือก โดนโยนมาด้วย :30:
Tweenlite ผมไม่ได้ใช้อะครับ แต่หลักการเดียวกันเลยครับ เพียงแต่คนทำคนละคน
เจ้านี้เค้าเน้นขนาดไฟล์ที่เล็กลงครับ แต่ก็ทำอะไรได้น้อยลงเช่นกัน
ส่วนตัวผมชอบ Tweener ที่สุดแล้ว
พูดถึง Library ที่ใกล้เคียงก็มีอีกเจ้านึงครับ รู้สึกจะชื่อ gTween [ http://www.gskinner.com/libraries/gtween/ ]
ตัวนี้ค่อนข้างมาแรงครับ เพราะมันทำงานเร็วกว่า Tweener ซะอีก
เอาเป็นว่า ถ้าเราทดสอบการใส่ Tween เค้าไปที่วัตถุ 1500 ชิ้น
TweenLite นี่แหละครับ ที่เร็วที่สุด รองมาก็ gTween แล้วโหล่สุดก็ Tweener
ทดสอบได้ที่เว็บ http://blog.greensock.com/tweening-speed-test/
มีทั้ง AS2 และ AS3 ครับ
แล้วจะเห็นว่า AS3 ทำงานเร็วกว่า ที่ Tweening Engine เดียวกัน
ผมทดสอบตัว TweenLite ตั้งที่จำนวนวัตถุ 1500 ชิ้นเท่ากัน
AS2 - ความเร็วจับได้ที่ 12-15 fps ในขณะที่
AS3 - ความเร็วได้ที่ 51-53 fps
เพราะฉะนั้น.. มาใช้ AS3 กันเถอะครับ :12:
(เรื่องเสียงเดี๋ยวผมขออนุญาตเบิ้ลโพสต์นะครับ จะได้อ่าน+หาง่าย)
*หมายเหตุ - fps หรือ frames per second มักใช้เป็นหน่วยวัดความเร็วในการแสดงผล ตัวเลขยิ่งมาก ยิ่งแสดงว่าทำงานได้เร็ว
เรื่องการโดดข้ามเพลง ไปยังช่วงเวลาที่กำหนด โดยเลื่อนบาร์
จะใช้การคำนวณตำแหน่งของบาร์ ให้เป็นตัวเลขอัตราส่วนครับ
แล้วเอาตัวเลขนั้น ไปคำนวณกับความยาวเพลงอีกทีนึง
ขออธิบายด้วยหลักการคำนวณธรรมดาๆ ก่อนนะครับ
สมมติว่า คะแนนสอบวิชาหนึ่ง มีคะแนนเต็ม 200 คะแนน
นาย ก. ได้คะแนน 125 คะแนน คิดเป็นอัตราส่วน 0.625 ของคะแนนเต็ม (125/200 = 0.625)
นาย ข. ได้คะแนน 75 คะแนน คิดเป็นอัตราส่วน 0.375 ของคะแนนเต็ม (75/200 = 0.375)
ในทางกลับกัน เราก็สามารถกล่าวว่า
นาย ก. ได้คะแนนเป็น 0.625 ของคะแนนเต็ม ดังนั้น นาย ก. ได้คะแนน 125 คะแนน (0.625*200 = 125)
นาย ข. ได้คะแนนเป็น 0.375 ของคะแนนเต็ม ดังนั้น นาย ข. ได้คะแนน 75 คะแนน (0.375*200 = 75)
-----------------
เอาการคำนวณเรื่องอัตราส่วนนี้ มาใช้กับเรื่องเสียงครับ
สมมติว่า รางของแถบเลื่อน มีความยาว 200 px
1. ตอนนี้ ลากบาร์ไปอยู่ที่ตำแหน่ง 125 px ก็จะคิดเป็นอัตราส่วน 0.625 ของความยาวทั้งหมด
2. เอา 0.625 ไปคูณกับความยาวเพลงทั้งหมด เช่น สมมติว่า เพลงยาว 3 นาที
3 นาที = 180 วินาที = 180000 มิลลิวินาที
0.625*180000 = มิลลิวินาทีที่ 112500 = วินาทีที่ 112.5
3. เอาไปใส่กับคำสั่ง start ของ Sound เช่น
my_sound.start(112.5);
ก็จะได้แถบเลื่อนเพลง หรือ Seek bar ครับผม
ถ้าเอาโค้ดจากของน้าแอ๊ดมาดัดแปลงเพิ่ม จะได้แบบนี้
อ้างอิงvar my_sound:Sound = new Sound();
my_sound.onLoad = function(success:Boolean) {
//ตรงนี้เป็นส่วนที่บอกว่า ระหว่างโหลด จะทำอะไรก็ว่าไป
//อย่างในที่นี้ ก็จะดึงค่าเวลาทั้งหมดของเพลงมาแสดง ( sound.duration = เวลาทั้งหมดของเพลง )
var totalSeconds:Number = this.duration/1000;
trace(this.duration+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
trace(minutes+":"+seconds);
};
my_sound.loadSound("test.mp3", true); //ไฟล์เพลงที่โหลดจากภายนอก
//ฟังก์ชั่นสำหรับเลื่อนเล่นเพลงไปยังจุดที่กำหนด
function Seek(ratio:Number){
var seekSecond = my_sound.duration*ratio/1000; //เอา ความยาวเพลง*อัตราส่วนระหว่างจุดพิกัดบาร์และความยาวของรางเลื่อน/1000
/// หาร 1000 เพื่อแปลงเป็นวินาที เนื่องจาก my_sound.duration จะได้ค่าออกมาเป็น มิลลิวินาที
/// 1 วินาที = 1000 มิลลิวินาที
my_sound.start(seekSecond);
}
แล้วถ้าเอาหลายๆ อย่างมารวมกัน จะได้ออกมาเป็นตัว Music Player แบบนี้ครับ
- เพลงโหลดเสร็จแล้วกดปุ่ม Play นะครับ (กดก่อนเพลงเสร็จเจอบั๊กไม่รู้ด้วยเน้อ)
- เพลงโหลดเสร็จแล้ว กดที่แถบสีเทา จะเป็นการ Seek ช่วงของเพลงครับ
http://www.27cstudio.com/korstudio/tutorials/flamp1/musicplayer_v2.swf
ตัวนี้ใช้ ActionScript 3 เขียนครับผม
ส่วนเวอร์ชั่นเก่า (ActionScript 1.0) มีให้โหลดตามนี้ครับ
musicplayer_v2.5.zip (http://www.27cstudio.com/korstudio/files/musicplayer_v2.5.zip)
ตัวนี้เก่ามาก บั๊กชุกชุม ใครโหลดไปแล้ว ผมฝากแก้ด้วยนะครับ :42:
โอ้วขอบคุณทั้งอาจารย์ดาห์ อาจารย์ก่อ และอาจารย์น้าแอด มากๆเลยครับเดี๋ยวผมจะไปลองทำดูบ้าง
แต่ก่อนใช้ MC Tween ก็ว่าไม่งงนะ
พอมาจับ Tweener มันทำอะไรได้เยอะก็จริง แต่งงมากๆ :30:
แล้วนี่อะไรกัน มีตัวอื่นอีกเรอะ :07:
อ้างคำพูดจาก: นายก่อ เมื่อ 12 พ.ย. 2008, 01:09 น.
เรื่องการโดดข้ามเพลง ไปยังช่วงเวลาที่กำหนด โดยเลื่อนบาร์
จะใช้การคำนวณตำแหน่งของบาร์ ให้เป็นตัวเลขอัตราส่วนครับ
แล้วเอาตัวเลขนั้น ไปคำนวณกับความยาวเพลงอีกทีนึง
ขออธิบายด้วยหลักการคำนวณธรรมดาๆ ก่อนนะครับ
สมมติว่า คะแนนสอบวิชาหนึ่ง มีคะแนนเต็ม 200 คะแนน
นาย ก. ได้คะแนน 125 คะแนน คิดเป็นอัตราส่วน 0.625 ของคะแนนเต็ม (125/200 = 0.625)
นาย ข. ได้คะแนน 75 คะแนน คิดเป็นอัตราส่วน 0.375 ของคะแนนเต็ม (75/200 = 0.375)
ในทางกลับกัน เราก็สามารถกล่าวว่า
นาย ก. ได้คะแนนเป็น 0.625 ของคะแนนเต็ม ดังนั้น นาย ก. ได้คะแนน 125 คะแนน (0.625*200 = 125)
นาย ข. ได้คะแนนเป็น 0.375 ของคะแนนเต็ม ดังนั้น นาย ข. ได้คะแนน 75 คะแนน (0.375*200 = 75)
-----------------
เอาการคำนวณเรื่องอัตราส่วนนี้ มาใช้กับเรื่องเสียงครับ
สมมติว่า รางของแถบเลื่อน มีความยาว 200 px
1. ตอนนี้ ลากบาร์ไปอยู่ที่ตำแหน่ง 125 px ก็จะคิดเป็นอัตราส่วน 0.625 ของความยาวทั้งหมด
2. เอา 0.625 ไปคูณกับความยาวเพลงทั้งหมด เช่น สมมติว่า เพลงยาว 3 นาที
3 นาที = 180 วินาที = 180000 มิลลิวินาที
0.625*180000 = มิลลิวินาทีที่ 112500 = วินาทีที่ 112.5
3. เอาไปใส่กับคำสั่ง start ของ Sound เช่น
my_sound.start(112.5);
ก็จะได้แถบเลื่อนเพลง หรือ Seek bar ครับผม
ถ้าเอาโค้ดจากของน้าแอ๊ดมาดัดแปลงเพิ่ม จะได้แบบนี้
แล้วถ้าเอาหลายๆ อย่างมารวมกัน จะได้ออกมาเป็นตัว Music Player แบบนี้ครับ
- เพลงโหลดเสร็จแล้วกดปุ่ม Play นะครับ (กดก่อนเพลงเสร็จเจอบั๊กไม่รู้ด้วยเน้อ)
- เพลงโหลดเสร็จแล้ว กดที่แถบสีเทา จะเป็นการ Seek ช่วงของเพลงครับ
http://www.27cstudio.com/korstudio/tutorials/flamp1/musicplayer_v2.swf
ตัวนี้ใช้ ActionScript 3 เขียนครับผม
ส่วนเวอร์ชั่นเก่า (ActionScript 1.0) มีให้โหลดตามนี้ครับ
musicplayer_v2.5.zip (http://www.27cstudio.com/korstudio/files/musicplayer_v2.5.zip)
ตัวนี้เก่ามาก บั๊กชุกชุม ใครโหลดไปแล้ว ผมฝากแก้ด้วยนะครับ :42:
อึ้ง ทึ่ง เสียว งง :30:
ขอบคุณอ.ก่อ มากครับ ถามอีกเรื่องครับ ถ้าจะtweener สีนี่แก้ตรงไหนบ้างครับ
เปิดใช้ Color Transform Shortcut ก่อนครับ
import caurina.transitions.properties.ColorShortcuts;
ColorShortcuts.init();
แล้วจะเลือกเปลี่ยนอะไรบ้าง ผมแนะนำไปดู Document ที่นี่เลยครับ
http://hosted.zeh.com.br/tweener/docs/en-us/ (http://hosted.zeh.com.br/tweener/docs/en-us/)
แล้วคลิกที่ เมนู
Special Properties > ColorShortcuts
มันจะมี Property ที่เราสามารถเอาไปใช้ได้ตามสะดวกเยอะแยะเต็มไปหมดเลยครับ
ตัวอย่าง
AS3.0
import caurina.transitions.Tweener;
import caurina.transitions.properties.ColorShortcuts;
ColorShortcuts.init();
//สร้าง MovieClip สี่เหลี่ยมสีดำ ขนาด 100x100 pixel
var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0x000000);
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();
//สร้าง tween ที่ค่อยๆ เปลี่ยนสีดำเป็นสีแดง ในเวลา 1 วินาที
Tweener.addTween(mc, {_color:0xFF0000, time:1, transition:"easeoutexpo"});
-------------
ส่วนที่บาร์เลื่อนแถบเสียงนั่น.. :44:
งงตรงไหนถามได้นะครับ ผมก็ว่ารีบเขียนไปหน่อย :05:
อยุธยายังไม่ไร้คนดี ขอบคุณครับ
เลยไปทางสระบุรีก็มีอีกคนนะครับ
ขยับเข้ามาแถวรังสิตก็จะมีอีกคนครับ
ต้องกดปุ่มแดงหรือเปล่าครับ เวลานี้? :30:
รบกวนสอนเราบ้างนะค่ะ :46: คือ เวลาที่เรากดปุ่มใดก็ตาม แล้วให้ไฟล์ของเดิมย้อนกลับก่อนอัตโนมัติเลย แล้วค่อยไปเล่นไฟล์หรือโหลดไฟล์ที่เราต้องการอะค่ะ? จะเขียน as ควบคุมมูฟวี่ยังไงหรอค่ะ
การทำงานเหมือนเวปนี้อะค่ะ http://www.thunderfuel.com/ << ลองดูตัวอย่างนะค่ะ
อ้างคำพูดจาก: kitty เมื่อ 14 ธ.ค. 2008, 21:54 น.
รบกวนสอนเราบ้างนะค่ะ :46: คือ เวลาที่เรากดปุ่มใดก็ตาม แล้วให้ไฟล์ของเดิมย้อนกลับก่อนอัตโนมัติเลย แล้วค่อยไปเล่นไฟล์หรือโหลดไฟล์ที่เราต้องการอะค่ะ? จะเขียน as ควบคุมมูฟวี่ยังไงหรอค่ะ
การทำงานเหมือนเวปนี้อะค่ะ http://www.thunderfuel.com/ << ลองดูตัวอย่างนะค่ะ
ศึกษาเรื่อง
gotoAndPlay();
gotoAndStop();
loadMovie();
ครับ
จารย์ก่อครับ ขอเรื่อง hitTest เนียนๆง่ายๆหน่อยสิครับ ผมไม่ค่อยสันทัดครับ :40: อย่าเพิ่งไป class นะ
อย่างเช่นวัตถุชนกัน , เล่นกับ shape ด้วยน่ะครับ
:46: ขอบคุณครับ จะเขียนเองแต่...ไม่ค่อยรู้เรื่องเลย :42:
// ลองทำดู ไอ้ shapeFlag มันไม่มีผลเลยอ่ะ
// มันมีผลแค่ตัวเดียว อีกตัวไม่มีผลแฮะ
เช่น ตัวนึงลากไปโดน ต้องเลือกว่าจะ shapeFlag กับตัวไหนรึไงครับ มันเล่นเชปกับทั้งตัวไปโดน ตัวยอมโดน ได้ไหม
หรือว่าต้อง เอา getBounds อะไรนั่นมาช่วยด้วย :44: หนูยังไม่เคยค่ะ แนะนำด้วยนะคะ
ขอเบิ้ลนะ
ไปลองเล่นกับ hitTest ง่ายๆมานิดหน่อย เลยทำเกมส์มาให้เล่น
ตัวเกมส์นี้ยังมั่วๆอยู่บ้างนะครับ คิดไปทำไป เพิ่มนิด เพิ่มหน่อย แก้นู่นแก้นั่น ไม่ได้คิดไว้ก่อน
สคริปเลยเยอะเพียบไปหมด ( เขียนตัวจับเวลาแล้วเอ๋ออีกต่างหาก เลยต้องยืมเขามา )
ใช้โค้ดพื้นฐานง่ายๆ
แต่ตัวนี้เวอร์ชั่นง่าย เพราะเวลาเช็คชนขอบ จะเป็นจุดกลางของลูกกลม กับเส้นขอบเท่านั้น จะมีพื้นที่เยอะก่อน hitTest จะทำงาน
ตัวยากยังทดลองอยู่ จะลองตั้งจุดเช็คการชนรอบๆวงกลมสัก 8 จุด ทีนี้ยากนรกเลย
หลักการทำงานก็ เช็คการชนกันระหว่าง เส้นขอบกับ ลูกกลม ด้วย mouseListener.onMouseMove
แต่ผมเพิ่มการเช็คอีกชั้นด้วยพื้นที่ภายใน ( b/ground ของทางวิ่ง ) กับลูกกลมด้วย (คือเช็คกันลากออกนอกทางด้วย )
พอลากออกนอกทางเร็วๆแล้ว ชั้นเดียวมันเหมือนทำงานไม่ทัน เลยซ้อนสองชั้น ซึ่งยอมรับว่ามั่วหน่อย
ถ้าชน ก็รันฟังชั่นต่างๆ ให้ทำอะไรก็ว่าไป ง่ายๆน่ะครับ
โค้ดไว้ก่อนนะ ...เยอะ อธิบายไม่ไหว
อย่าลืมเซฟเวลามาดูกันมั่งนะ :33: ช่วยหาแมลงด้วยนะครับ
// สามารถปล่อยเม้าส์เพื่อพักมือได้นะครับ แต่เวลาไม่หยุดนะเอ้า
THE WAY ... ทางนรกไม่หมกเม็ด by ej_sing ... ลุยโลด :07:
http://img3.f0nt.com/flash/878f657a4f7c830bfbfa442664251c1e.swf
ใครอยากให้อธิบายโค้ด ขอมานะครับ ว่างๆจะมาอธิบาย ( บองตรงๆว่าโค้ดผมห่วยหน่อยนะครับ สุยทำไปเรื่อยๆ ไม่ได้คิดล่วงหน้า)
// ผมเล่นไม่เคยผ่านเลยว่ะครับ :08: ....โทษเมาส์ไม่ดี :37:
ขอๆ :25:
:38: เอาจริงรึ มันห่วยนะ :08: พอเป็นแนวทางละกันนิ
// ลบอโค้ดไม่เกี่ยวออกเกือบหมดแล้ว
เริ่มเลยนะ
อ้างอิง
stop();
var shapeFlag = true;
finish_mc._visible = false; // อันนี้เป็น มูวี่ตอนจบ เอามันมาหลบไว้ก่อน ( จริงๆจะใช้ attach แต่ขี้เกียจ)
var mouseListener:Object = new Object(); // สร้าง event ตรวจจับการชน
mouseListener.onMouseMove = function() {
if (_mc2.hitTest(_mc._x, _mc._y, shapeFlag)) { // หากชนกับเส้นขอบ ให้รันฟังค์ชั่น out()
out();
}
if (!area.hitTest(_mc._x, _mc._y, shapeFlag)) { // เช็คขั้นที่สอง หากออกนอกทาง ให้รันฟังค์ชั่น out()
out();
}
if (finish_area.hitTest(_mc._x, _mc._y, shapeFlag)) { // หากถึงเส้นชัย ใหรันฟังค์ชั่น finish()
finish();
}
updateAfterEvent();
};
Mouse.addListener(mouseListener);
ที่ใช้ Listener เพราะเราเล่นเกมส์ด้วยการลากเม้าส์อยู่แล้ว เลยไม่ต้องใช้ enterFrame มาทำ event ในการตรวจการชน
ส่วนนี้คือ ลาก _mc เพื่อเล่นเกมส์
อ้างอิง
_mc.onPress = function() {
this.startDrag();
clockStart(); // ลากปั๊ป จับเวลาปุ๊ป
};
_mc.onRelease = function() {
this.stopDrag(); //เหนื่อยก็พัก ปล่อยเม้าส์ได้
};
ส่วนฟังค์ชั่นหลักๆ ก็ง่ายๆเลยครับ
เมื่อรันฟังค์ชั่นนี้ ก็จะ..
อ้างอิง
function out() {
clockStop(); // หยุดเวลาไว้
_mc.stopDrag(); // หยุดลาก
Mouse.removeListener(mouseListener); //ลบ event การตรวจจับการชน
_mc.gotoAndStop(2); // แสดงภาพระเบิด
delete _mc.onPress; // กันการลากต่อ ด้วยการลบ onPress ซะเลย
over_mc.gotoAndPlay(2); // แสดง มูวี่เกมส์โอเวอร์ มีปุ่มเริ่มใหม่อยู๋ข้างใน
}
// วิธีเริ่มใหม่คือ _root.gotoAndPlay(1) เพื่อรีเซ็ท ( แบบง่ายๆ ) // มั่วโคตรๆ
ผมปล่อยไทม์ไลน์หลักให้ไหลไปห้าเฟรมแล้วค่อยหยุดเพราะตัวเกมส์ และสคริปอยู่เฟรม 5
// อันนี้ฟังค์ชั่นเมื่อเล่นจบ
function finish(){
_mc.stopDrag(); // หยุดลาก
Mouse.removeListener(mouseListener); //ลบ event การตรวจจับการชน
delete _mc.onPress; // กันการลากต่อ ด้วยการลบ onPress ซะเลย
finish_mc._visible = true; // แสดง มูวี่เกมส์จบ มีปุ่มเริ่มใหม่อยู๋ข้างใน
clockStop(); // หยุดเวลาไว้
finish_mc.ftime_txt.text = total_time; // อันนี้แสดงเวลาที่เล่นจบ โดยดึงค่าจากตัวจับเวลามา
}
ส่วนแรก _mc2 ที่ทำเป็นเส้นขอบห้มาลากมาชน เป็น shape นะครับ ไม่ใช่ line
(http://img3.f0nt.com/11/dd5520294bf8e95d2f82f25219b6a234.jpg)
ส่วนอันนี้เป็น พื้นที่ด้านใน เอากันไว้ว่า ไม่ให้ลากออกนอกพื้นที่นี้
(http://img3.f0nt.com/11/f6a04513853adffa74e54231c80eac56.jpg)
จริงๆหลักๆก็มีแค่นี้ครับ
(http://img3.f0nt.com/11/3601892725229d994175f9e8b5f69161.jpg)
จบครับ ............. เรื่องตัวจับเวลาไม่ขอกล่าวนะครับ ยืมเว็บนี้มา _http://www.gieson.com/Library/projects/utilities/stopwatch/
ต้องกดซูมเล่นถึงจะรอด :30: (แต่ก็ตายปลายทาง)
ช่องแคบมากๆ :30:
57 วิครับ ใช้เมาส์ปากกาซะเลย :27:
:25: ชอบมาก
เจ๋งเลยครับพี่ ผมยังไม่เคยเล่นกับ hittest เลย
โชว์ซะหน่อย เล่นครั้งแรก ครั้งเดียวผ่านเลยนะ
แต่ปล่อยมือ ไป 5 ครั้ง ถอยหลัง 2 มิล ไป 1 ครั้ง
(http://img3.imageshack.us/img3/1263/91702464wf4.gif)
:31: สงสัยยากไปแฮะ
(http://img3.f0nt.com/11/07dfc6f51933a2f8a71ccc2881ffb5cb.jpg)
:47:
คลิกซ้าย 1 ที ขวา 1 ที มาคลิกซ้ายในวง GOAL
:38: เฮ้ยยยย ทำได้ไง
.....มีบั๊กอีกแล้ว ( ประจำ )
มาเฉลยด้วยนะครับ :05:
มีนวลอยู่ครับ
คลิกซ้าย 1 ที ขวา 1 ที ลากออกมาคลิกซ้ายในวง GOAL
สั่งห้ามคลิกขวาไปเลยครับ :30:
ห้ามคลิกขวาไม่ได้ครับ :08:
ผมมาช้าไปเหรอเนี่ย ขอโทษครับ น้าแอ๊ด :05:
(วันที่ 9 ผมอยู่ กทม. น่ะครับ ไม่ได้เข้าบอร์ดเลย)
มีทริคจำง่ายอยู่อันนึงครับ
shapeFlag เป็น false เอาไว้เช็ค วัตถุ กับ วัตถุ
shapeFlag เป็น true เอาไว้เช็ค จุด กับ วัตถุ
น้าแอ๊ดลองเปลี่ยนจากจับลาก ให้เป็นวิ่งตามเมาส์สิครับ ผมว่า โกงยากกว่าเดิม.. (รึเปล่า)
เย้ ชนะแล้ว ต้องโกงเท่านั้น :30:
อ้างอิง
shapeFlag เป็น false เอาไว้เช็ค วัตถุ กับ วัตถุ
shapeFlag เป็น true เอาไว้เช็ค จุด กับ วัตถุ
พอ true แล้ว มันเช็ค วัตถุตามรูป shape ได้ แต่ อีกวัตถุต้องเป็นจุดเท่านั้น
มันไม่มีวิธีที่ทำให้ เช็คตามรูป shape ทั้งคู่ ( ใช่ไหม )
จึงลองทำแบบ sensor หลายๆตัว ซึ่งแม่นยำกว่า
แต่ก็แค่นั้น .... ไม่รู้เอามาใช้อะไรอ่ะ พอรู็เรื่องแล้ว
เดี๋ยวทำแบบ sensor มาทิ้งไว้ให้ดูครับ
ว่าแต่ นี่มันอนุบาลแน่เรอะ :07:
:42: น่าจะ... นะครับ.....
น้าแอ๊ดเริ่มนะ ผมไม่เกี่ยว :30:
:07: อนุบาลสิน่า เพราะยังไม่ได้เขียนเลย จารย์ก่อไม่เขียนงั้นผมมั่วล่ะนะ
เริ่มด้วยง่ายๆที่สุด การชนกันของวัตถุ เราจะเช็ค โดยใช้
hitTest()อ้างอิง
hitTest(target:Object):Boolean
และ
hitTest(x:Number, y:Number, [shapeFlag:Boolean]):Boolean
คำสั่งนี้จะรีเทอร์นค่าเป็น true หรือ flase
ตัวอย่าง 1 เช่น
http://img3.f0nt.com/flash/73a40a90438574a399ac58fe6495939b.swf
ลองลาก ufo มาชนดูครับ
จากโค้ด
อ้างอิง
ufo_mc.onPress = function() {
this.startDrag();
this.onEnterFrame = function() {
if (plan_mc.hitTest(ufo_mc)) {
txt = "HIT !!!";
} else {
txt = "";
}
};
};
ufo_mc.onRelease = function() {
delete this.onEnterFrame;
this.stopDrag();
};
จากโค้ด จะเห็นว่า เราใช้แบบแรก
plan_mc.hitTest(ufo_mc) ( กรณีนี้ shapeFlag = false ครับ )
ซึ่งวิธีนี้ การตรวจการชนจะเป็นแบบกรอบสี่เหลี่ยม ( bounding box )
- ไม่ว่าวัตถุจะรูปทรงใดก็แล้วแต่ พื้นที่การตรวจจะเป็นสี่เหลี่ยมทั้งคู่แบบในรูปเป็นต้น
ufo_mc (http://img3.f0nt.com/13/bb5e51087cf31a047c045b83b6371108.jpg)
plan_mc (http://img3.f0nt.com/13/417caafc14ecef42f95c68408599d99c.jpg)
ตัวอย่าง 2 shapeFlag = true
http://img3.f0nt.com/flash/8b049dfded250b20d80433c8dda5258a.swf
อ้างอิง
ufo_mc.onPress = function() {
this.startDrag();
this.onEnterFrame = function() {
if (plan_mc.hitTest(ufo_mc._x,ufo_mc._y,true)) {
txt = "HIT !!!";
} else {
txt = "";
}
};
};
ufo_mc.onRelease = function() {
delete this.onEnterFrame;
this.stopDrag();
};
จากโค้ด
plan_mc.hitTest(ufo_mc._x,ufo_mc._y,true)จะเห็นว่า การชนจะขึ้นอยู่กับ
รูปร่างของวัตถุ กับ
จุด x,y ( x and y coordinates ) ของคู่กรณี
ีจะชนต่อเมื่อ
จุด x,y coordinates ของ ufo_mc ชนกับ
plan_mc ตามรูปร่าง (shape)จากตัวอย่างนั้น จุด x,y coordinates ของ ufo_mc จะอยู่กลางตามรูป
(http://img3.f0nt.com/13/0c57de7e7b32a05b5ab33e0e2a29b315.jpg)
ทีนี้ลองกลับโค้ดดูครับ
อ้างอิง
ufo_mc.hitTest(plan_mc._x,plan_mc._y,true)
ก็จะสลับกันล่ะ จะชนต่อเมื่อ
จุด x,y coordinates ของ plan_mc ชนกับ
ufo_mc ตามรูปร่าง (shape)http://img3.f0nt.com/flash/4ded6dfa28809d692d68b8bb1b7400ef.swf
อ้าววววว ..... ถ้าอยากให้มัน
ตรวจโดย shape ทั้ง คนชน และ คู่กรณี ล่ะ
ทีนี้ต้องเรียกประกันให้วุ่นเลยครับพี่น้อง อิอิ
ใครอยากแจมเชิญโลด
:46: :12:
ต่อเรื่อง hitTest()
ด้วยความอยากลอง จำลองหาวิธีทำ hitTest() ให้มันตรวจด้วยรูป shape ทั้งสองฝ่าย
ปรากฎว่า
ไม่ได้ (หรือป่าว ) มันทำได้แค่
อ้างอิง
- ฝ่ายแรก เป็นรูปทรง
- ฝ่ายที่สอง ต้องเป็นจุด x,y
( หรือกลับกัน )
จึงใช้วิธีแบบนี้แทน
อ้างอิง
- ฝ่ายแรก เป็นรูปทรง
- ฝ่ายที่สอง ต้องเป็นจุด x,y หลายๆจุด ( ขอเรียก sensor แล้วกันนิ )
โดยวิธียังมั่วๆอยู่นิดหน่อย และมั่วต่อๆมาอีกจึงรู้มาอีกว่า
ดูภาพนะ
(http://img3.f0nt.com/16/6b1aad76a8f6e2b5a55f0e9ea0cc04ff.gif)
ในภาพเป็น main_mc
ที่มี sub_mc อยู่ข้างในพิกัด(ภายใน)ของ sub_mc คือ _x = 14 , _y = 0
มันจะเห็น main_mc เป็นรูท ( อธิบายยากแฮะ :44: ) ขอเรียกว่ามันอิง local นะ
ไม่ว่าเราจะเรียกค่าพิกัด sub_mc._x , sub_mc._y เมื่อไร
มันจะเป็น x = 14 , _y = 0 แม้ว่า main_mc._x , y จะอยู่ที่ไหนในโลก
ปัญหาที่ผมเจอคือผมลองทำ sensor เป็น mc หลายๆ ตัว
อยู่ใน main_mc อีกที เพื่อไว้เป็นจุดเช็ค hitTest
แต่เมื่อเช็คเป็นจุด แต่ค่าพิกัดมัน local อยู่ ซึ่งอิงอยู่ใน main_mc ( ไม่ว่าจะเลื่อน main_mc ไปไหน ค่า sub_mc._x , y ก็ไม่เปลี่ยน)
จึงต้องทำค่าให้มันอิงกับ _root หลักก่อนโดย
อ้างอิง
public localToGlobal(pt:Object) : Void
// Converts the pt object from the movie clip's (local) coordinates to the Stage (global) coordinates.
อธิบายได้ว่า Converts the pt object from the movie clip's (local) coordinates to the Stage (global) coordinates.
ครับ :42: ก็ตามนั้นนะครับ ถ้ายังไม่เข้าใจก็....
จาร์ก่อ มาอธิบาย localToGlobal(pt:Object) ง่ายๆหน่อยสิครับ เอาวิธีใช้ง่ายๆด้วยนะครับ
ส่วนวิธีใช้ ยัง งงๆ อยู่ครับ แต่พอเข้าใจ ( เอ๊ะยังไง ) คือ ส่วนนี้ยังลอกวิธีเขามานิดหน่อย ( ขอข้ามไปนะ ให้จารย์ก่อมาอธิบาย)
จึงสรุปได้ว่า
ผมใช้วิธีวาง mc หลายๆตัว เป็น sensor ในการเช็ค hitTest แบบนี้ครับ
(http://img3.f0nt.com/16/359d7b6eaf95491e85c52f2b88c2bb86.gif)
แล้วเรียงชื่อ ลูปเช็คครับ ( ยิ่งเยอะ ยิ่งละเอียด) ผมลองใช้ 20 จุด
โค้ด เกินอนุบาลไปนิดเดียวเองครับ ลองดู
อ้างอิง
ufo_mc.onPress = function() {
this.startDrag();
_root.onEnterFrame = function() {
for (i=1; i<=20; i++) {
this["point"+i] = {x:ufo_mc["chkmc"+i]._width/2, y:ufo_mc["chkmc"+i]._height/2};
ufo_mc["chkmc"+i].localToGlobal(this["point"+i]);
if (plan_mc.hitTest(this["point"+i].x, this["point"+i].y, true)) {
txt.gotoAndPlay(2)
}
}
};
};
ufo_mc.onRelease = function() {
delete _root.onEnterFrame;
this.stopDrag();
};
http://img3.f0nt.com/flash/0f9f4910a9382528b2ced40e504880b6.swf
ทีนี้ก็สามารถเช็คละเอียดๆ ได้แล้วครับ
แต่ อันนี้ดูเป็นแนวนะครับ โค้ดนี้ใช้งานจริงยังไม่ได้นะครับ
มันจะทำงานหนึ่งครั้ง ต่อ 1 sensor หาก โดนทั้ง 20 sensor ก็จะทำงาน 20 ครั้งครับ
จริงๆน่าจะลูปเก็บเป็นอาเรย์ครั้งเดียวดีกว่า หรือใครคิดออกเอามาแจมเลยครับ ตอนนี้หมดมุขแล้ว :42:
เขียนๆทำๆไว้ก่อนไว้มาอ่านทีหลังจะได้ไม่ลืม :22:
มีพาดพิงด้วยอะ :30:
ส่วนมาก localToGlobal นี่ ผมไม่ค่อยได้ใช้เลยครับ เพราะเราก็สามารถคำนวณเองได้ง่ายๆ
แบบนี้ครับ
สมมติให้ -
MovieClip A รูปสี่เหลี่ยม วางอยู่บน Stage ที่พิกัด 100,100
-
MovieClip B รูปสี่เหลี่ยม วางอยู่ใน MovieClip A ที่พิกัด 100,100
- ทั้ง A และ B ต่างก็มี Registration Point (จุดกากบาทที่ใช้อ้างอิงตำแหน่ง) อยู่มุมซ้ายบนของรูป
(http://img3.f0nt.com/16/be0d5a3187786f6f838d6e44fa40b443.jpg)
เอาละครับ ถ้าจะเรียกค่าตำแหน่งของ B ล่ะ?
เราก็สามารถเรียกได้ดังนี้
trace(A.B._x);ได้ผลคือ 100 ครับ
แต่ 100 นี่คือพิกัดอะไร?
มันคือ พิกัดของ B ที่อ้างจากจุด 0,0 ของ A ครับ (ดูภาพประกอบ ที่เส้นประสีแดง)
แล้วถ้าเราอยากรู้ว่า B มันอยู่ตำแหน่งไหนของ Stage ล่ะ?
ง่ายๆ เลย คือ เราก็เอาพิกัดของ A มาบวกเพิ่มครับ แบบนี้
trace(A._x + A.B._x);ได้ผลคือ 200 ครับ
ดังนั้นเราจะได้พิกัดของ B ที่อยู่บน Stage คือ 200
--------------------
แต่ว่า เราจะมานั่ง + ให้วุ่นวายก็ยังไงอยู่
มันเลยมีคำสั่ง
localToGlobal มาให้ครับ
**หมายเหตุ**
วิธีใช้คำสั่งนี้ มันจะดูงงๆ หน่อยนะครับ ผมก็ไม่ค่อยเข้าใจทำไมเค้าทำมาแบบนี้เหมือนกัน :30:
(เป็นเหตุผลหนึ่งที่ผมเลี่ยงไปใช้วิธีชาวบ้านๆ :30:)ขั้นแรก ให้ตั้งตัวแปรชนิด Object ขึ้นมาครับ เพื่อเก็บ Local Coordinates หรือ พิกัดภายใน หรือถ้าดูจากรูปที่ผมแปะ มันคือพิกัดของ B ครับ
(ใน Object ต้องมีชื่อตัวแปร x และ y อยู่ครับ ชื่ออื่นไม่ได้)
var BPoint = {x: A.B._x, y: A.B._y};ลองดูค่าพิกัดซิ...
trace( BPoint.x + ":" + BPoint.y );ได้ออกมาว่า
อ้างอิง100:100
จากนั้น ให้เราทำการเรียก localToGlobal ที่ MovieClip ที่เราอ้างจุดกำเนิดมันมาครับ (อธิบายไงดีหว่า) ถ้าดูจากรูป นั่นคือ MovieClip A น่ะครับ
(เพราะ B อยู่ใน A และพิกัดของ B นั้น จะอ้างอิงจากจุดกำเนิดของ A ครับ)
แล้วก็เอาพิกัดของ B ใส่เข้าไป
A.localToGlobal( BPoint );เสร็จแล้ว โปรแกรมจะคำนวณผลพิกัดให้ แล้วเอาค่า ไปแทนที่ค่า x และ y ใน BPoint ให้เองครับ
trace( BPoint.x + ":" + BPoint.y );จะได้ผลคือ
อ้างอิง200:200
สรุปโค้ดอีกทีvar BPoint = {x: A.B._x, y: A.B._y};
trace( BPoint.x + ":" + BPoint.y ); //100:100
A.localToGlobal( BPoint );
trace( BPoint.x + ":" + BPoint.y ); //200:200-----------------------
แต่โดยส่วนตัวแล้ว ผมมักจะเช็คแค่ 4 จุดเท่านั้นครับ คือ
- xMin ค่า X ที่ขอบซ้ายของวัตถุ
- xMax ค่า X ที่ขอบขวาของวัตถุ
- yMin ค่า Y ที่ขอบบนของวัตถุ
- yMax ค่า Y ที่ขอบล่างของวัตถุ
ซึ่งสามารถหาได้จากคำสั่ง getBounds() ครับผม
var bounds = A.getBounds();
trace( bounds.xMin );
trace( bounds.xMax );
trace( bounds.yMin );
trace( bounds.yMax ); :08: ใช้ 4 จุดเองครับ เพราะว่าเกม บางทีถ้าไม่ต้องการความแม่นยำสูงมากๆ ผมก็เอาแค่นี้พอละครับ
ส...ส..ส....ส...ส.ส.สุดยอดดดดดดด :53: :53: :53: :53: :53:
ขออนุญาต นำข้อมูลไปสอนน้องๆ นะครับ :46:
ปล. มีปัญหากับเรื่อง hit test พอสมควร...แต่รู้สึกตอนนี้โล่งๆ แล้ว
โอ้ว ขอบคุณมากๆ ครับ :25: :25: :46:
เอามาทำเป็นเกมเกิมอะไรเล่นท่าจะสนุกนะ
อ้อ พอดีเคยเจอตัวอย่างในเว็บสอน hitTest เมื่อนานมาแล้วครับ (จำที่มาไม่ได้ละ)
เจอการเช็ก hitTest แบบเช็กตรงขอบของวัตถุด้วยล่ะ แถมเขียนโค้ดไม่ซับซ้อนด้วย
เลยลองทำดู พอเสร็จแล้วมันออกมาเป็นแบบนี้ (ต้องคลิกในแฟลชทีนึงก่อนถึงจะบังคับได้)
http://img3.f0nt.com/flash/d611f6883551e5c2911ca73a8ab1ca4d.swf
อันนี้คือเขียนโค้ดลงใน mc ตัว อ อ่างเลยครับ
รบกวนจานผู้ชำนาญการช่วยแปลงเป็นโค้ดใน Time Line
ให้เข้าใจง่ายๆ และสละสลวยกว่านี้หน่อยครับ
(พอดีตอนนั้นที่ทำก็แก้มั่วๆ เอาจนได้แบบนี้)
ต้นฉบับ CS3
v
v
ของพี่แอนเช็คยังไงอะครับ กดเอาไอตัวเขียวๆ เดินทะลุ อ ได้นะครับ แล้วก็เหมือนว่าตรงที่เหมือนว่าจะโดนก็กลางลูกเขียวแล้ว
มันมีคำสั่งที่บอกว่า getBound น่ะ
คือเอาขอของก้อนนึงมาปะทะขอบอีกก้อนนึง
ในที่นี้ตูเขียนให้ปกติเราบังคับก้อนเขียวได้อิสระ
แต่พอไปโดน อ ปั๊บ มันจะหนืด
:06:
เข้าห้องอนุบาล แต่อ่านแล้วปวดกบาลมากครับ :18: :30: :33:
สงสัยต้องเข้าโรงเรียนกวดวิชาระดับอนุบาลก่อนถึงจะเข้าใจนะเนี่ย ...
ขอทำความเข้าใจกับ as เยอะๆก่อน แล้วจะแวะมาใหม่นะ ห้องอนุบาล ฯ :44: :17:
:08: อ่านหน้าแรกเลยครับ อนุบาลจริงๆ นะ
อย่าพึ่งตกใจครับ หน้าหลังๆ เลยวัยอนุบาลมาแล้วน่ะครับ :44:
หลังนี่น่าจะเตรียมขึ้นม.ปลายแล้วนะ
:44: ผมไม่ผิดนะ เบิร์ด เค้าขอมา ผมก็จัดให้แค่นั้นเองนะ
เค้าไม่ผิดน้าว์ :56:
ไม่คิดเลยอ.ก่อจะเป็นคนแบบนี้ :56:
ใจร้ายที่สุด มาเป๋จู่อนุบาลให้กลายเป็นมัธยม
งั้นเราก็แก้ด้วยการให้จอมพลังสักคนมาแตกหน่ออกไปเลยก็สิ้นเรื่องหนิครับ
เราจะมีตั้งแต่
เตรียมอนุบาล
อนุบาล
ประถม
มัธยมต้น
มัธยมปลาย
ฯลฯ
:30: โอ้ว ความคิดดีมากๆ ครับ เดี๋ยวให้จอมพลังมาจัดการให้ดีกั่ว
เป็นอนุบาลที่ซีเรียสที่สุดในโลก :05:
อนุบาลหมีบัดซบ
:05: :05: :05:
ถามอ.ก่อต่ออีกนิดครับ ไหนๆก็เป๋แล้ว
ผมมีmc ตัวนึงเอาทำเป็น hi light ปุ่ม 3 ปุ่ม
แต่ทั้งปุ่ม มีขนาดยาวไม่เท่ากัน เลยต้องการ ให้ตัวmc ที่เป็น hi light ปรับขนาดไปไปตามความยาวแกนx ด้วยอะครับ
b1.onRelease=function(){
hilight_mc.onEnterFrame = function(){
this._x += (-6.5-this._x)/8;
if(Math.abs(this._x - 10) <= 0.5 && Math.abs(this._y - 300) <= 0.5){
delete this.onEnterFrame;
}
};
b2.onRelease=function(){
hilight_mc.onEnterFrame = function(){
this._x += (-6.5-this._x)/8;
if(Math.abs(this._x - 10) <= 0.5 && Math.abs(this._y - 300) <= 0.5){
delete this.onEnterFrame;
}
};
b3.onRelease=function(){
hilight_mc.onEnterFrame = function(){
this._x += (20-this._x)/8;
if(Math.abs(this._x - 10) <= 0.5 && Math.abs(this._y - 300) <= 0.5){
delete this.onEnterFrame;
}
};
ปุ่ม b1 ยาว 44
ปุ่ม b2 ยาว 61
ปุ่ม b3 ยาว 30
ตอนผมทำการเขียนให้มันวิ่งมาที่ปุ่มได้แล้ว แต่ยังปรับตัวขนาดmc ที่เป็นhi liight ไม่ได้
ใครก็ได้ ช่วยดูอันนี้ให้ทีครับ เผื่อมีประโยชน์สำหรับคนสนใจเรื่อง hitTest :05:
(คือตูดูแล้วรู้สึกว่ามันน่าจะง่ายกว่าเช็กทีละจุดหลายๆ จุดน่ะครับ)
อ้างคำพูดจาก: แอนดูมาโอ๊ะ เมื่อ 17 ก.พ. 2009, 23:35 น.
โอ้ว ขอบคุณมากๆ ครับ :25: :25: :46:
เอามาทำเป็นเกมเกิมอะไรเล่นท่าจะสนุกนะ
อ้อ พอดีเคยเจอตัวอย่างในเว็บสอน hitTest เมื่อนานมาแล้วครับ (จำที่มาไม่ได้ละ)
เจอการเช็ก hitTest แบบเช็กตรงขอบของวัตถุด้วยล่ะ แถมเขียนโค้ดไม่ซับซ้อนด้วย
เลยลองทำดู พอเสร็จแล้วมันออกมาเป็นแบบนี้ (ต้องคลิกในแฟลชทีนึงก่อนถึงจะบังคับได้)
http://img3.f0nt.com/flash/d611f6883551e5c2911ca73a8ab1ca4d.swf
อันนี้คือเขียนโค้ดลงใน mc ตัว อ อ่างเลยครับ
รบกวนจานผู้ชำนาญการช่วยแปลงเป็นโค้ดใน Time Line
ให้เข้าใจง่ายๆ และสละสลวยกว่านี้หน่อยครับ
(พอดีตอนนั้นที่ทำก็แก้มั่วๆ เอาจนได้แบบนี้)
ต้นฉบับ CS3
v
v
เอาทีละคนเด่อ
ของเบิร์ด
ใช้ _width ครับ ค่อยๆ บวก _width ของตัว hilight จนเท่ากับ _width ของตัวปุ่มครับ :12:
this._width += (_root.b1._width-this._width)/8;
อารมณ์ประมาณนี้ครับ
-------------------------
ของพี่แอน..
เอ่อ เหมือนที่ผมแนะไว้ด้านบนเลยน่ะพี่ ผมก็ใช้ getBounds() อะครับ เพราะเช็คแค่ 4 จุดก็เหลือเฟือแล้ว
แล้วก็เอาทั้ง 4 จุดมา if else เช็คด้วย hitTest อีกทีนึงครับ
จากจุดนี้จะได้ if else 4 ครั้งต่อกัน (ที่ต้องทำ 4 ครั้งเพราะมันครอบคลุมกว่าอะครับ)
ค่อยๆ เช็คสลับกันไป แบบนี้ครับ
1. เช็ค xMin กับ yMin
2. เช็ค xMin กับ yMax
3. เช็ค xMax กับ yMin
4. เช็ค xMax กับ yMax
ของพี่แอน ผมว่าเจ๋งดีแฮะ มีหนืดๆ ด้วย :30:
อ้างคำพูดจาก: นายก่อ เมื่อ 19 ก.พ. 2009, 11:51 น.
เอาทีละคนเด่อ
ของเบิร์ด
ใช้ _width ครับ ค่อยๆ บวก _width ของตัว hilight จนเท่ากับ _width ของตัวปุ่มครับ :12:
this._width += (_root.b1._width-this._width)/8;
อารมณ์ประมาณนี้ครับ
-------------------------
ทำได้แล้วครับ ขอบคุณอ.ก่อมากครับ :25:
จารย์ก่อ
getBounds() จริงๆแล้ว มันเช็คเป็นแบบ สี่เหลี่ยมใช่ไหมครับ
นั่นสิ สงสัยว่าทำไมของตูที่แปะไว้มันไม่เห็นต้องระบุพิกัดอะไรเลย :09:
if (this.hitTest(getBounds(_root).xMax, _y, true)) {
_x -= 2;
}
if (this.hitTest(getBounds(_root).xMin, _y, true)) {
_x += 2;
}
if (this.hitTest(_x, getBounds(_root).yMax, true)) {
_y -= 2;
}
if (this.hitTest(_x, getBounds(_root).yMin, true)) {
_y += 2;
}
นี่แหละพี่ ที่เอาไว้เช็ค + ระบุพิกัดล่ะ..
เช็คเป็นสี่เหลี่ยมครับ แต่เป็นสี่เหลี่ยมที่ชิดกับรูปร่างมากที่สุด
จานก่อช่วยอธิบายโค้ดตรงนั้นให้หน่อยสิ :25:
ว่ามันแปลว่าอะไร เช็กยังไง ไม่เข้าใจหลักการครับ
ก่อนอธิบายนะครับ ขอบอกนิดนึงว่า
โค้ดที่พี่แอนเขียน.. มีจุดที่ยังไม่ดีอยู่ครับ (คือมันไม่เหมาะสมน่ะครับ)
โค้ดเก่า
onClipEvent (enterFrame) {
with (_root.player) {
//
// บังคับ
if (Key.isDown(Key.DOWN)) {
_y += 3;
}
if (Key.isDown(Key.UP)) {
_y -= 3;
}
if (Key.isDown(Key.LEFT)) {
_x -= 3;
}
if (Key.isDown(Key.RIGHT)) {
_x += 3;
}
//
// เช็กขอบ
trace(this._name);
if (this.hitTest(getBounds(_root).xMax, _y, true)) {
_x -= 2;
}
if (this.hitTest(getBounds(_root).xMin, _y, true)) {
_x += 2;
}
if (this.hitTest(_x, getBounds(_root).yMax, true)) {
_y -= 2;
}
if (this.hitTest(_x, getBounds(_root).yMin, true)) {
_y += 2;
}
}
}
ตรงไหน มาดูัโค้ดกันก่อนครับ
if (this.hitTest(getBounds(_root).xMax, _y, true)) {
_x -= 2;
}
จากโค้ดเราจะได้ว่า
- this หมายถึงตัว "อ" และ
- คำสั่งที่ไม่ได้ขึ้นต้นด้วย this จะมหายถึง "ลูกบอล"
เพราะ มีการคร่อมด้วย
with(_root.player){
//
}
ดังนั้น Property ที่อยู่ข้างใน with และไม่ได้ขึ้นด้วย this หรือ _root จะหมายถึง Property ของ player ทั้งหมด
ส่วนตรงโค้ด แปลเอาตรงๆ เลยนะครับ
ถ้า ตัว "อ" (this) ไปชนกับ
- พิกัด y ของลูกบอล และ พิกัดจุด xMax ของ ลูกบอล บนพิกัดของ _root (เลื่อนไปดูแผนภาพที่ผมทำไว้ก่อนหน้านี้ครับ ว่าพิกัดของ _root หรือ Stage เป็นยังไง)
- โดยดูรูปร่างของวัตถุด้วย (ลูกบอลเป็นวงกลม)
แล้ว.. ให้ลดพิกัด x ของลูกบอลลง 2
โดย xMax เนี่ยคืออะไร?
xMax คือขอบขวาของ ลูกบอล ครับ (ในกรณีนี้) แต่ปกติถ้าไม่ใส่ _root และลุกบอลอยู่ใต้ MovieClip อื่น
มันจะอ้างตำแหน่งจาก MovieClip ตัวนั้นแทนครับ
ดังนั้น ถ้าเราใส่ _root ลงไปด้วย ก็จะเป็นการบอกว่า ให้แปลงพิกัดของลูกบอล เป็นพิกัดที่วัดจาก 0,0 ของ _root ครับ
(ไปดูแผนภาพประกอบนะครับ)
(อันอื่นๆ ก็ใกล้เคียงกัน)
แต่!! (อีกที) เขียนแบบนี้ ไม่ดีครับ (ผมไม่ได้บอกว่า ผิด นะครับ) เพราะ
1. สิ่งที่ควรเขียนบนลูกบอล เอาไปใส่บน "อ"
- แบบนี้ถือว่าเป็นการเขียนสคริปต์ที่ "ผิดจุดประสงค์" ครับผม เพราะฉะนั้น ถ้าจะสั่งลูกบอล ก็ควรเขียนสคริปต์ที่ลูกบอลครับ
- เอาให้ลึกกว่านี้ เค้าจะเรียกว่า การ Delegate งานครับ หรือก็คือ การแจกแจงงานที่ถูกต้อง ให้คนที่รับงานที่ถูกต้อง หรือ The right job to the right man ประมาณนี้ครับ
2. ไม่ควรเขียน getBounds ซ้ำหลายรอบ
- เพราะอะไร? เพราะว่า ในทางทฤษฎีแล้ว ตัวโปรแกรม จะต้องทำการ getBounds ใหม่ทุกครั้งที่มีการเรียก ดังนั้นใน 1 รอบ enterFrame มันจะต้องทำคำสั่ง getBounds ถึง 4 รอบเลยทีเดียว!!
- คำนวณเอาง่ายๆ ครับ ถ้าเล่นสคริปต์นี้ไป 3 วินาที จะทำงาน getBounds ทั้งหมด
3 x 30 x 4 = 270 ครั้ง!!!
และถ้า getBounds 1 คำสั่ง ใช้เวลาทำงาน 10 มิลลิวินาที ก็จะหมายความว่า เราใช้เวลารันสคริปต์นี้
270 x 10 = 2700 มิลลิวินาที!! = 2.7 วินาที นี่นับเฉพาะ getBounds นะครับ ถ้ามีคำสั่งอื่นอีก ก็จะเกิดการ "หน่วง"
- แต่นี่เป็นการเทียบง่ายๆ ครับ จริงๆ อาจทำงานเร็วกว่านี้เยอะมากๆ :30:
- เพราะฉะนั้น อะไรที่คงที่ ก็เรียกครั้งเดียวพอครับ
- ขั้นนี้เรียกว่าการ Optimize ครับ ปรับแต่งโค้ด อะไรที่คิดว่าทำให้โปรแกรมหน่วง ก็พยายามลดลงๆ เป็นต้น
หลังจากปรับโค้ดพี่แอนแล้ว จะได้แบบนี้ครับ
onClipEvent(load){
//สั่งใช้ getBounds ที่เดียว ตอนที่โหลดโปรแกรมเสร็จ
var ballBounds = this.getBounds(_root);
}
onClipEvent (enterFrame) {
//
// บังคับ
if (Key.isDown(Key.DOWN)) {
_y += 3;
}
if (Key.isDown(Key.UP)) {
_y -= 3;
}
if (Key.isDown(Key.LEFT)) {
_x -= 3;
}
if (Key.isDown(Key.RIGHT)) {
_x += 3;
}
//
// เช็กขอบ
//เช็คว่า่ "อ" ชนกับลูกยอบตรงไหน โดยเรียกผ่าน ballBounds วึ่ง ballBounds จะเก็บค่า xMin, xMax, yMin, yMax ทั้งหมด
//และในการเรียก ballBounds แต่ละรอบ จะไม่ได้มีการเรียก getBounds ใหม่ แต่จะเอาค่าที่เก็บไว้มาใช้ only
if (_root.อ.hitTest(ballBounds.xMax, _y, true)) {
trace("xMax");
_x -= 2;
}
if (_root.อ.hitTest(ballBounds.xMin, _y, true)) {
trace("xMin");
_x += 2;
}
if (_root.อ.hitTest(_x, ballBounds.yMax, true)) {
_y -= 2;
}
if (_root.อ.hitTest(_x, ballBounds.yMin, true)) {
_y += 2;
}
}
โค้ดนี้เอาไปใส่ที่ player ที่เดียว ส่วนตัว "อ" ก็ใส่ Instance Name ว่า อ ครับ
โอ้ว ละเอียดมาก :25: ขอบคุณครับ
อันนี้คือใส่โค้ดลงใน mc ชื่อ player ใช่ไหมครับ
แล้วถ้าเราจะย้ายโค้ดทั้งหมดลงไปใน timeline ล่ะ :09:
ขอเบิ้ลนะครับ
สงสัยว่าทำไมมันแสดงผลออกมาเป็นแบบนี้
http://img3.f0nt.com/flash/1aa14702012ea90fe9fbcd948dde4db2.swf
เหมือนว่ามันไม่หนืดเลย :09:
อันนี้อันเก่า
อ้างคำพูดจาก: ไอ้แอนนนนน เมื่อ 17 ก.พ. 2009, 23:35 น.
http://img3.f0nt.com/flash/d611f6883551e5c2911ca73a8ab1ca4d.swf
:05: ผมผิดเอง ต้องเอา
var ballBounds = this.getBounds(_root);
ไว้ใน enterFrame ครับ แล้วตัด onClipEvent(load) ทิ้งไปเลยครับ
แบบนี้
onClipEvent (enterFrame) {
//
// บังคับ
if (Key.isDown(Key.DOWN)) {
_y += 3;
}
if (Key.isDown(Key.UP)) {
_y -= 3;
}
if (Key.isDown(Key.LEFT)) {
_x -= 3;
}
if (Key.isDown(Key.RIGHT)) {
_x += 3;
}
//
// เช็กขอบ
var ballBounds = this.getBounds(_root);
if (_root.อ.hitTest(ballBounds.xMax, _y, true)) {
trace("xMax");
_x -= 2;
}
if (_root.อ.hitTest(ballBounds.xMin, _y, true)) {
trace("xMin");
_x += 2;
}
if (_root.อ.hitTest(_x, ballBounds.yMax, true)) {
_y -= 2;
}
if (_root.อ.hitTest(_x, ballBounds.yMin, true)) {
_y += 2;
}
}
อ๋อ คือยังงี้มันก็จะเช็กทุกเสี้ยวินาทีเหมือนเดิม ไม่ใช่แค่ครั้งแรก
แต่ว่าไม่หน่วงเหมอืนเก่าใช่ไหมครับ
แต๊งกิ้วๆ :27:
:46: ด้วยคนครับ
พอเข้าใจเรื่อง getBounds() แล้วครับ ใช้ง่ายกว่าเยอะ
ไอ้ของเช็คจุดๆของผม ไม่ต้องไปสนนะ :30: ทำเอาอยากรู้
ยังคิดอยู่เลยว่ามันเอามาทำอะไรได้มั่ง จะเช็คเห่าอะไรขนาดนั้น(วะ) :30:
เขียนcodeให้โหลดไฟล์ swf มาบน scene แรก
แต่พอเปลี่ยนsceneไฟล์swf ที่อยู่บนscene แรกมันไม่หายอะครับ จะremove ออกไงครับ
unloadMovie(MovieClip)
ลองดูหรือยังครับ
มีประโยชน์จิงๆคับ นับถือเลย
ว่าแต่ถ้าเราจะเพิ่ม มูวี้คลิบเข้าไปในตัว mc ของได้อีกหรือเปล่าคับ หรือจะสั่งgeturl เราจะทำยังไงอะคับ เพนสะตอนนี้มันเป้น on(release) กะ on(press) อยู่
อ้างคำพูดจาก: ej_sing เมื่อ 13 ธ.ค. 2007, 02:11 น.
ต่อ....จากอันบนนั้นที่ไม่มีใครสนใจ :34:
เฉลย ในแบบผมเอง ด้วยสมองน้อยๆคิดแบบง่ายๆ
เพราะี้จำไม่ได้หรอก ว่า mc อันไหนสร้างก่อนหลัง mc อันไหนอยู่ลำดับที่เท่าไร ใช่ไหมจ๊ะ
ผมจึงตั้งค่าแรกของลำดับชั้นไว้ เอาสูงกว่าทุกตัวเยอะๆหน่อยก็ได้ เอาไว้อ้างอิงไง
จากตรงนี้ ถ้าใครเผลอมาอ่าน ลองคิดตามช้าๆด้วย
สมมุติว่า ให้
ื
ตอนนี้ n เป็นค่าลอยๆที่ mc ทุกตัวต้องหยิบเอามาใช้อ้างอิง depth เพื่อสั่งลำดับชั้นตัวเอง
คือจัดลำดับชั้นกันใหม่เริ่มจากค่านี้เลย
โดยให้ mc ตัวไหนก็ตาม swapDepth() ด้วยค่า n และใหบวกเพิ่มขึ้น 1
และลำดับชั้นของตัวแรกที่กด ก็คือ 2 เพราะเราบวกค่า n เพิ่มขึ้น 1 แน่นอนสูงสุดๆเลย ห่างจากลำดับล่างๆเป็นหมื่นชั้น
ตอนนี้ n กลายเป็น 2 แล้วนะจ๊ะ เพราะเรา บวก 1 ไปแล้ว
พอตัวที่สองกดปั๊ปก็ swapDepth() ด้วยค่า n อีกและให้บวกเพิ่มขึ้น 1 ค่า
ซึ่งลำดับชั้นของตัวที่สองที่กด ก็คือ 3 สูงกว่าเมื่อกี้อีก 1
ตอนนี้ n กลายเป็น 3 แล้วนะจ๊ะ เพราะเรา บวกเพิ่มอีก 1
.... 4
.. 5
. 6
มันก็จะเพิ่มค่า n เรื่อยๆโดยไม่มีการซ้ำกันของลำดับชั้นในแต่ละ mc ครับ
งงไหมครับ :22: ไม่งงนะ
ทีนี้มาดูสคริปกัน
จากอันที่แล้ว เราจะเพิ่ม swapDepths() กันล่ะ
เอาสคริปนี้ใส่ใน mc ทั้งห้าตัว ก็จะได้ตามตัวอย่างนี้แล้วครับ :22:
// อันนี้ผมทำให้เห็นลำดับชั้นของแต่ละตัวด้วยครับ และใช้ฟังชั่นง่ายๆเอาครับ
จริงๆแล้วเริ่มลำดับที่ -16000 ก็ไ้ด้ครับ จะเห็นว่าค่าแรกเริ่มมันก็ -163xx โน่นแน่ะ :08:
http://img2.f0nt.com/flash/29d916d550236c0f3db8eb194c713dfe.swf
หวังว่าคงเข้าใจกันบ้างนะครับ
หากไม่เข้าใจ :05: ลองค่อยๆอ่านนะครับ จริงง่ายๆครับ แต่ตัวหนังสือเยอะไปนิดนึง ไม่รู้จะพิมพ์ทำไมเยอะแยะ
ทำ quiz นับคะแนนทำยังไงครับ :09:
:55: คำถามมันค่อนข้างกว้างนะเคน
เอาเป็นว่า เราเคยเขียน ActionScript มาบ้างยังอะ..
ตัวอย่าง.. (ต้องการแบบนี้เรอะ?)
http://img3.f0nt.com/flash/73c21b798a93bd3c258671a61a31952f.swf
ตัวนี้สุ่มโจทย์และคำตอบด้วย
ใช่ครับ ทำระบบรวมคะแนนไม่เป็น :53:
(ไม่ต้องสุ่มนะครับ เดี๋ยวงง)
แก้ไข:หลังจากที่รวมรวบความขยันค้นด้วยกูเกิลแล้วทำเป็นแล้วครับ :31:
:05: พิมพ์ตั้งนานหายหมดเลย เพราะไฟล์แนบไม่เป็น rar
งั้นเอาสั้นๆ กระชับๆ
มีส่วนที่แก้ได้อยู่ 2 ที่ :37:
1. แก้เรื่องสุ่ม/ไม่สุ่ม ดูบรรทัด 7
var isRandom = false;false = ไม่สุ่ม
true = สุ่ม
:37: จบ!! ง่ายมาก!!
:30:
2. เพิ่ม/แก้/ลบ คำถาม
อ้างอิง/////Questions declaration///////
//[QUESTION,CHOICE A, CHOICE B, CHOICE C, CHOICE D, CORRECT BUTTON]
items_details[0] = ["Question 1", "10", "20", "30", "40", "a"];
items_details[1] = ["Question 2", "abc", "def", "ghi", "jkl", "c"];
items_details[2] = ["Q 3", "aa", "bb", "cc", "dd", "a"];
เรียงตามลำดับเลยนะครับ
อ้างอิงitems_details[ข้อที่ n-1] = ["คำถามข้อที่ n", "ตัวเลือก a", "ตัวเลือก b", "ตัวเลือก c", "ตัวเลือก d", "เฉลย"];
งงมั้ยหว่า :44:
งงก็ถามได้เลยนะครับ
ขอบคุณครับ กำลังหาวิธีทำอยู่พอดี :45: +
ขอบคุณครับ กำลังศึกษา ไม่อยากเอาไปแก้ส่งเฉยๆ ถ้าไม่รู้เรื่องจริงๆค่อยใช้วิธีชาวบ้านๆ :47b:
ขอบคุณครับมีประโยชน์มากๆเลยครับ ตอนนี้อ่านไปได้ 10กว่าหน้าแล้ว
:45:
คือผมลองทำเกมส์ดูนะครับ แต่หลังจากปาของชิ้นแรกแล้ว มันแปลกตรงที่ของชิ้นที่2มันมองไม่เห็นครับแต่มันมีตัวตนอยู่เพราะ traceเห็น คงผิดพลาดอะไรซักอย่าง
http://img3.f0nt.com/flash/5815ce79b83b0b7ecbe3f8f881afed88.swf
fla อยู่ด้านล่างนะครับ
ถามต่ออีกหน่อยผมจะแบ่งให้ขยะกับถังมันเป็นหมวดหมู่ยังไงี
แบบ ถังสีเหลือง ถ้าobj1 นี้ปาลงถัง+ 5 คะแนน แต่obj2ถ้าลงไปต้อง-10ครับ ถ้าเป็นอันเดียวก็ไม่มีปัญหาแต่ถ้ามีหลายๆออบเจ็คจะแบ่งวิธีไหนให้่ายที่สุดครับ
ยังไม่ได้โหลดดูนะครับ แต่ขอตอบอีกเรื่องก่อน
เราก็กำหนดไว้ในใจว่า ถังเหลืองเป็นหมายเลข 1 ถังเขียวเป็นหมายเลข 2 และถังฟ้าเป็นหมายเลข 3
จากนั้นเ้วลาสร้าง MovieClip ที่เป็นขยะออกมาก็กำหนดไปเลยว่า ชิ้นนี้ต้องลงถังไหน (1 2 หรือ 3)
เสร็จแล้วก็เอาค่าตัวนั้นไปเช็คดูเวลาขยะโดนถังอีกที
สมมติให้ขยะผัก = mc1
สั่งให้
mc1.trashID = 3; //สั่งให้ขยะผัก ต้องลงถังฟ้า
ทีนี้ตอนลงถังขยะก็เช็คดู
if(this.hitTest.................){
if(this.id == target.trashID){
//เช็คว่า ถ้า id ของถัง ตรงกับ trashID ที่อยู่ในตัวขยะ
score += 5;
}
}
ประมาณนี้ครับ
ตัวนี้จะเป็นเบื้องต้นของการคิดเขียนโปรแกรมเชิงวัตถุครับ
คือ ค่าไหน เป็นค่าเฉพาะของวัตถุ ก็เก็บไว้ในวัตถุซะ ประมาณนั้น
สุดยอดเลยฮะ จานก่อ กำลังหาวิธีทำแบบนี้อยู่พอดี :25:
:01: ยังแก้ไม่ได้เลย เหมือนตึดอะไรอยู่นิดๆแต่นึกไม่ออก :30: แต่ก็ต้องขอบคุณน้องก่อมากๆนะครับ :25: :19: :19:
แก้ได้แล้วให้เจ้านายมาช่วยแก้ให้ซะงั้น อายจังเจ้านายไม่เคยทำแฟลชเป็นโปรแกรมเมอร์ แต่มานั่งดูแล้วเขียน as ได้เลย :03:
จากโค้ดที่เขียนต้องรีเซ็ทตำแหน่งทุกครั้งหลังจากปาแล้วด้วยครับ
ดูแล้วน่าจะลืมเซ็ทค่า startTrachX, startTrachY ครับ
ประมาณนั้นครับ ลองใส่ 0 เข้าไปก็จบแล้วครับ เส้นผมบังภูเขา
อ้างอิง
function nextTrash() {
var myArray = new Array();
myArray = ["obj1", "obj2", "obj3", "obj4", "obj5", "obj6", "obj7"];
objRandom = Math.floor(Math.random()*7);
boy.attachMovie(myArray[objRandom],"objTrash",10000,{_x:0, _y:0});
...
...
ขอบคุณครับพี่ :19: :19:
:56: น้าแอ๊ดเท่ที่ซู้ดด
อยากใ้ห้ช่วยสอนการใช้คำสั่ง setInterval ใน ActionScript 2.0 ให้หน่อยอะครับ
:55: ถ้าบอกว่าลองดูใน help ก่อนจะว่าไรตูมั้ยอะเบิร์ด..
แปะไว้ก่อน เดี๋ยวมาสอนๆ
อ๊ะ.... ลืมไป :03:
เหมือนพยายามหาแล้วแต่ไม่เจอ เดี๋ยวลองค้นดูอีกรอบละกันฮะ
---------------------------------------------------------------------
ว่าละทำไมหาไม่เจอ setintarval :30:
:46:ขอความกรุณาท่านผู้รู้คะ คือว่าอยากกำหนดขนาดภาพที่แสดง
เช่น มีภาพขนาด 200x100 กับ 250x50 จะให้ภาพออกมาแสดงเป็นขนาน ??x100
ด้วยการเปลี่ยน height เป็นขนาด 100 มีฟังก์ชั่นหรือคำสั่งที่สามารถทำได้บ้างคะ
คำนวณโลดครับ ไม่มีวิธีลัด :12:
:46: ขอบคุณมากๆนะคะ
รบกวนอีกเรื่องหนึ่งคะ คือมีรูปให้ี user กด แล้วทำการสร้างเป็นรูปเดิมแต่ชื่อใหม่ขึ้นมาเพื่อให้ user กดไปวางที่ที่กำหนด
โดยรูปนั้นยังคงติดอยู่ที่เมาส์จนกว่า user จะทำการคลิกไปวางพื้นที่ๆกำหนดให้ แล้วรูปนั้น user จะกดกี่ครั้งก็ได้
ไม่ทราบว่าพอจะมีวิธีทำแบบไหนได้บ้างคะ
:05: งงคำถามครับ อีกทีได้ไหมครับ?
คือมีของอยู่อันนึง คลิกปั้บมันก็จะติดเม้าส์จนกว่าจะคลิกอีกที เพื่อที่จะวาง แล้วของอันนี้จะคลิกย้ายกี่ทีก็ได้ :37:
ใช่ปะครับ
ไม่ใช่ว่าเป็นแบบที่พี่เบลบอก
แต่ของเดิมยังอยู่(สร้างชิ้นใหม่)หรอกหรอ
:38: อ๋ออ แบบนี้นี่เอง
งั้นใช้
onRelease
duplicateMovie
startDrag
stopDrag
แล้วก็การเก็บค่าในตัวแปร ครับ :12:
หลักการคือ
พอคลิกที่ MovieClip (ขอย่อว่า mc นะครับ) ก็ให้สั่ง duplicate ตัวมันเองก่อน
(อาจปรับ _alpha ให้ลดลงด้วย เพื่อเป็น effect บอกผู้ใช้ครับว่ากำลังลากอยู่)
จากนั้นก็สั่งให้ตัวที่ถูก duplicate ออกมา ติดเมาส์ไปด้วยคำสั่ง startDrag
แล้วจุดนี้ ก็เก็บค่าไว้ในตัวแปรซักตัว เพื่อบอกว่า ตอนนี้เรากำลังลาก mc อยู่
พอผู้ใช้คลิกอีกครั้ง ก็ไปเช็คค่ากับตัวแปรครับว่า อยู่ในสถานะที่เรากำลังลากอยู่หรือไม่
ถ้าใช่ ก็สั่ง stopDrag แล้วก็กำหนดค่าให้ตัวแปรนั้นใหม่ ว่าเราจะวางแล้ว
:12: ลองดูครับ ผมไม่อยากให้โค้ดเต็มๆ นะ เพราะมันเหมือนว่าเราไม่ได้ฝึกใช้งานมันน่ะครับ
อ.ก่อครับ flash ที่ผมส่งเมล์ไปให้ได้รับรึเปล่าครับ อยากจะให้ช่วยดูcodeให้หน่อย
:55: อุ้ย เดี๋ยวตูดูในเมลอีกทีนะ เบิร์ด
อ้างคำพูดจาก: ก่อสตูดิโอเอ็กซ์ทู เมื่อ 21 ก.ย. 2009, 02:38 น.
:38: อ๋ออ แบบนี้นี่เอง
งั้นใช้
onRelease
duplicateMovie
startDrag
stopDrag
แล้วก็การเก็บค่าในตัวแปร ครับ :12:
หลักการคือ
พอคลิกที่ MovieClip (ขอย่อว่า mc นะครับ) ก็ให้สั่ง duplicate ตัวมันเองก่อน
(อาจปรับ _alpha ให้ลดลงด้วย เพื่อเป็น effect บอกผู้ใช้ครับว่ากำลังลากอยู่)
จากนั้นก็สั่งให้ตัวที่ถูก duplicate ออกมา ติดเมาส์ไปด้วยคำสั่ง startDrag
แล้วจุดนี้ ก็เก็บค่าไว้ในตัวแปรซักตัว เพื่อบอกว่า ตอนนี้เรากำลังลาก mc อยู่
พอผู้ใช้คลิกอีกครั้ง ก็ไปเช็คค่ากับตัวแปรครับว่า อยู่ในสถานะที่เรากำลังลากอยู่หรือไม่
ถ้าใช่ ก็สั่ง stopDrag แล้วก็กำหนดค่าให้ตัวแปรนั้นใหม่ ว่าเราจะวางแล้ว
:12: ลองดูครับ ผมไม่อยากให้โค้ดเต็มๆ นะ เพราะมันเหมือนว่าเราไม่ได้ฝึกใช้งานมันน่ะครับ
หลังจากลากว่างได้ตัวนึงแล้ว จะลากใหม่ให้เกิดตัวใหม่ ทำอย่างไรครับ
พอดีจับว่าง ได้ โอ้ว!! ก็พอรู้เรื่องแหะ พอกดอีกที เอย!! รูปที่ลากไปว่างครั้งแรกหาย ได้อีกอันมาแทน :08:
แบบนี้น่าจะเป็นที่ ชื่อของ MC ใช่หรือเปล่าครับ หรืออย่างไร งงจร้า~~
ตอนสั่ง duplicate น่ะครับ มันจะให้ใส่ depth
ตรงส่วน depth ให้ใส่ _root.getNextHighestDepth() ครับผม
อ้างคำพูดจาก: เบล เมื่อ 18 ส.ค. 2009, 06:54 น.
สุดยอดเลยฮะ จานก่อ กำลังหาวิธีทำแบบนี้อยู่พอดี :25:
:05: อีเบล เฟคอะ รับไม่ได้
:46: ขอบคุณมากๆนะคะ
โปรเจ็คนี้ยังพอมีความหวังที่จะรอด
อ้างอิงคลิกเลือกที่ปุ่มนั้น กด F9 เปิด action script panel ขึ้นมา ไม่ต้องตกใจ ไม่น่ากลัวอย่างที่คิด
พิมพ์ลงไปว่า
on(release){ //อธิบายได้ว่า เมื่อกดแล้วปล่อยปุ่มนี้
play() //ให้ "เล่น"
}
แต่ผมต้องแก้ไอ้ release เป็น press แทน ไม่งงแล้ว :33: :33:
จากเรื่อง การทำซ้ำ หรือ duplicateMovieClip()
ที่ประมาณหน้า9อ่ะครับ
ตรงสลิปที่คลิกแล้วดาวจะโผล่มาแบบไม่จำกัดอ่ะครับ
คือว่าถ้าผมคลิกไปเยอะๆแล้ว แล้วแบบว่าจะลบดาวที่ผมคลิกทั้งหมดให้เหลือดาวต้นแบบเหมือนเดิม
ควรจะใช้ แอ๊คชั่นcodeอะไรหรือครับและเป็นรูปแบบใดช่วยทีนะครับขอบคุณมาก
1. เวลาสร้าง ให้เก็บดาวที่สร้างในอาร์เรย์ครับ
2. สั่ง remove โดยการวนลูปในอาร์เรย์ทีละตัวครับ
อ้ะ ผมไปตอบให้ในนี้แล้วครับ
http://www.f0nt.com/forum/index.php/topic,17306.msg1386111.html#msg1386111 (http://www.f0nt.com/forum/index.php/topic,17306.msg1386111.html#msg1386111)
ขอบคุณครับ :45:
ขอบคุณมากครับจะลองไปประยุกต์นะ
http://www.thaifirefox.co.cc/flash/Untitled-1.fla123456789.swf
ทำได้แค่นี้แหละ
http://www.madoosi.com/up_images/201002/13264068d108c6901b3592ea654fcd57_9.swf
ส่งการบ้าน
http://img3.f0nt.com/flash/d811c16b7ee252a9329282201fb722aa.swf
คือผมนั่งลองทำปุ่ม เล่นดูแล้วติดปัญหาอะครับ คือ
ผมเ้ซ็ตให้ปุ่มให้เป็น ปุ่มแรกไปหน้าสี่เหลี่ยม ปุ่มสองไปหน้าวงรี ปุ่มสามไปหน้าห้าเหลี่ยม
แต่ถ้าอยู่ที่หน้าสี่เหลี่ยม แล้วคลิ๊กปุ่มแรกมันจะไปหน้าวงรีแทน แล้วปุ่มสองไปหน้าห้าเหลี่ยมแทน แล้วปุ่มสามไปหน้าแรก
เหมือนกับว่าถ้าไปหน้านั้นแล้ว ถ้าคลิ๊กปุ่มเดิม มันจะถูกลิงค์์ไปเฟรมถัดไปแทน
เลยงงว่ามันเป็นเพราะอะไรฮะ
ฝากผู้รู้ช่วยแนะนำด้วยครับ
อยากห็นสเต๊บที่คุณทำไว้ไม่ทราบว่า จะขอชมได้มั้ย
โหลดตัวงานไปแกะชมได้เลยครับ
เปลี่ยน _root.gotoAndPlay เป็น _root.gotoAndStop ทั้งหมดเลยครับ
ถึงแม้เราจะใส่ stop() ไว้ที่เฟรม แต่การสั่ง gotoAndPlay ไปย้ำๆ ที่เฟรมเดิม มันก็จะวิ่งต่อไปที่เฟรมอื่นให้
(ไม่รู้ว่าเค้าตั้งใจหรือเป็นบั๊กนะ หะๆ)
อ๋อ อย่างนี้นี่เอง ขอบคุณครับ +
ส่งการบ้าน
http://www.madoosi.com/up_images/201003/8a341964644ae6c16d48315e4e6f0b32.swf
http://www.madoosi.com/up_images/201003/e0e1d64fdac4188f087c4d44060de65e.swf
http://www.madoosi.com/up_images/201004/1b40275c06024f6067c812585a4a07a0.swf
:34: จะขอบคุณ หรือจะอะไรครับ..
ขอบคุณคะ :01:
เค้าอาจจะคิดว่าเป็นอีโมแลบลิ้นนิดๆ แล้วขยิบตาแบบน้องนิว 4 เมกหรือเปล่า :56:
ช่วงนี้สาวกใหม่ใช้หลายคนมากอะ :08:
มันเป็นพวก user โฆษณาสแปมน่ะครับ ลบไปละ
(วันนี้ล่าไป 5 ตัว ไม่สนุกเท่าที่คิด)
ให้อาจารย์จักรีฟังค่ะhttp://megaswf.com/file/69436.swf
รู้ได้ไงครับว่าผมชอบเพลงนี้ :50:
เดาเอาค่ะ :33:
:45: ได้ความรู้กลับไปเยอะเลย
มีเรื่องถามหน่อยครับ พวก head menu ที่เป็น flash บนหน้าเว็บเดียวกันส่วนด้านล่างเป็นหน้าเว็บแบบดึง php เอา
พอเวลาที่เราคลิ๊กที่หน้าอื่นมันจะโหลดหน้านั้นใหม่ทั้งหน้า ก็จะเจอกับปัญหาที่ว่า ตัวflash จะโหลดตัวเองใหม่เหมือนกัน
ทำให้ทำไฮไลท์ ที่เมนูหน้าปัจจุบันนั้นๆไม่ได้ จะต้องแก้ยังไงครับ รบกวนด้วยครับ
เดี๋ยวจะลองหาเว็บมาประกอบความเข้าใจนะครับ
คือผมคิดว่า ถ้าเป็น page ที่แยกเทมเพลตกัน ต้องเขียนสคริปรับค่าจากไฟล์ ตามยูอาแอลแล้วเข้ามาเช็คในแฟลช
แต่ถ้าเป็นเขียนจากเทมเพลตเดียวกัน ตามหลักการณ์มั่วๆ แล้ว ผมคิดว่าน่าจะเป็นไปได้ที่จะเขียนเช็คในแฟลชได้เลยนะครับ
เช่นเขียนว่า ถ้ากดปุ่มล่าสุดก็ให้ไฮไลท์ปุ่มล่าสุดเอาไว้ แต่เขียนอย่างไงนั้น ............อืม นั่นซิ
http://img3.f0nt.com/flash/df21019dcd089503e17f7d45fed70115.swf
ถามหน่อยครับ ถามหน่อยครับ คือว่าตอนทำmovie ถ้าลากเมาส์โดนปุ่มแล้วลากออกปุ่มจะไม่เล่นอะไร ต้องคลิ๊กถึงจะโชว์แล้วพอเอาเมาส์ออกมันก็จะเฟดภาพให้หายไป
ตอนนี้ติดปัญหาว่าไอ้ต้องคลิ๊กปุ่มแล้วเลื่อนออกมันแล้วไอ้รูปใหญ่มันไม่เล่นต่ออะครับ
วานผู้รู้ช่วยด้วยครับ :46:
อยากอธิบายแต่ลำดับไม่ถูก :3005:
ตอนนี้ทำยังไงอะครับ
ก็สร้างปุ่มbutton ที่ไว้อยู่ที่ hit แล้วมวางทับกับตัวMC จะใช้เป็นปุ่มจริงที่จริง แล้วใส่ AS ลง button อะครับ
on (release) {
if (!b1.release) {
b1= true;
gotoAndPlay(15);stop();
} else {
b1 = false;
gotoAndPlay(16);
}
// end if
}
ไว้บนปุ่มครับ
แนบไฟล์ไปเผื่อกันงงแล้วกัน
http://www.up-thai.com/?cmd=upload_view&id=2274 (http://www.up-thai.com/?cmd=upload_view&id=2274)
(พีแอนปุ่มแนบไฟล์มันหายไปไหนอะ) :09:
ผม งง ฮ่าๆ กับคำถามอะครับ คืออยากให้มันเป็นไงนะ เอาเม้าส์ไปชี้ แล้วเป็นสีตามที่เมาส์ชี้ พอเอาเมาส์ออก ก็ เฟสไปเรื่อยๆ เหรอครับ
ใกล้เคียงครับ แต่ที่ผมต้องการเป็นคลิ๊กแทน แล้วถ้าอันไหนที่ไม่ได้คลิ๊กก็อยู่นิ่งๆก่อนกครับลากเข้าลากออกไม่มีผล
ตอนนี้มันมีปัญหาที่มีว่าคลิ๊กแล้วลากออกมันไม่ออกอะครับ
ถ้าพี่เข้าใจไม่ผิดกับครับอธิบายที่เบิร์ดอยากให้เกิดนะ
ที่เบิร์ดทำ ในเงื่อนไขมันไม่มีทางเป็น false เลยครับ เบิร์ดเช็คแค่ตอน release แต่ไม่ได้เช็คตอนเอาเมาส์ออกมานี่ครับ ลองใช้ rollOut
ก็ได้แล้วจ๊ะ (อีกอย่างไม่ต้องใส่ค่าตัวแปล true false ก็ได้มั้ง)
เมื่อวานลองพยายามจะเขียน เป็น else if เหมือนกันครับ แต่เวลามีน้อย เลยทำแค่เป็น rollover แทน release ส่งไปแต่มันค้างในหัวจิตหัวใจครับ อยากรู้...
ขอบคุณพี่พันเอกครับเดึ๋ยวกลับไปลองคืนนี้ครับ
พึ่งโหลดไฟล์มาดูไม่ต้องใส่ if else แล้วจ้า
on (release) {
gotoAndPlay(105);
/*if (!b1.release) {
b1 = true;
stop();
} else {
//b1 = false;
//gotoAndPlay(106);
}*/
// end if
}
on (rollOut) {
//b1 = false;
gotoAndPlay(106);
}
ใช้ rollOut อย่างเดียวก็ได้แล้วนิ
ทำไมผมลองแล้วยังไม่ได้คลิ๊กลากออก มันก็ยังเฟดหายอยู่อะครับ
แนบไฟล์มาหน่อยดิ พี่ขอดูหน่อยซิ
http://www.up-thai.com/?cmd=upload_view&id=3989 (http://www.up-thai.com/?cmd=upload_view&id=3989)
อันนี้งานจริงครับ แต่ผมกำลังลองแก้แค่ปุ่มแรกเท่านั้นเอง
(เขียนเองมึนเอง)
เบิ้ลหน่อยครับ ทำได้แล้วครับ ขอบคุณพี่พันเอกมากครับ :46:
เอามาฝากค่ะ http://www.iamtum.com/ (http://www.iamtum.com/)
ช่วยดู code ให้หน่อยครับ พอดีอยากเขียนให้เป็น swapDepths แบบ rollover แต่มันไม่เด้งขึ้นมาอะครับ
n = 0;
xx.swapDepths(999);
b2.onRollOver = function ()
{
b2.swapDepths(_root.n = _root.n + 1);
};
b2.onRollOut = function ()
{
};
โค๊ด swapDepths เอามาจากน้าแอ็ดอีกทีที่เคบชยลงไว้ ขอขอบคุณน้าแอ็ดมา ณ ที่นี้ด้วยครับ :46:
--------------------------------------------------------
ทำได้แล้วครับ
:30: กำลังดูโค้ดเลยอ้ะ
รอ ก่อ มาสอน switch/case แล้วฮร้าฟ... :52:
:07: แว้ก
ความจริง switch/case เนี่ย มันคือ if/else อีกแบบนึงครับ
แต่ให้ดู syntax ของ switch/case ก่อน
switch ( variable ) {
case value1 : statement; break;
case value2 : statement; break;
...
case valueN : statement; break;
default : statement;
}
switch/case ส่วนมากจะใช้ตอนตรวจเช็คค่าของตัวแปร 1 ตัวครับ โดยมันจะดูเป็นเงื่อนไขๆ (case) ไป
ถ้าค่าของตัวแปร ตรงกับ case ไหน ก็จะทำงานคำสั่ง (statement) ของ case นั้น
และจะทำต่อใน case อื่นไปเรื่อยๆ จนกว่าจะเจอ break หรือหมดทุก case ครับ
และถ้าเกิดค่าที่มาเปรียบเทียบ ไม่ตรงกับ case ไหนเลย มันจะวิ่งไปทำที่ default ครับ
แต่ถ้าไม่มี default มันก็จะออกจาก switch/case ไปเลย
ซึ่งเราสามารถเปรียบเทียบกับ if/else ได้ประมาณนี้
if( variable == value1 ) {
statement;
} else if( variable == value2 ){
statement;
} ....
} else if( variable == valueN ){
statement;
} else {
//default
statement;
}
ตัวอย่างเช่น
var number:int = 15;
//ส่ง number ไปตรวจเช็ค
switch ( number ) {
case 1: trace("number is too low"); break;
case 10: trace("number is close"); break;
case 15: trace("correct"); break;
default: trace("incorrect");
}
โค้ดข้างบน จะได้ออกมาว่า correct ครับ
ซึ่งการทำงานมันจะทำตามลำดับ จากบนลงล่างดังนี้
1. switch รับตัวแปร number เข้ามาตรวจเช็ค
2. ค่า number ไม่เท่ากับ 1 (case 1) กระโดดข้ามไป
3. ค่า number ไม่เท่ากับ 10 (case 10) กระโดดข้ามไป
4. ค่า number เท่ากับ 15 (case 15) ทำงานคำสั่ง trace("correct"); และจบการตรวจสอบเงื่อนไข (break)
ถ้าใน case 15: ไม่มี break มันจะทำงานในเงื่อนไข default ด้วยครับ
มันจะต่างจาก if/else นิดหน่อยตรงนี้
switch/case ผมมองว่า มันเอามาสำหรับเช็คเงื่อนไขในแบบ == (เทียบเท่ากับ) และไม่ต้องเขียนยาวๆ สำหรับคนขี้เกียจครับ
ซึ่งจะไปใช้ if/else เหมือนเดิมก็ไม่ได้ผิดอะไรฮะ แค่ขี้เกียจเฉยๆ :30:
ขอบคุณมากครับ +
กระทู้นี้ ไอ้คนเริ่มต้น(ฉันเอง) มันไม่ค่อยว่างมาสอนแล้วนะครับ และไม่ค่อยได้ทำ flash แล้วครับ
หากใครต้องการร่วมแบ่งปันความรู้ หรือมีเวลาว่างพอ ก็สานต่อได้เลยครับ
เดี๋ยวว่างๆโอกาสหน้า จะมารื้อฟื้นตัวเอง ด้วยการสอนของตัวเอง :08: อีกครั้งครับ (ตอนนี้เข้าหม้อหมดแล้ว)
ถึงตรงนั้น คงมีเรื่องปัญหาแปลกๆ ปัญหาหยุมหยิมที่ได้เจอจากการทำงานจริงๆ มาแบ่งปันเพื่อนๆครับ
//
พอดีมีคนเมล์มาให้ช่วยดูสคริปและปรึกษา ก็อยากช่วยนะครับ
แต่หมดไฟ ไร้ความสามารถเรื่อง flash แล้วครับ
มีคำถามรอเป็นโอ่งมังกร รอถามน้าแอ๊ดเยอะเลยครับ :56:
:08: ถามจารย์ก่อเลยครับ :17:
(โยนกันดื้อๆนี่ล่ะ :30:)
:0705:
มาขอแนวทางครับ
คือตอนนี้ โจทย์คือ จะต้องทำ
- randomรูปจากarray ขึ้นมาโดยeffectกำหนดตายตัวไปแล้ว -------- ทำได้แล้ว
- รูปจะมีtext คู่เปลี่ยนกับไปตลอด โดยที่textจะอยู่ตำแหน่งเดิมตลอดเปลี่ยนแค่ข้อความ
ข้อนี้ถ้าทำphp แยกเป็นไฟล์ๆไป โดยรูปนึงไฟล์นึงก็พอยังทำเป็นอยู่ครับ แต่มาเป็น array ยังทำไม่เป็นครับ
- รูปและtext ถูกส่งมาเป็นรูปแบบ array แยกเป็น array รูปชุดนึง array ข้อความชุดนึง โดยที่ รูปที่1 จะใช้กับข้อความที่1 ตลอด ในไฟล์php
- รูปต้องใส่เองได้ไม่จำกัดโดยแค่ทำการ browse จากback office
ผมไม่ได้ทำในส่วนของphp อะครับ แค่รอรับค่าจาก array ที่เค้าจะส่งมาเฉยๆ
รบกวนด้วยครับ :56:
ขอบคุณครับ กำลังสนใจอย่างจริงจัง :46: