Ball (Top)

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:

class BallObject : public GameObject
{
    public:
        // top durumu	
        float     Radius;
        bool      Stuck;

        BallObject();
        BallObject(glm::vec2 pos, float radius, glm::vec2 velocity, Texture2D sprite);

        glm::vec2 Move(float dt, unsigned int window_width);
        void      Reset(glm::vec2 position, glm::vec2 velocity);
};

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::vec2 BallObject::Move(float dt, unsigned int window_width)
{
    // oyuncu tahtasına yapışık değilse
    if (!this->Stuck)
    { 
        // topu hareket ettir
        this->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ür
        if (this->Position.x <= 0.0f)
        {
            this->Velocity.x = -this->Velocity.x;
            this->Position.x = 0.0f;
        }
        else if (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;
        }
    }
    return this->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.

circle-info

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.

Top nesnesinin kaynak kodu: başlıkarrow-up-right, kodarrow-up-right.


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örseliarrow-up-right 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ı sonrakiarrow-up-right bölümün konusu.

Last updated