คุณจัดการกับการแยกอนิเมชั่นจากสภาวะโลกในเกมที่มีการเปิดได้อย่างไร? ฉันกำลังทำงานกับเกม 2D กริดในปัจจุบัน โค้ดด้านล่างนี้ง่ายต่อการอธิบายได้ดีขึ้น
เมื่อนักแสดงเคลื่อนไหวฉันต้องการที่จะหยุดการไหลของการหมุนในขณะที่สิ่งมีชีวิตเคลื่อนไหวและย้ายไปยังตำแหน่งใหม่ มิฉะนั้นหน้าจออาจล้าหลังสถานะโลกอย่างมีนัยสำคัญซึ่งอาจทำให้เกิดรูปลักษณ์ที่แปลกประหลาด ฉันต้องการมีภาพเคลื่อนไหวที่ไม่ปิดกั้นการไหลของเกม - เอฟเฟกต์ของอนุภาคสามารถเปิดออกได้หลายรอบโดยไม่ส่งผลต่อการเล่นเกม
สิ่งที่ฉันทำคือแนะนำภาพเคลื่อนไหวสองประเภทซึ่งฉันเรียกว่าการปิดกั้นภาพเคลื่อนไหวและภาพเคลื่อนไหวที่ไม่ปิดกั้น เมื่อผู้เล่นต้องการย้ายรหัสที่ถูกเรียกใช้งานคือ
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
จากนั้นห่วงการอัพเดทหลักจะ:
class Game {
void update(float dt) {
updateNonBlockingAnimations(dt); //Effects like particle explosions, damage numbers, etc. Things that don't block the flow of turns.
if(!mBlockingAnimations.empty()) {
mBlockingAnimations.get(0).update(dt);
} else {
//.. handle the next turn. This is where new animations will be enqueued..//
}
cleanUpAnimations(); // remove finished animations
}
}
... ที่ภาพเคลื่อนไหวจะอัพเดตตำแหน่งหน้าจอของนักแสดง
อีกแนวคิดหนึ่งที่ฉันใช้คือมีภาพเคลื่อนไหวการบล็อกพร้อมกันซึ่งภาพเคลื่อนไหวการบล็อกหลายรายการจะได้รับการอัปเดตพร้อมกัน แต่การเปิดครั้งต่อไปจะไม่เกิดขึ้นจนกว่าจะเสร็จทั้งหมด
สิ่งนี้ดูเหมือนเป็นวิธีที่มีเหตุผลในการทำสิ่งต่างๆหรือไม่? ไม่มีใครมีข้อเสนอแนะใด ๆ หรือแม้กระทั่งการอ้างอิงถึงวิธีการที่เกมอื่นที่คล้ายคลึงกันทำสิ่งนั้น