สิ่งที่คุณจะได้เรียนรู้#
คุณจะเขียนโปรแกรม BASIC เล็ก ๆ หนึ่งโปรแกรม ดู Scene Graph ว่างเปล่าอยู่ ทั้งที่โปรแกรมทำงานได้ชัดเจน แล้วจึงทำให้วัตถุแต่ละชิ้นปรากฏขึ้นด้วยการตั้งชื่อให้มัน เมื่อจบบทเรียนนี้ คุณจะเข้าใจว่าทำไมโครงสร้างต้นไม้ถึงซ่อนสิ่งที่โปรแกรมสร้างขึ้นส่วนใหญ่ไว้ และจะเลือกได้ว่าจะให้มันแสดงอะไรบ้าง
ก่อนเริ่มต้น#
- Engine เป็นโมดูลที่ต้องสนับสนุน Inkwell, Vectra และ PDF Studio เป็นสามโมดูลที่ใช้งานได้ฟรี
- ไม่จำเป็นต้องทำบทเรียนใดมาก่อน ทุกอย่างด้านล่างนี้อยู่ในสคริปต์เดียว
- เปิดแผง Scene Graph ไว้ข้าง ๆ วิวพอร์ต นี่คือแก่นของแบบฝึกหัดนี้
ขั้นตอน#
-
เปิด Engine เริ่มฉากว่างเปล่า แล้วเปิดตัวแก้ไขสคริปต์ วางโค้ดนี้ลงไปแล้วกด Play:
image = LoadImage("hero.png") sprite = CreateSprite(image) SpritePosition(sprite, 100.0, 120.0) CreatePointLight(1, 0.0, 5.0, 0.0, 10.0, 255, 255, 255) DO Sync() LOOP -
ดูที่ Scene Graph sprite อยู่บนหน้าจอ ไฟก็ติดอยู่ แต่โครงสร้างต้นไม้กลับแสดง ไม่มีอะไรเลย นี่ไม่ใช่บั๊ก และนี่คือบทเรียนทั้งหมดของเรื่องนี้
เคล็ดลับ: แผงนี้แสดงจำนวนวัตถุที่ยังไม่ได้ตั้งชื่อ ตัวเลขนั้นคือผลลัพธ์ของ โปรแกรมคุณที่โครงสร้างต้นไม้จงใจไม่นำมาแสดง
-
ตั้งชื่อให้ sprite เพิ่มบรรทัดหนึ่งหลัง
SpritePositionแล้วกด Play อีกครั้ง:SpriteName(sprite, "player")playerจะปรากฏในโครงสร้างต้นไม้ ไม่มีอะไรอื่นเปลี่ยนแปลงบนหน้าจอเลย การตั้งชื่อ ไม่ได้สร้าง เคลื่อนย้าย หรือวาดอะไรทั้งสิ้น มันแค่เผยแพร่ (publish) ข้อมูลเท่านั้น -
ตั้งชื่อให้ไฟด้วยเช่นกัน ด้วยคำสั่งที่มาพร้อมแนวคิดนี้:
LightName(1, "sun")ตอนนี้มีสองรายการแล้ว คลิกที่รายการใดรายการหนึ่ง อินสเปกเตอร์จะตามไปแสดง เหมือนกับที่มันทำกับวัตถุที่คุณวางด้วยมือทุกประการ
-
เพิ่มอนุภาค (particles) แล้วตั้งชื่อให้มัน เพื่อให้เห็นว่ากฎนี้ไม่ได้เกี่ยวข้องเฉพาะ กับ sprite เท่านั้น:
CreateParticles(1, 200.0, 200.0) ParticlesName(1, "smoke") -
ตอนนี้ให้ลบบรรทัดตั้งชื่อทั้งสามบรรทัดออก แล้วกด Play ฉากจะเหมือนเดิมทุกประการ โครงสร้างต้นไม้จะว่างเปล่าอีกครั้ง และจำนวนวัตถุที่ไม่ได้ตั้งชื่อจะกลับไปเป็นสาม
คำเตือน: ชื่อไม่ใช่ id
SpriteName(sprite, "player")เป็นการติดป้ายให้กับ sprite ที่มี id เก็บอยู่ในตัวแปรspriteมันไม่ได้ทำให้คุณค้นหาวัตถุนั้นด้วยป้ายชื่อนี้ ได้ในภายหลัง id ยังคงเป็นตัวจับต้องตัวจริงของคุณ
ผลลัพธ์#
คุณเป็นคนตัดสินใจได้ว่าโปรแกรมของคุณจะแสดงอะไร prop ไฟ และตัวปล่อยอนุภาค (emitter) จะปรากฏภายใต้ชื่อที่คุณเลือก ส่วนวัตถุทางเทคนิคอีกหลายร้อยชิ้นที่โปรแกรมจริงสร้างขึ้นจะไม่มา ขวางทาง
เหตุผลที่กฎนี้มีอยู่#
โปรแกรม BASIC แบบดั้งเดิมสร้างวัตถุขึ้นตลอดเวลา sprite หนึ่งชิ้นต่อกระสุนหนึ่งนัด ข้อความหนึ่งชิ้นต่อหลักคะแนนหนึ่งหลัก ภาพหนึ่งภาพต่อไทล์หนึ่งช่อง ถ้าแสดงทั้งหมดใน Scene Graph มันจะอ่านไม่ออกภายในไม่กี่วินาที และวัตถุสามชิ้นที่คุณสนใจจริง ๆ ก็จะจมหาย ไปในความรก
ดังนั้นโครงสร้างต้นไม้จึงไม่แสดงทุกอย่างแล้วเดาซ่อนส่วนที่เหลือ มันแสดง สิ่งที่คุณตั้งชื่อ และนับจำนวนส่วนที่เหลือไว้ เพื่อไม่ให้อะไรหายไปแบบเงียบ ๆ ตัวกรองนี้เป็นของคุณ ไม่ใช่ของเอนจิน
วัตถุชนิดใดที่ตั้งชื่อได้บ้าง#
| คำสั่ง | สิ่งที่มันตั้งชื่อให้ |
|---|---|
SpriteName(id, name) | sprite |
TextName(id, name) | วัตถุข้อความ |
ObjectName(id, name) | วัตถุ 3D |
LightName(id, name) | ไฟแบบจุดหรือไฟทิศทาง (point หรือ directional light) |
ParticlesName(id, name) | ตัวปล่อยอนุภาค (particle emitter) แบบ 2D หรือ 3D |
เสียง ภาพ memblock และฟอนต์ไม่มีแถวใน Scene Graph เพราะสิ่งเหล่านี้เป็นทรัพยากร (resource) ไม่ใช่วัตถุในฉาก การตั้งชื่อให้สิ่งเหล่านี้จะไม่ทำให้อะไรปรากฏขึ้นที่ไหนเลย
ก้าวต่อไป#
- ส่วนที่เหลือของภาษาถิ่นนี้: ภาษา BASIC
- คำสั่งตั้งชื่อทั้งหมดพร้อมพารามิเตอร์: กลุ่มคำสั่ง Studio