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)
. @Override
Bu 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.UNKNOWN
key
@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.UNKNOWN
key
@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, Key
tür yalnızca sınırlı bir 9 değer kümesini destekler:
Değer | Kullanıcının bastığı şey |
---|---|
|
Kullanıcı Enter tuşuna bastı |
|
Kullanıcı Esc tuşuna bastı |
|
Kullanıcı Duraklat tuşuna bastı |
|
Kullanıcı Space tuşuna bastı |
|
Kullanıcı Sol Ok tuşuna bastı |
|
Kullanıcı Sağ Ok tuşuna bastı |
|
Kullanıcı Yukarı Ok tuşuna bastı |
|
Kullanıcı Aşağı Ok tuşuna bastı |
|
Yukarıda listelenenler dışındaki herhangi bir anahtar |
Oyuncu boşluk çubuğuna basarsa, yöntem parametre olarak onKeyPress()
çağrılacaktır . Key.SPACE
Kullanı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 timeMs
milisaniyede 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.