Bagaimana Anda menangani pemisahan animasi dari negara dunia dalam game berbasis giliran? Saya sedang mengerjakan game berbasis grid 2D saat ini. Kode di bawah ini disederhanakan untuk lebih menjelaskan.
Ketika seorang aktor bergerak, saya ingin menghentikan aliran putaran sementara makhluk itu menghidupkan dan bergerak ke posisi yang baru. Jika tidak, layar bisa jauh tertinggal dari keadaan dunia, yang akan menyebabkan penampilan visual yang aneh. Saya juga ingin memiliki animasi yang tidak menghalangi aliran permainan - efek partikel dapat terungkap melalui beberapa putaran tanpa mempengaruhi gameplay.
Apa yang saya lakukan adalah memperkenalkan dua jenis animasi, yang saya sebut animasi pemblokiran dan animasi non-pemblokiran. Ketika pemain ingin pindah, kode yang dieksekusi adalah
class Actor {
void move(PositionInfo oldPosition, PositionInfo newPosition) {
if(isValidMove(oldPosition, newPosition) {
getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
player.setPosition(newPosition);
}
}
}
Maka loop pembaruan utama tidak:
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
}
}
... di mana animasi memperbarui posisi layar Aktor.
Satu ide lain yang saya terapkan adalah memiliki animasi pemblokiran bersamaan, di mana beberapa animasi pemblokiran akan diperbarui secara bersamaan, tetapi perubahan berikutnya tidak akan terjadi sampai semuanya selesai.
Apakah ini tampak seperti cara yang waras untuk melakukan sesuatu? Adakah yang punya saran, atau bahkan referensi bagaimana permainan serupa lainnya melakukan hal seperti itu.
sumber