1. Giriş

Bir oyun motorunu sadece ekranda bir şeyler çizmek için kullanabilseydik pek işe yaramazdı. Tam teşekküllü bir oyun yazmak için, kullanıcıyla etkileşime girmesine ihtiyacımız var! Daha kesin olmak gerekirse, programımız kullanıcı eylemlerini izlemeli ve bunlara yanıt vermelidir.

Bunu yapmak için CodeGym oyun motorunun, kullanıcı fare düğmelerini veya klavye tuşlarını tıklattığında çağırdığı özel yöntemleri vardır.

Sınıfın amacı, bu yöntemleri kendiniz yazmanız ve ardından CodeGym oyun motorunun onları çağırmaktan sorumlu olmasıdır. İhtiyacınız olan tek şey, bu yöntemleri kodunuzda bildirmektir. Bunu yapmak göründüğünden daha kolay.


2. Fare ile çalışma

Oyun motorunun fare ile çalışmak için iki yöntemi vardır:

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

Bu yöntemleri, sınıfı miras alan kendi sınıfınızda bildirmeniz yeterlidir Game. Ve sonra bu metotlarda istediğiniz kodu yazın. Kullanıcı fare düğmelerini tıkladığında oyun motoru bu yöntemleri çağırır.

onMouseLeftClick(int x, int y)sol fare düğmesine tıklandığında motor tarafından çağrılır . Parametreleri, tıklamanın meydana geldiği oyun alanı hücresinin koordinatlarıdır. Sol üst hücrenin koordinatları (0,0). @OverrideBu yöntemi kullanmak için, açıklamayı yöntem adından önce yerleştirerek geçersiz kılmanız gerekir .

onMouseRightClick(int x, int y)sağ fare tuşu tıklandığında çağrılır . Yönteme benzer şekilde çalışır onMouseLeftClick(int x, int y).

Bu yöntemleri kullanma örnekleri:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onMouseLeftClick(int x, int y) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

Yukarıdaki örnekte, her iki yöntemi de bildirdik: onMouseLeftClick()ve onMouseRightClick(). İlk yöntem, kullanıcı oyun alanının hücrelerinde farenin sol düğmesine tıkladığında çağrılacaktır. Sağ fare tuşu tıklandığında ikinci yöntem çağrılacaktır.

(x, y)Bağımsız değişkenler olarak, CodeGym oyun motoru , farenin tıklandığı oyun alanı hücresinin koordinatlarını iletecektir .



3. Klavye ile çalışma

Oyun motorunun klavyeyle çalışmak için iki yöntemi vardır:

void onKeyPress(Key key);
void onKeyReleased(Key key);

Kullanıcı bir tuşa bastığında bir şey yapmak istiyorsanız, sınıfınızda sınıfı miras alan bu yöntemleri bildirmeniz yeterlidir Game.

Kodunuzu bu yöntemlerle yazarsınız ve kullanıcı bir tuşa bastığında (veya bıraktığında) oyun motoru bunları çağırır.

onKeyPress(Key key)herhangi bir tuşa basıldığında çağrılır . Basılan tuşun (veya ) değeri metoda parametre olarak iletilir . Bu yöntemi kullanmak için, açıklamayı yöntem adından önce yerleştirerek geçersiz kılmanız gerekir .Key.UNKNOWNkey@Override

onKeyReleased(Key key)herhangi bir tuş serbest bırakıldığında çağrılır . Karşılık gelen anahtarın (veya ) değeri parametreye atanır . Bu yöntemi kullanmak için, açıklamayı yöntem adından önce yerleştirerek geçersiz kılmanız gerekir .Key.UNKNOWNkey@Override

Bu yöntemleri kullanma örnekleri:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onKeyPress(Key key) {
      // When the spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. Desteklenen tüm anahtarların listesi

onKeyPress()CodeGym motoru ve yöntemlerini çağırdığında onKeyReleased(), onlara basılan (serbest bırakılan) tuşla ilgili bilgileri iletir. Bunu yapmak için CodeGym motorunun Key.

Motorun mevcut sürümünde, Keytür yalnızca sınırlı bir 9 değer kümesini destekler:

Değer Kullanıcının bastığı şey
Key.ENTER
Kullanıcı Enter tuşuna bastı
Key.ESCAPE
Kullanıcı Esc tuşuna bastı
Key.PAUSE
Kullanıcı Duraklat tuşuna bastı
Key.SPACE
Kullanıcı Space tuşuna bastı
Key.LEFT
Kullanıcı Sol Ok tuşuna bastı
Key.RIGHT
Kullanıcı Sağ Ok tuşuna bastı
Key.UP
Kullanıcı Yukarı Ok tuşuna bastı
Key.DOWN
Kullanıcı Aşağı Ok tuşuna bastı
Key.UNKNOWN
Yukarıda listelenenler dışındaki herhangi bir anahtar

Oyuncu boşluk çubuğuna basarsa, yöntem parametre olarak onKeyPress()çağrılacaktır . Key.SPACEKullanıcı sol oka basarsa, parametre olacaktır Key.LEFT. Kullanıcı yukarıdaki listede olmayan herhangi bir tuşa basarsa, parametre olarak onKeyPress()yöntem çağrılacaktır .Key.UNKNOWN

Buradaki sorun, mevcut CodeGym oyunlarının bir telefonda çalışacak şekilde tasarlanmış olmasıdır. Standart klavye yerine 8 sanal düğmemiz var:


5. Bir zamanlayıcı ile çalışmak

Pek çok oyun gerçek zamanlı olarak gerçekleşir, yani kullanıcı hiçbir şey yapmayabilir, ancak oyunda yine de belirli olaylar meydana gelir. Bu tür oyunları uygulayabilmeniz için oyun motoruna bir zamanlayıcı ekledik.

İşte böyle çalışır: zamanlayıcıyı açarsınız ve tetiklenmesi gereken süreyi ayarlarsınız. Örneğin, 500 ms. Ardından her yarım saniyede bir CodeGym oyun motoru yöntemi çağırır onTurn(). Zamanlayıcı kapatılana kadar sonsuz sayıda.

Bir zamanlayıcıyı nasıl kullanıyorsunuz?

1. Zamanlayıcıyı açın

Zamanlayıcıyı açmak için yöntemimiz var void setTurnTimer(int timeMs). Yöntem, geri aramalar arasındaki aralığın süresini (milisaniye veya saniyenin 1/1000 saniyesi cinsinden) argüman olarak alır. Bu yöntemi bir kez çağırmanız yeterlidir ve oyun motoru onTurn()her timeMsmilisaniyede bir yöntemi çağırmaya başlar.

2. onTurn(int)Yöntemi geçersiz kıl

void onTurn(int step)Bunu yapmak için, sınıfı miras alan bir sınıfta bir yöntem bildirmelisiniz Game. Oyun motoru bu yöntemi çağıracaktır. Her çağrıda motor, yöntem çağrısını ( 1, 2, 3, ...) tanımlayan sıralı bir numarayı iletir.

3. Zamanlayıcıyı kapatın

Örneğin, kullanıcı oyunu bitirdiği için zamanlayıcıya artık ihtiyaç duyulmuyorsa, kapatılabilir. Bunu yapmak için stopTurnTimer()yöntemi çağırmanız yeterlidir.

4 Zamanlayıcıyı hızlandırın/değiştirin

Bazı oyunlarda olayların sıklığı düzenli olarak artar, bu nedenle zamanlayıcımızı hızlandırmak, yani geri aramalar arasındaki süreyi kısaltmak uygun olacaktır. Ve hiçbir şey daha kolay olamazdı — setTurnTimer(int timeMs)yeni değerle tekrar aramanız yeterlidir ve aramalar arasındaki süre onTurn()değişecektir.

Örnek:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
   ...
   @Override
   public void initialize() {
      // Create a 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

      setTurnTimer(500); // Turn on the timer. The interval between callbacks is 500ms.
   }

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

      if (step % 2 == 1) {
         // If this is an odd calllback, then set the cell background to red
         setCellColor(1, 1, Color.RED);
      } else {
         // If this is an even callback, then set the cell background to blue
         setCellColor(1, 1, Color.BLUE);
      }
   }
   ...
}

Bu basit örnekte, 3 hücreye 3 hücreden oluşan bir alan oluşturduk. onTurn()Ardından , yöntemi her yarım saniyede bir çağıracak bir zamanlayıcıyı açtık .

Burada merkezi hücrenin rengi her yarım saniyede bir değişecektir. Hücrenin metni değişmeyecektir. 50 saniye sonra (100 geri arama), renk değişimi duracak ve zamanlayıcı kapanacaktır.