CodeGym /Java Blogu /Rastgele /CodeGym'deki oyunlar bölümü: Olay yönetimi
John Squirrels
Seviye
San Francisco

CodeGym'deki oyunlar bölümü: Olay yönetimi

grupta yayınlandı
CodeGym'den "Oyunlar", popüler oyunların kendi versiyonlarını oluşturduğunuz, büyük ilgi çekici görevlere sahip yeni bir bölümdür. Çok basit: Her oyun projesi alt görevlere ayrılmıştır. Bunları birer birer tamamlayın ve oyun biter. Sosyal ağlarda paylaşabilir ve arkadaşlarınızı oynamaya davet edebilirsiniz. Bu yazıda, oyun yazmak için kullanılan olay işlemeCodeGym'deki "Oyunlar" bölümü: Olay işleme - 1 yöntemlerini ayrıntılı olarak açıklayacağız .

1. 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 metotları sınıfınızda miras alan ilan edersiniz Gameve onlara istediğiniz herhangi bir kodu eklersiniz. Kullanıcı fare düğmelerini tıkladığında oyun motoru onları arayacak.
  1. onMouseLeftClick(int x, int y)— farenin sol 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ı vardır (0, 0). Kullanmak için bu yöntemi geçersiz kılmanız gerekir.

  2. onMouseRightClick(int x, int y)— farenin sağ tuşu tıklandığında çağrılır. Bu yöntem, yöntem gibi çalışır onMouseLeftClick(int x, int y).

İşte bu yöntemlerin kullanımına bir örnek:

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) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        setCellValue(x, y, "");
    }
}

2. 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 olmasını istiyorsanız, sınıfınızda Game'i miras alan bu yöntemleri bildirin ve kodunuzu bunlara ekleyin. Kullanıcı bir tuşa bastığında veya bıraktığında oyun motoru onları arayacak.
  1. onKeyPress(Key key)— herhangi bir tuşa basıldığında çağrılır. Anahtar parametresi, basılan tuştur (veya Key.UNKNOWN).

  2. onKeyReleased(Key key)— herhangi bir tuş serbest bırakıldığında çağrılır. Anahtar parametresi karşılık gelen anahtardır (veya Key.UNKNOWN).

İşte bu yöntemlerin kullanımına bir örnek:

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 space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
Önemli! Oyun motorunun mevcut sürümünde, Anahtar türünün sınırlı sayıda dokuz değeri vardır:
Değer Kullanıcı tarafından basılan tuş
Tuş.ENTER Kullanıcı Enter'a bastı
Key.ESCAPE Kullanıcı Esc'ye bastı
Tuş.PAUSE Kullanıcı Duraklat'a bastı
Tuş.BOŞLUK Kullanıcı Space'e bastı
Tuş.SOL Kullanıcı sol ok tuşuna bastı
Tuş. SAĞ Kullanıcı sağ ok tuşuna bastı
Tuş.YUKARI Kullanıcı yukarı ok tuşuna bastı
AŞAĞI Kullanıcı aşağı tuşuna bastı
Key.BİLİNMİYOR Kullanıcı yukarıdakilerden farklı bir tuşa bastı

3. Zamanlayıcı ile çalışma

Pek çok oyun gerçek zamanlı olarak gerçekleşir, yani kullanıcı hiçbir şey yapmasa bile oyunda olaylar devam eder. Bu tür oyunları uygulayabilmeniz için oyun motoruna bir zamanlayıcı ekledik. Şöyle çalışır: zamanlayıcıyı açar ve zamanlayıcı aralığını ayarlarsınız. Örneğin, 500 milisaniye. Ardından, oyun motoru her yarım saniyede bir onTurnTimer()yöntemi çağırır. Sonsuza dek tekrar tekrar - zamanlayıcı kapatılana kadar. Peki zamanlayıcıyı nasıl kullanıyorsunuz?
  1. Zamanlayıcıyı açın.

    Bunu yapmak için özel bir yöntem var . Yöntem, aramalar arasındaki aralığı milisaniye cinsinden (1 milisaniye = 1/1000 saniye) bağımsız değişken olarak alır. Onu yalnızca bir kez çağırmanız yeterlidir ve oyun motoru her milisaniyede bir yöntemi çağırmaya başlar.void setTurnTimer(int timeMs)onTurn()

  2. onTurn(int) yöntemini geçersiz kılın.

    Bunu yapmak için, sınıfta miras alan bir yöntem bildirmeniz gerekir . Bu yöntem oyun motoru tarafından çağrılacaktır. Dahası, her çağrıda oyun motoru, yönteme çağrı için sıralı bir tanımlayıcı (1, 2, 3, …) iletecektir.void onTurn(int step)Game

  3. Zamanlayıcıyı kapatın.

    Zamanlayıcıya artık ihtiyaç duyulmuyorsa, örneğin kullanıcı oyunu tamamladığında zamanlayıcıyı kapatabilirsiniz. Bunu yapmak için, sadece yöntemi çağırmanız gerekir .stopTurnTimer()

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

    Bazı oyunlarda olayların meydana gelme hızı sürekli artıyor, bu nedenle zamanlayıcımızı hızlandırmak (çağrılar arasındaki süreyi azaltmak) uygun olacaktır. Hiçbir şey daha kolay olamazdı: setTurnTimer(int timeMs)Yeni bir değerle bir kez daha arayın ve aramalar arasındaki süre onTurn()değişecektir.

Örneğin:

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

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

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

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

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

        }
    }
    …
}
Bu basit örnekte, 3 hücre x 3 hücre olan bir alan oluşturduk. Ardından, yöntemi her yarım saniyede bir çağıracak bir zamanlayıcı başlattık onTurn(). Her yarım saniyede bir hücre rengi değişecek, ancak içeriği değişmeyecektir. 50 saniye sonra renk artık değişmeyecektir. Şimdilik bu kadar! "Oyunlar" bölümü hakkında daha fazla bilgi edinmek istiyorsanız, size yardımcı olabilecek bazı yararlı belgeler aşağıda verilmiştir:
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION