วันพุธที่ 18 พฤษภาคม พ.ศ. 2554

คาบที่ 14 ตัวแปร และ ฟังก์ชั่น

วันก่อน ผมไปเจออะไรน่าสนใจที่เกี่ยวข้องกับการทำงานของฟังก์ชั่นและตัวแปร จากเว็บ TFD

นั่นคือ การสร้างตัวแปรภายในและภายนอกฟังก์ชั่น มันต่างกันอย่างไร

var pick:int = 20;

function pock(){
gotoAndStop(pick);
}
pock();

และ

function pock(){
var pick:int = 20;
gotoAndStop(pick);
}
pock();

สองชุดสคริปนี้ต่างกันอย่างไร

- ถ้าให้สคริปทั้งสองทำงาน ในกรณีนี้ การทำงานของทั้งคู่จะไม่มีความแตกต่าง นั่นคือ จะไปหยุดที่เฟรมที่ 20
แต่ความจริงแล้วมีความแตกต่างกันอย่างเห็นได้ชัด นั่นคือ

ถ้าลองใส่คำสั่ง

trace(pick);

ลงไปแล้วลองแสดง คุณจะเห็นความแตกต่าง นั่นคือ ค่าในสคริปแรก จะได้เท่ากับ 20 และสคริปที่ 2 จะได้เท่ากับ error

อ้าว error ได้ไง

ได้ครับ เพราะตัวแปรที่สร้างในฟังก์ชั่นหรือสร้างในคำสั่งนั้น จะไม่สามารถเรียกได้จากภายนอก แต่สามารถเรียกได้เฉพาะภายในคำสั่งนั้นเท่านั้น
เช่น

function pick(){
var p:int = 10;
trace(p);
}
pick();
trace(p);

ในที่นี้จะมีการ trace 2 ครั้ง ครั้งแรกในฟังก์ชั่น และครั้งที่ 2 นอกฟังก์ชั่น เมื่อทำการแสดงในโปรแกรม ค่าที่ออกมาที่ output จะ error จาก trace ภายนอก เพราะตัวแปร p สร้างขึ้นในฟังก์ชั่น การเรียกถามตัวแปรนอกฟังก์ชั่นไม่สามารถทำได้ เพราะถ้าการทำงานของฟังกชั่นจบลงแล้ว ตัวแปรนั้นก็จะถูกโปรแกรมเคลียร์ไป (เขาว่ากันแบบนั้นนะ) แต่ถ้าคุณลบ trace(p); ที่อยู่ข้างนอกฟังก์ชั่นออกไป โปรแกรมก็จะทำงานเป็นปรกติ


ของพวกนี้รู้ไปเพื่ออะไร

แน่นอนครับว่า ทุกความรู้ต้องมีประโยชน์ ดังนั้น เมื่อคุณต้องการเขียนงานแฟลชอะไรสักอย่าง คุณต้องวางแผนให้ดี ถ้าตัวแปรที่คุณสร้าง ต้องโยงการทำงานระหว่างฟังก์ชั่นโน้นฟังก์ชั่นนี้ คุณต้องสร้างตัวแปรไว้นอกฟังก์ชั่น เท่านั้นแหละครับ สาระสำคัญ

สรุป

จะสร้างตัวแปรต้องคิดถึงการใช้ด้วย ถ้ามีหลายจุดต้องอ้างอิงตัวแปรนี้ คุณต้องสร้างตัวแปรไว้นอกฟังก์ชั่น


คาบนี้แค่นี้ คาบหน้าเจอกันใหม่ครับ

2 ความคิดเห็น:

  1. if (hp <= 0)
    {
    stage.removeEventListener(Event.ENTER_FRAME,onLoop);
    for (var i:Number = 0; i < monster.length; i++)
    {
    monster[i].removeEventListener(Event.ENTER_FRAME,onMoveMonster);
    stage.removeChild(monster[i]);
    }
    gotoAndStop(4);
    }

    เวลา Ctrl+enter แล้วมันกระพริบระหว่างเฟรม1กับ4 อะ T.T มันผิดที่ไหน

    ตอบลบ
  2. ครับ ก่อนอื่นมาทำความเข้าใจกับส่วนหนึ่งของสคริปที่ให้มานะครับ
    if (hp <= 0){ ถ้ากรณีที่ ตัวแปร hp มีค่าน้อยกว่าหรือเท่ากับ 0 ถึงจะทำงาน
    stage.removeEventListener(Event.ENTER_FRAME,onLoop);
    บรรทัดนี้ จะสั่งให้ลบฟังก์ชั่น onloop ซึ่งระวังจุดนี้ให้ดี ในกรณีที่สร้างฟังก์ชั่นแบบมีเงื่อนไข เช่น ถ้ากดตัว p จะสร้างฟังก์ชั่น pick(); แต่ถ้า hp น้อยกว่า 0 จะลบฟังชั่น pick(); อันนี้ เครื่องจะบอก error ทันที เพราะเป็นฟังก์ชั่นที่ยังไม่สร้างขึ้น จะสั่งรอลบเลยไม่ได้ เครื่องจะไม่ยอมครับ
    for (var i:Number = 0; i < monster.length; i++)
    เอ ปรกติ ตรงนัมเบอร์เขาจะใช้ int กันนะครับ จะได้ไม่งง โดยให้แนใจด้วยว่า monster.length เป็นตัวเลขจำนวนเต็ม เอ มอนสเตอร์ length มาไงหว่า โค้ดงงๆ นะครับ ในส่วนของ loop ผมว่าใช้ผิดจุดประสงค์ซะแล้วมั้งครับ น่าจะเป็นพวก Timer เสียมากกว่านะครับ นี่คงสร้างเกมใช่ไหมครับเนี่ย รายละเอียดน้อยไปตอบยากครับ แต่เท่าที่ดู น่าจะต้องศึกษาเรื่อง Timer เพิ่มเสียแล้วล่ะครับ

    จริงๆ มันควรจะมีอยู่ในคาบที่ 18 ของที่ผมจะสอนนั่นล่ะครับ แต่บังเอิญเปลี่ยนงาน ก็เลยงานงอก แต่ต้องรีบไปศึกษา Timer แล้วล่ะครับ เพราะ loop ไม่สามารถทำตามที่คุณต้องการได้ครับ

    ตอบลบ