ในบทก่อน เป็นการใช้ mouse และ keyboard เพื่อควบคุมมุมกล้อง ในแบบต่างๆ ในบทนี้จะเป้นการต่อเนื่องไปอีกคือ เราจะเพิ่ม object ลงไปแล้วเขียนโค้ดเพื่อให้ object นั้นเคลื่อนที่ คล้ายๆพวกเกมรถแข่ง หรือเกมแนว rpg หรือ action ที่มีมุมกล้องเป็นแบบบุคคลที่ 3
Rem Setup sync rate
Sync On
Sync Rate 30
set display mode 1024,768,32
Rem Make 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 Make sphere
Make object sphere 10,50
Rem Main loop
Do
Rem Store Object angle Y in aY#
aY# = Object angle Y(10)
Rem Control input for camera
If Upkey()=1 then Move object 10,10
If Leftkey()=1 then Yrotate object 10,Wrapvalue(aY#-5)
If Rightkey()=1 then Yrotate object 10,Wrapvalue(aY#+5)
Rem get player object position and store in X# and Z#
X# = Object position x(10)
Z# = Object position z(10)
Rem get new camera position and store in cZ# and cX#
cZ# = Newzvalue(Z#,aY#-180,100)
cX# = Newxvalue(X#,aY#-180,100)
Rem position camera
Position Camera cX#,100,cZ#
Rem point the camera at the player object
Point camera X#,50,Z#
Rem Refresh Screen
Sync
Loop
ความหมายในแต่ละบรรทัด (ถ้าไม่เข้าใจบรรทัดไหนก็สามารถย้อนกลับไปดูในบทเก่าๆได้ครับ เพราะเนื้อหาจะต่อเนื่องกัน)
Sync On
Sync Rate 30
set display mode 1024,768,32
ตั้งค่าหน้าจอและอัตรา refresh ครับ ถ้าไม่เข้าใจให้ดูในบทแรกๆครับ
For x = 1 to 5
Make object cube x,100
Position object x,Rnd(2000),0,Rnd(2000)
Next x
คำสั่งเดิมๆ คือ สร้าง object 5 อันแล้วสุ่มตำแหน่งของแต่ละอัน ไม่ให้ซ้ำกัน
Make object sphere 10,50
สร้าง object แบบทรงกลม ชื่อ 10 ขนาด 50
มาดูกันใน do…loop กันบ้างครับ
aY# = Object angle Y(10)
สร้างตัวแปรชื่อ aY เป็นชนิด floating เก็บค่ามุมแกน Y ของวัตถุชื่อ 10 ซึ่งก็คือ ทรงกลมที่เราสร้างไปนั่นเอง
If Upkey()=1 then Move object 10,10
If Leftkey()=1 then Yrotate object 10,Wrapvalue(aY#-5)
If Rightkey()=1 then Yrotate object 10,Wrapvalue(aY#+5)
เป็นการกำหนดปุ่มบน keyboard เพื่อควบคุมมุมกล้อง
ปุ่มลูกศรบนให้วัตถุเคลื่อนที่ไปข้างหน้า 10
ปุ่มลูกศรซ้าย ให้วัตถุหันไปทางซ้าย 5
ปุ่มลูกศรขวา ก็ให้กันวัตถุไปทางขวา 5
(ทั้งหมดนี้เป็นการสรุปอย่างง่ายๆครับ เพื่อความเข้าใจ)
X# = Object position x(10)
Z# = Object position z(10)
อันนี้เรื่องใหม่ แต่ก็คล้ายๆของเดิมครับ คือ ตั้งตัวแปร x และ z โดยใช้เก็บค่าตำแหน่งทางแกน X และ Z ของทรงกลม ก็คือตำแหน่งในการเคลื่อนที่แนวราบของทรงกลม
cZ# = Newzvalue(Z#,aY#-180,100)
cX# = Newxvalue(X#,aY#-180,100)
ชุดนี้จะยากซักหน่อยครับ
ในชุดนี้จะเป็นการคำนวณเพื่อหาค่าตำแหน่งใหม่ ใน2 คำสั่งก่อน เราได้ตั้งตัวแปร x#,z# ที่เอาไว้เก็บค่าตำแหน่งกันแล้ว ในชุดนี้ก็สร้างตัวแปรอีก 2 ตัวเช่นกัน ในวงเล็บจะมี parameter อยู่ 3 ตัว
ตัวแรกคือ ค่าตำแหน่งปัจจุบันของวัตถุ ในที่นี้คือ z#,x#
ตัวที่ 2 คือ การคำนวณหาค่ามุมแกน Y ใหม่ โดยใช้ aY# ซึ่งเก็บค่ามุมแกน Y อยู่ก่อนแล้วมาคำนวณ
ตัวที่ 3 คือ เป็นค่าของ world unit ที่อยู่หลังจาก object ของเรา ค่า 100 เป็นค่าที่อยู่ห่างจาก object ทางด้านหลัง 100 หน่วย (แปลมั่วนิดๆ)
Position Camera cX#,100,cZ#
คำสั่งนี้เป็นคำสั่งที่ใช้ในการวางกล้อง ผลที่ได้คือ กล้องจะอยู่บน object
Point camera X#,50,Z#
ใช้กำหนดมุมกล้อง ตัวแปรหลังคำสั่งคือค่า x,y,z จะเห็นว่าใช้ตัวแปร x#,y# ซึ่งเป็นค่ามุมที่ได้จากทรงกลมที่สร้างขึ้น ผลคือ มุมกล้องจะหันไปพร้อมๆกับทรงกลม
อ่านจบก็ลองรันดูผลเลยครับ แล้วจะเข้าใจโค้ดมากขึ้น
มีแบบฝึกหัดให้ลองเล่นดูครับ คือ
1.ให้สร้างกล่องจากเดิมที่มีอยู่ 5 กล่อง เป็น 10 กล่อง
2. เปลี่ยนค่ามุม y ค่าเดิมคือ 50 เป็นค่าที่น้อยหรือมากกว่าก็ได้แล้วลองสังเกตผลลัพธ์
รูปแกนในระบบ 3 มิติ ที่เข้าใจง่ายๆ
No comments: