Motorway 2D Game Programming ตอนจบ
2010-05-04 Games 2,121การแสดงผลของ Animation ใน DB Pro ขึ้นอยู่กับ 3 อย่างดังนี้
1. การทำงานใน Game Loop
หากใน Game Loop ของเรามีการทำงานซับซ้อน+ซ้ำซ้อน มากๆ การที่โปรแกรมจะวาดภาพ Sprite ขึ้นมาใหม่อีกครั้งก็จะช้าตามไปด้วย
2. ความเร็วของหน่วยประมวลผล
เนื่องจากการทำงานของคอมแต่ละเครื่องมีความเร็วในการประมวลผลที่แตกต่างกัน ดังนั้น Animation จึงมีความเร็วที่แตกต่างกันด้วย
3. ความถี่ในการวาดรูปใหม่ของหน้าจอ ( FPS เฟรม/วินาที )
รูปที่มีการเคลื่อนที่ หากไม่มีการวาดขึ้นที่หน้าจออย่างต่อเนื่องก็จะทำให้ดูกระตุก ไม่ลื่นไหล
ดังนั้นเราจึงเป็นเรื่องที่สำคัญในการเขียนเกมของเราสามารถแสดงผล Animation ได้อย่างถูกต้องในทุกๆสเปคเครื่อง
ในที่นี้จะเป็นวิธีแก้สำหรับกรณี ความเร็วของหน่วยประมวลผล ที่ไม่เท่ากันนะครับ
1. ขั้นแรกกำหนด FPS ที่ต้องการ ( เฟรมเรตหรือเฟรม/วินาที )
FPS=60
2. ขั้นที่สองใช้ตัวแปรมาคำนวณค่าเวลาในการทำงานของ Game Loop ในแต่ละรอบ
rem lastCycle เป็นตัวแปรที่นำมาเก็บเวลาการรันของ Game Loop ในแต่ละรอบ
lastCycle = Timer()-LoopTime
rem LoopTime เป็นตัวแปรที่นำมาเก็บค่า Timer()ในขณะเริ่มต้นการทำงานของ Loop
rem โดยที่ค่า Timer() จะรันอยู่ตลอดเวลาในหน่วยมิลิเซค ( 0.001 วินาที )
LoopTime =Timer()
rem Rate# เป็นค่าตัวคูณซึ่งจะนำไปใช้ในทุกๆจุดที่มีการ Animation ( เคลื่อนที่, หมุน , effect )
Rate#=( FPS / (1000.0 / lastCycle) )
3. ขั้นที่สาม คือนำค่า Rate# ไปคูณในทุกๆจุดที่มีการ Animation
Drive Game [ Download ]
หมายเหตุ
1. ข้อสังเกตุ หากเราลองแทนค่าและย้ายข้างของสมการดูก็จะรู้ว่าทำไมต้องใช้ Rate# ไปคูณในทุกๆที่ ที่ทำการ Animation
FPS / 1000.0 = Rate# / lastCycle
จะเห็นได้ว่าสมการข้างต้นเป็นการเทียบอัตราส่วนของการทำงานใน 1 วินาทีนั้นเอง
ดังนั้นเราจึงนำค่า Rate# มาใช้เพื่อให้อัตราส่วนของการวาดภาพ Animation ในแต่ละวินาทีออกมาเท่าๆกัน
แม้การประมวลผลในแต่ละรอบของคอมพิวเตอร์ทุกเครื่องจะไม่เท่ากันก็ตามที
2. เพื่อให้ชัดเจนยิ่งขึ้นเรามาลองแทนค่ากันดู
สมมุติคอม A สามารถทำงานใน Game Loop ได้ 1 วินาทีต่อรอบ
60 / 1000.0 = Rate# / 1000.0
ค่้าที่นำไปคูณก็จะได้ = 60
สมมุติคอม B สามารถทำงานใน Game Loop ได้ 0.5 วินาทีต่อรอบ
60 / 1000.0 = Rate# / 500.0
ค่้าที่นำไปคูณก็จะได้ = 30
ถ้าใน Code เราเขียนให้การเคลื่อนที่ของภาพในแต่ละรอบ = 1 pixel เมื่อนำค่า Rate# มาคูณก็จะได้ดังนี้
คอม A = 1*60 = 60 pixel ใน 1 วินาที
คอม B = 1*30 = 30 pixel ใน 0.5 วินาที
จะเห็นได้ว่า หากเทียบในหน่วย 1วินาทีเหมือนๆกัน การเคลื่อนที่ของภาพจะได้ค่าที่เท่ากันคือ 60 pixel
3. อ้างอิงและข้อมูลเพิ่มเติมจาก
thaigameadvance.com
Beginners Guide To DarkBasic Game Programming
| Darkbasic Tutorials