Bu noktada tuğla dolu bir seviye ve hareket eden bir oyuncu paddle'ımız var. Klasik Breakout tarifinde eksik olan tek şey top. Amaç, topun yıkılabilir tüm tuğlalar yıkılana kadar tüm tuğlalarla çarpışmasını sağlamak; ancak topun ekranın alt kenarına ulaşmasına izin vermemek.
Genel oyun nesnesi bileşenlerine ek olarak topun bir yarıçapı ve topun oyuncu paddle'ına yapışık olup olmadığını ya da serbest hareket edip etmediğini gösteren ekstra bir boolean değeri bulunur. Oyun başladığında top, oyuncu boşluk tuşuna basarak oyunu başlatana kadar başlangıçta oyuncu paddle'ına yapışıktır.
Top özünde birkaç ekstra özelliğe sahip bir GameObject olduğundan, BallObject sınıfını GameObject'in alt sınıfı olarak oluşturmak mantıklıdır:
classBallObject:publicGameObject{public:// top durumu float Radius;bool Stuck;BallObject();BallObject(glm::vec2pos,floatradius,glm::vec2velocity,Texture2Dsprite);glm::vec2Move(floatdt,unsignedintwindow_width);voidReset(glm::vec2position,glm::vec2velocity);};
BallObject'in kurucusu kendi değerlerini başlatırken aynı zamanda altta yatan GameObject'i de başlatır. BallObject sınıfı, topu hızına göre hareket ettiren bir Move fonksiyonu barındırır. Sahnenin kenarlarına ulaşıp ulaşmadığını kontrol eder; eğer öyleyse topun hızını tersine çevirir:
glm::vec2BallObject::Move(floatdt,unsignedintwindow_width){// oyuncu tahtasına yapışık değilseif(!this->Stuck){// topu hareket ettirthis->Position+=this->Velocity* dt;// pencere sınırlarının dışında mı; öyleyse hızı ters çevir ve doğru konuma geri döndürif(this->Position.x<=0.0f){this->Velocity.x=-this->Velocity.x;this->Position.x=0.0f;}elseif(this->Position.x+this->Size.x>= window_width){this->Velocity.x=-this->Velocity.x;this->Position.x= window_width -this->Size.x;}if(this->Position.y<=0.0f){this->Velocity.y=-this->Velocity.y;this->Position.y=0.0f;}}returnthis->Position;}
Topun hızını tersine çevirmeye ek olarak, topu kenara geri taşımak da istiyoruz; top yalnızca yapışık olmadığında hareket edebilir.
Top alt kenara ulaştığında oyuncu oyunu bitirdiğinden (veya can kaybettiğinden), topun alt kenardan sekmesi için herhangi bir kod yok. Bu mantığı oyun kodunda bir yere uygulamak gerekecek.
Topu oyuna eklemek için paddle gibi bir BallObject oluşturur ve başlatmak amacıyla iki sabit tanımlarız. Top dokusu olarak bu görseli kullanıyoruz:
Ardından her karede oyun kodunun Update fonksiyonunda Move'u çağırarak topun konumunu güncelliyoruz:
Top başlangıçta paddle'a yapışık olduğundan, oyuncuya topu serbest bırakma imkânı vermeliyiz. Top için boşluk tuşunu seçiyoruz. processInput fonksiyonunu biraz değiştirmemiz gerekiyor:
Kullanıcı boşluk tuşuna basarsa, topun Stuck değişkeni false olarak ayarlanır. Top yapışık olduğunda topun konumunu paddle'ın konumuyla birlikte hareket ettirdiğimize dikkat edin.
Son olarak topu render ediyoruz:
Sonuç, paddle'ı takip eden ve boşluk tuşuna bastığımızda serbestçe hareket eden bir top. Top sol, sağ ve üst kenardan düzgünce sekiyor; ancak henüz tuğlalarla çarpışmıyor.
Yapmak istediğimiz, top nesnesinin seviyedeki tuğlalardan herhangi biriyle çarpışıp çarpışmadığını kontrol eden ve çarpışıyorsa tuğlayı yıkan fonksiyonlar oluşturmak. Bu çarpışma tespiti fonksiyonları sonraki bölümün konusu.