หลังจากที่ผ่านบทที่ว่าด้วยการหมุนๆกันไปแล้ว มาคราวนี้ก็มาลองเข้าใจในเรื่องมุมมองของกล้องกันบ้างครับ ผลที่ได้จากบทนี้คือ เราจะเขียนโค้ดที่ทำให้ตัวเราเดินหรือว่าลอยไปดู object ต่างๆ
โค้ดชุดนี้เป็น tutorial ของเว็บ DB ต้นฉบับ
Rem Setup sync rate
Sync On
Sync Rate 30
set display mode 1024,768,32
Rem Create 5 cubes and place randomly
For x = 1 to 5
Make object cube x,100
Position object x,Rnd(2000),0,Rnd(2000)
Next x
Rem Main loop
Do
Rem Store camera angle
caY#= Camera angle Y()
Rem Control input for camera movement
If Upkey()=1 then Move camera 10
If Leftkey()=1 then Yrotate Camera Wrapvalue(caY#-5)
If Rightkey()=1 then Yrotate Camera Wrapvalue(caY#+5)
Rem Refresh Screen
Sync
Loop
มาทำความเข้าใจทีละบรรทัดเหมือนเดิมครับ
Sync On
Sync Rate 30
set display mode 1024,768,32
ทั้ง 3 บรรทัดนี้ก็ใช้ตั้งค่าหน้าจอทั้งขนาดการแสดงผลและอัตรา refresh จะมีอยู่ทุกโปรแกรมครับ
For x = 1 to 5
Make object cube x,100
Position object x,Rnd(2000),0,Rnd(2000)
Next x
คำสั่งหน้าตาคุ้นๆอย่าง for แล้วก็ next ใครเคยเรียนเขียนโปรแกรมมาบ้างแล้วก็คงเข้าใจได้ทันที ความหมายคร่าวๆของ for ก็คือ การทำซ้ำจนครบเงื่อนไข ในที่นี้จะเห็นว่ามี x = 1 to 5 ก็คือ กำหนดให้ x มีค่าเริ่มต้นเป็น 1 แล้วให้ทำคำสั่ง 2 บรรทัดต่อไป เมื่อเจอ next ก็จะเป็นการเพิ่มค่าให้ x ทีละ 1 นั่นก็คือเมื่อผ่าน next แล้ว x ก็จะมีค่า 2 แล้วก็วนกลับไปทำที่ for ต่อ วนไปอย่างนี้จน x = 5 สรุปคือ for ในชุดนี้จะทำซ้ำทั้งหมด 5 รอบ(1 ถึง 5) ถ้าครบแล้วก็จะหลุดออกจาก for แล้วไปทำคำสั่งในบรรทัดที่ต่อจาก next
มาดูข้างใน for กันบ้าง
Make object cube x,100
บรรทัดนี้ก็เป็นการสร้าง cube โดยมีตัวแปร x เป็นชื่อ เมื่อ for ทำงาน x ตัวนี้ก็จะเปลี่ยนเป็นค่า 1,2,3,4,5 นั่นก็คือมี cube อยู่ 5 อัน แต่ละอันมีขนาด 100
Position object x,Rnd(2000),0,Rnd(2000)
บรรทัดนี้เป็นการกำหนดตำแหน่งให้กับ object x ซึ่งก็คือ cube x ที่สร้างจากบรรทัดบน(อย่าลืมว่า x มีค่า 1,2,3,4,5 ) ส่วนค่าอีก 3 ค่าที่อยู่ต่อไปจะเป็นตำแหน่งของ object เรียงตามแกน x,y,z ในโดนี้กำหนดให้ y เป็น 0 ส่วน x,z เป็น Rnd(2000) เป็นคำสั่งสุ่มค่าจาก0 ถึงค่าที่เราใส่ไป ในที่นี้คือ 2000 โปรแกรมก็จะสุ่มตำแหน่งของ cube ไม่ให้ซ้ำกัน
สรุปโค้ดในชุดนี้คือ การสร้าง cube 5 อันแล้วสุ่มการวางตำแหน่งไม่ให้ซ้ำกันนั่นเอง
Do
Rem Store camera angle
caY#= Camera angle Y()
Rem Control input for camera movement
If Upkey()=1 then Move camera 10
If Leftkey()=1 then Yrotate Camera Wrapvalue(caY#-5)
If Rightkey()=1 then Yrotate Camera Wrapvalue(caY#+5)
Rem Refresh Screen
Sync
Loop
คำสั่ง do..loop ดูเหมือนว่าจะต้องมีทุกโปรแกรมครับ เอาไว้ให้โปรแกรมทำงานวนรอบไปตลอด
caY#= Camera angle Y()
ตั้งตัวแปร caY เป็นชนิด float เก็บค่ามุมกล้องแกน y
If Upkey()=1 then Move camera 10
If Leftkey()=1 then Yrotate Camera Wrapvalue(caY#-5)
If Rightkey()=1 then Yrotate Camera Wrapvalue(caY#+5)
ในส่วนนี้ก็เป็นการเช็คว่ากดปุ่มลูกศรอะไรบ้าง ถ้ากดปุ่มลูกศรขึ้น ก็จะเลื่อมกล้องไปข้างหน้าอีก 10
ถ้ากดซ้ายก็จะหมุนมุมกล้องไปทางแกนy อีก -5 ในทางตรงกันข้ามหากกดขวาก็จะเพิ่มอีก +5 เพื่อความเข้าใจลอง run ดูผลจากโค้ดทั้งหมดแล้วกดปุ่ม บน ซ้าย ขวา ดูครับ แล้วจะเข้าใจ
******เพื่อความเข้าใจลองเปลี่ยนค่า
For x = 1 to 5
ลองเปลี่ยนเลข 5 เป็นตัวอื่นดูซิครับ แล้วผลคืออะไร
Rnd(2000)
เปลี่ยนค่า 2000 แล้วตำแหน่งของวัตถุเป็นยังไง ค่ามากกับค่าน้อยให้ผลต่างกันมั้ย
Move camera 10
เปลี่ยนค่า 10 แล้วเวลากดปุ่มขึ้น มันได้ผลยังไง
ถ้าอย่างเก่งไวไว ลองเพิ่มโค้ดให้ถอยหลังกลับดูซิครับ
ลองเล่นดูนะครับ ค่อยๆเรียนรู้ไปพร้อมๆกัน แล้วบทหน้าเจอภาค 2 คราวนี้ใช้ mouse ร่วมด้วย
No comments: