Diyelim ki bir dünya , bir oyuncu ve bir patrondan oluşan bir sahneniz var . Oh, ve bu üçüncü şahıs oyunu, yani bir kameran da var .
Yani sahneniz şöyle:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(En azından bu temel verilerdir . Verileri nasıl içerdiğiniz size bağlıdır.)
Sahneyi yalnızca oyunu oynarken, duraklatıldığında veya ana menüde güncellemek ve işlemek istersiniz ... böylece oyun durumuna eklersiniz!
State* gameState = new State();
gameState->addScene(scene);
Şimdi oyun durumunuzun bir sahnesi var. Ardından, mantığı sahnede çalıştırmak ve sahneyi oluşturmak istiyorsunuz. Mantık için, sadece bir güncelleme işlevi çalıştırırsınız.
State::update(double delta) {
scene->update(delta);
}
Bu şekilde tüm oyun mantığını Scene
sınıfta tutabilirsiniz . Ve sadece referans amacıyla, bir varlık bileşen sistemi bunu şu şekilde yapabilir:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
Her neyse, artık sahnenizi güncellemeyi başardınız. Şimdi görüntülemek istiyorsunuz! Bunun için yukarıdakine benzer bir şey yapıyoruz:
State::render() {
renderSystem->render(scene);
}
İşte böyle. RenderSystem olay yerindeki bilgileri okur ve uygun görüntüyü gösterir. Basitleştirilmiş, sahneyi oluşturma yöntemi şöyle görünebilir:
RenderSystem::renderScene(Scene* scene) {
Camera* camera = scene->camera;
lookAt(camera); // Set up the appropriate viewing matrices based on
// the camera location and direction
renderHeightmap(scene->getWorld()->getHeightMap()); // Just as an example, you might
// use a height map as your world
// representation.
renderModel(scene->getPlayer()->getType()); // getType() will return, for example "orc"
// or "human"
renderModel(scene->getBoss()->getType());
}
Gerçekten basitleştirilmiş olsa da, örneğin, oynatıcınızın nerede olduğuna ve nereye baktığına bağlı olarak bir rotasyon ve çeviri uygulamanız gerekir. (Benim örneğim bir 3D oyun, 2D ile giderseniz, parkta bir yürüyüş olacak).
Umarım aradığın şey budur? Umarım yukarıdakilerden hatırlayabileceğiniz gibi, render sistemi oyunun mantığını umursamaz . Oluşturmak için yalnızca sahnenin geçerli durumunu kullanır, yani oluşturmak için gerekli bilgileri çeker. Ya oyun mantığı? Oluşturucunun ne yaptığı önemli değil. Heck, gösterilmesinin hiç umrunda değil!
Ayrıca sahneye oluşturma bilgileri eklemenize de gerek yoktur. Oluşturucunun bir ork oluşturması gerektiğini bilmesi yeterli olmalıdır. Oluşturucunun görüntülemesini bildiği bir ork modeli zaten yüklediniz.
Bu, gereksinimlerinizi karşılamalıdır. Grafik gösterimi ve mantık birleştirilir , çünkü ikisi de aynı verileri kullanır. Yine de ayrılar , çünkü ikisi de diğerine dayanmıyor!
EDIT: Ve sadece neden böyle yapmak için cevap ? Çünkü daha kolay, en basit nedendir. "Böyle ve böyle oldu, şimdi grafikleri güncellemeliyim" diye düşünmenize gerek yok. Bunun yerine bir şeyler yaparsınız ve oyunun her karesi şu anda olanlara bakar ve bir şekilde yorumlar ve size bir ekran sonucu verir.