Oýun hereket motory

All lectures for TK purposes
Dereje , Sapak
Elýeterli
Aralyk proýektler — bu täze görnüşde berilýän tabşyryklar. JavaRush Uniwersitetiniň ilkinji iki modullarynda meşhur kompýuter oýunlaryny ýazmak üçin uly ýumuşlar-proýektler bolar. Olary ýerine ýetirmek aňsat: her bir proýekt bir topar kiçijik maslahatlara bölünendir. Ädim-ädim tabşyryklary ýerine ýetirip, öz oýnuňy ýazarsyň. Bölüm Oýunlar ýönekeý JavaRush oýun hereket motoryny ulanýar. Bu makalanyň netijesinde onun esasy aýratynlyklary we oýun ýazylyş prosesi bilen tanyşarsyň.
  1. Giriş
  2. Oýunyň inisializasiýasy
  3. Oýun meýdançasyny döretmek
  4. Ýönekeý programma
  5. Oýun meýdançasyndaky hüjjerler bilen işlemeli
  6. Reňk bilen işlemeli
  7. Dialog görnüşleri
  8. Kepillendiriji usullar

1. Giriş

Kompýuter oýnunyň işlenişi 3 basgançakdan ybarat:
  1. Oýunyň inisializasiýasy — başlangyç görnüşler: meýdança ölçegini we şekillendiriş, oýun obýektleriniň başlangyç ýagdaýynyň döremegi we goýulmagy, hem-de şol başlangyç hereketleriň ýerine ýetirilmegi.

  2. Oýun prosesi. Oýun obýektleriniň hereketi, oýunçynyň hereketleri, gazanylan nokatlaryň hasaplamasy, hem-de yzygiderli ýa-da düwmä basylanda ýerine ýetirilýän hereketleri öz içine alýar.

  3. Oýunyň tamamlanmagy. Animasiýanyň durmagy, ýeňiş ýa-da ýeňliş habaryny bildirmegi, hem-de oýun tamamlanyp ýerine ýetirilmeli hereketleri öz içine alýar.

2. Oýunyň inisializasiýasy

Oýunyň inisializasiýasy diňe iki ädimden ybarat:

Ädim 1: oýunyň esasy synpyňy döretmeli.

JavaRush hereket motory esasynda oýun döretmek üçin, sen bir synp döretmeli we ony Game (com.javarush.engine.cell.Game) synpyndan miras almalysyň. Bu synpa hereket motorynyň metodlaýyn çagyrymasına mümkinçilik berer, we motor hem senin ýazýan metodlaryňy çagyrýar. Mysal:

import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {
    ...
}

Ädim 2: initialize() metodyny özgeçirmeli.

Bu metod oýunyň başyna zerur bolan ähli başlangyç hereketleri ýerine ýetirer: oýun meýdançasy bilen, oýun obýektleriniň döremegi we ş.m. Sen diňe bu metody Game synpyndan miras alan synpda yglan etmeli. Mysal:

import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
        //  Bu ýerde oýun we obýektleriniň inisializasiýasy amala aşyrýarlar
    }
}
initialize() metody, main() metody bilen deňdir: oýun üçin ýazylan ähli kod şondan başlaýar.

3. Oýun meýdançasyny döretmek

Oýun meýdançasyny döretmek hem iki ädimden ybarat.

Ädim 1: oýun meýdançasyny hüjjerlere bölmek.

Oýun meýdançasynyň ähli bölümi oýun hereket motory tarapyndan hüjjerlere bölünýär. Iň kiçi ululyk 3x3, iň ulusy 100x100. Oýun ekrany hemişelik ululyga eýe. Ol dürli mukdarda hüjjerlere bölünip bilner. Mysal üçin, ini 7 we beýiklik 9:
Bölüm
Hüjjerleriň sanawynyň ýokarky çep burçdan başlaýandygyna üns beriň. Oýun meýdançasynyň ululygyny kesgitlemek üçin void setScreenSize(int width, int height) metodyny ulanyň. Ol hüjjerleriň ululygyny kesgitleýär. Parametr hökmünde ini (width) we beýikligiň (height) mukdaryny kabul edýär. Ol köplenç oýun başlanda bir gezek çagyrylýar. Mysal:

