ขอเบิ้ลครับ มาตาลาย + ปวดกระโหลกกัน
ประเด็นของงานข้างบนนั้นคือ
การอ้างชื่อ path ครับ ในกรณีที่เป็นการเรียกแบบลูป
หรือ ชื่อ mc มีการเรียงกันโดยตัวแปร(เพื่ออะไรสักอย่าง แรนด้อมเรียกชื่อใดๆ ลูปเรียง ฯลฯ )
ของผมเรียกโดยวิธีนี้
ret_mc.cir_mc["tri_mc"+m]ของ...^-FakE-^ ( ขออภัย
จำชื่อจริงๆไม่ได้ เปลี่ยนชื่อกันซะงง
) ที่ส่งมาแบบไฮโซ
เรียกโดย ใช้ eval()
eval("ret_mc.cir_mc.tri_mc"+(i+1))
สังเกตุวิธีเขียนครับ สำคัญทีเดียวครับ
ที่เอามาอธิบายก็เพราะ.........ชอบลืมน่ะครับ
เอามาลงไว้จะได้ไม่ลืม มาดูได้ตลอด
ตัวอย่างง่ายๆ
ถ้าสมมุติเราจะแรนด้อม 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 แต่ใช้ [] เอามาติดกันเลย
วุ๊ยยยอธิบายไม่เป็น ดูเอาคงเข้าใจนะครับ
ทีนี้ถ้ากรณี path ลึกเข้าไป อย่างในตัวทดสอบขำๆนั่น ก็ซ้อนๆกันจนถึงชื่อที่ต้องการ
แบบนี้ไงครับ
ret_mc.cir_mc["tri_mc"+m] ไม่อธิบายนะ คงเข้าใจเนาะ
เอาล่ะ ทีนี้ ประเด็นหลัก (ทำไมมันหลายหลักจังวะ) .......อันนี้หลักกว่าๆครับ
ไม่เอา _root หรือ this นำหน้า _root["mc"+i] ได้ไหม เขียนโต้งๆเลย ["mc"+i] ?เพราะเคยคุยไว้ว่า หากมีการโหลดมูวี่เข้ามาจากภายนอก (
จริงๆอธิบายคร่าวๆไปครั้งนึงแล้วครับ)
ก็จะสับสนเรื่อง _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() คือ มันจะคืนค่า ตัวแปร หรืออะไรๆ ออกมาเป็นชื่อ (ผมอธิบายถูกมั๊ย ....ไม่รู้แล้วเสือกมาทำเก่งอีก
)
//แก้ให้ถูกต้อง
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() มันน่าจะมีมากกว่านี้นะ แต่ผมใช้แค่นี้เอง
ครับ น่าจะพอเข้าใจเนาะ
เรื่องหยุมหยิมที่ไม่มีใครมาอธิบายหรอกครับแบบนี้
นอกจากไอ้ขี้ลืมอย่างผม มาอธิบายให้ตัวเองไว้กลับมาอ่านน่ะครับ