import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
       //  7x9 ölçeginde meýdança döretdik
       setScreenSize(7, 9);
        ...
    }
}
Oýun ýazgysyny ýazanyňda häzirki oýun meýdançasynyň ini we beýikligini anyklamak gerek bolup biler. Munuň üçin int getScreenWidth() we int getScreenHeight() metodlary ulanylýar.

Ädim 2: toru aç/açma (iňyti däl).

Eger oýun meýdançasyndaky hüjjerleri bölýän gara toruň görkezilişi göwnüňize laýyk däl bolsa, ony öçüriň. void showGrid(boolean isShow) metody, hüjjerleri bölen toru açyp/öçürýär. Adatça tor görkezilýär. Ony öçürmek üçin, bu metody false parametri bilen çagyr:

showGrid(false);
Netije:
Bölüm
Tora täzeden açmak üçin onu çagyr:

showGrid(true);

4. Ýönekeý programma

Programma mysaly:

public class MySuperGame extends Game {

    @Override
    public void initialize() {

        //  3x3 hüjjerli oýun meýdançasyny döredýäris
        setScreenSize(3, 3);
        //  Tor görkezilişini öçürýäris
        showGrid(false);
        //  Merkezi hüjjäniň fondasynyň rengini gök edip, onda "X" görkezýäris
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);
    }
}
Bu mysalda oýun meýdançasyna 3x3 ölçegi berilýär, toruň görkezilişi öçürilýär we merkezde gök fonda ululygyň ýarysyny alan mämişi "X" simwoly goýulýar. Bu, oýunçy oýny başlanda gören ilkinji zat bolar.

5. Oýun meýdançasyndaky hüjjerler bilen işlemeli

Biz oýun meýdançasyny hüjjerlere bölüp bilýänligimiz gowy zat, ýöne biz bu hüjjerlerde näme edip bileris? Her bir hüjjer üçin aşakdakylar niýetlenip bilner:
  • hüjjer reňki (font reňki);
  • metin (metin ýa-da san);
  • metiniň reňki;
  • metiniň ululygy hüjjeriniň ululygynyň protsentinde.
Oýun meýdançasyndaky hüjjerler bilen işlemek üçin metodlar bar:
  1. void setCellColor(int x, int y, Color color) — (x, y) koordinatalarynda hüjjäniň reňkini color reňkine goýýar:

    
    setCellColor(0, 0, Color.RED);
    setCellColor(3, 6, Color.BLACK);
    setCellColor(6, 8, Color.NONE);
    

  2. Color getCellColor(int x, int y) — (x, y) koordinatalarynda hüjjäniň reňkini yzyna gaýtarýar:

    
    Color myColor = getCellColor(2, 0);
    

  3. void setCellValue(int x, int y, String value) — (x, y) koordinatalarynda hüjjä tekst value goýýar:

    
    setCellValue(3, 3, "text");
    setCellValue(0, 8, "W");
    setCellValue(4, 1, "2222");
    setCellValue(6, 6, "");
    

  4. String getCellValue(int x, int y) — (x, y) koordinatalarynda hüjjäniň içindäki metini yzyna gaýtarýar:

    
    String s = getCellValue(3, 3);
    System.out.println(getCellValue(4, 1));
    

  5. void setCellTextSize(int x, int y, int size) — (x, y) koordinatalarynda hüjjäniň içindäki kontentiň ululygyny kesgitleýär. size – höjük ululygyndaky metiniň belgisiniň protsenti:

    
    setCellTextSize(2 , 0, 70); //  hüjjeriniň 70% höjük ululygy
    

  6. int getCellTextSize(int x, int y) — (x, y) koordinatalarynda hüjjäniň içindäki kontentiň ululygyny yzyna gaýtarýar:

    
    int size = getCellTextSize(2 , 0);
    

  7. void setCellNumber(int x, int y, int value) — (x, y) koordinatalarynda hüjjäň içine san value ýerleşdirýär:

    
    setCellNumber(3, 3, 40);
    setCellNumber(0, 8, -8);
    setCellNumber(4, 1, 2222);
    setCellNumber(6, 6, 0);
    

  8. int getCellNumber(int x, int y) — (x, y) koordinatalarynda hüjjäniň içindäki san yzyna gaýtarýar. Eger hüjjäniň içindäki san däl bolsa, 0 yzyna gaýtarýar:

    
    int i = getCellNumber(3, 3);
    System.out.println(getCellNumber(4, 1));
    

  9. void setCellTextColor(int x, int y, Color color) — (x, y) koordinatalarynda hüjjäniň içindäki kontentiň (metiniň) reňkini kesgitleýär:

    
    setCellTextColor(2, 1, Color.GREEN);
    setCellTextColor(0, 1, Color.NONE);
    

  10. Color getCellTextColor(int x, int y) — (x, y) koordinatalarynda hüjjäniň içindäki kontentiň (metiniň) reňkini yzyna gaýtarýar:

    
    Color textColor = getCellTextColor(1, 3);
    
Täýsir metody setCellValueEx() dürli parametr topary bilen ulanylýar:
  1. void setCellValueEx(int x, int y, Color cellColor, String value) — (x, y) koordinatalarynda hüjjäniň fondynyň reňkini cellColor we kontenti value diýip kesgitleýär:

    
    setCellValueEx(0, 2, Color.BLUE, "56");
    

  2. void setCellValueEx(int x, int y, Color cellColor, String value, Color textColor) — (x, y) koordinatalarynda hüjjäniň fondynyň reňkini cellColor, kontenti value we kontentiň reňkini textColor diýip kesgitleýär:

    
    setCellValueEx(0, 2, Color.BLACK, "56", Color.GREEN);
    

  3. void setCellValueEx(int x, int y, Color cellColor, String value, Color textColor, int textSize); — (x, y) koordinatalarynda hüjjäniň fondynyň reňkini cellColor, kontenti value, kontentiň reňkini textColor we kontentiň ululygyny textSize diýip kesgitleýär:

    
    setCellValueEx(0, 2, Color.BLACK, "56", Color.GREEN, 70);
    

6. Reňk bilen işlemeli

Reňkleri hereket motorynda enum Color niýetlenýär, ol 148 reňk üçin üýtgeşik bahalary öz içine alýar. Şeýle hem NONE — reňksiizlik üçin çäklendirilýär. Reňk bilen işlemek misaly:

Color myColor = Color.WHITE;  //  myColor üýtgeýäni ak reňk bilen kesgitleňýär.
Color redColor = Color.RED; //  redColor üýtgeýäni gyzyl reňk bilen kesgitleňýär.
Color blueColor = Color.BLUE; //  blueColor üýtgeýäni gök reňk bilen kesgitleňýär.
Birden aýratyn reňkleriň ähli toparyny almak gerek bolanda, values() metodyny ulanyň. Mysal üçin:

//  colors üýtgeýäne ähli reňkler toparynyň ýerleşdirilmegi.
Color[] colors = Color.values();
Palitrada reňkiň nomerini almak örän aňsat:

Color color = Color.RED;
int redIndex = color.ordinal(); //  Gyzyl reňkiň nomeri

int blueIndex = Color.BLUE.ordinal(); //  Gök reňkiň nomeri
Reňkiň nomeri boýunça almak:

//  color üýtgeýäne 10 nomer bilen enum Color toparynyň reňki kesgitlenilýär.
Color color = Color.values()[10];

7. Dialog görnüşleri

Oýun tamamlanandan soň, oýunçylar ýeňiş ýa-da ýeňliş habary bilen habarly edilmelidir. Bunun üçin adaty metod bardyr, ol oýun ekranına dialog görnüşini görkezýär:

void showMessageDialog(Color cellColor, String message, Color textColor, int textSize)
Bu ýerde:
  • cellColor — dialog fonunyň reňki;
  • message — habaryň metini;
  • textColor — habaryň metin reňki;
  • textSize — habaryň metin ululygy.
Dialog görnüşi, ulanyjy boş düwmäni basaýsa, öz-özünden ýapylýar.

8. Kepillendiriji usullar

Oýun ýazgysyny ýazanyňda köplenç tötänleýin sanlar ulanylýar. Tötänleýin sanlary almak üçin hereket motorynyň utilli metodlary ulanyp boljak:
  1. int getRandomNumber(int max) — 0-den (max–1) çenli goşmaça däl tötänleýin sany yzyna gaýtarýar.

  2. int getRandomNumber(int min, int max) — min-den (max–1) goşmaça däl tötänleýin sany yzyna gaýtarýar.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION