Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

8. diel - Programujeme Android hru - Rozdelenie hry do tried II

Z minulej lekcie kurzu o programovaní hry pre Android v Jave ste začali s implementáciou tried a doplnili kód do tried Chicken a TurnManager. Dnes sa budeme venovať ďalším triedam.

Otvoríme triedu ObjectManager.java a vyplníme kódom:

public class ObjectManager {

    private TurnManager turnMng;
    private Chicken chicken;
    private final int BEGINYCONSTANT=180;

    public ObjectManager(GameScreen gameScreen) {
        this.turnMng=new TurnManager(gameScreen,BEGINYCONSTANT);
        this.chicken=turnMng.getChicken();
    }

    public void update(float delta) {
        chicken.update(delta);
    }

    public void receivePosition(int x,int y) { // souradnice z inputu

        turnMng.setChickenDistance(x, y);
        turnMng.setChickenSpeed();

        chicken.setXPositionAchieved(false);
        chicken.setYPositionAchieved(false);
    }


    public Chicken getChicken() { // kvuli render
        return chicken;
    }


    public final int getBEGINYCONSTANT(){   // kvuli render
        return BEGINYCONSTANT;
    }

}

Pridáme importy a uložíme. Tu nie je čo popisovať, len spomeniem, že metódu receivePosition () zavoláme z inštancie triedy InputManager.java vždy pri dotyku užívateľa na obrazovku, metóda odovzdá súradnice dotyku inštanciu turnMng, ktorá:

  • nastaví kurčaťu vzdialenosť, ktorú musí na obrazovke uraziť
  • rozdelí kurčaťu celkovú rýchlosť do premenných dividedSpeedX a dividedSpeedY
  • v budúcnosti bude rotovať sliepku do požadovaného uhlu

Pokračujme, otvoríme triedu GameManager.java a dokopírujeme do nej nasledujúce:

public class GameManager {

    private ObjectManager objectManager;
    private GameScreen gameScreen;
    private Chicken chicken;

    public GameManager(GameScreen gameScreen) {
        this.gameScreen=gameScreen;
        this.objectManager = new ObjectManager(gameScreen);
        this.chicken=objectManager.getChicken();
    }

    public void update(float delta) {
        objectManager.update(delta);
    }

    public ObjectManager getObjectManager() { // kvuli input manager
        return objectManager;
    }

    public GameScreen getGameScreen() { // kvuli render
        return this.gameScreen;
    }

    public Chicken getChicken() { // kvuli render
        return chicken;
    }

}

Pridáme importy a uložíme. Musíme ešte zariadiť užívateľský vstup, preto otvoríme triedu InputManager.java a vyplníme do nej:

public class InputManager implements InputProcessor{

    private ObjectManager objectManager;
    private float scaleRatioX,scaleRatioY;
    private GameManager gameManager;
    private GameScreen gameScreen;

    public InputManager(GameManager gameManager,GameScreen gameScreen,float scaleRatioX,float   scaleRatioY) {

        this.gameManager=gameManager;
        this.objectManager=gameManager.getObjectManager();
        this.scaleRatioX=scaleRatioX;
        this.scaleRatioY=scaleRatioY;
        this.gameScreen=gameScreen;
    }

    @Override
    public boolean keyDown(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
        public boolean keyUp(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {

        screenX=scaleX(screenX);
        screenY=scaleY(screenY);
        //Gdx.app.log("Inputmng touchDown x:", "" + screenX);
        //Gdx.app.log("Inputmng touchDown y:", "" + screenY + "\n");
        objectManager.receivePosition(screenX, screenY);
        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        screenX=scaleX(screenX);
        screenY=scaleY(screenY);
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
        public boolean mouseMoved(int screenX, int screenY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
        public boolean scrolled(int amount) {
        // TODO Auto-generated method stub
        return false;
    }

    private int scaleX(int screenX){
        return (int)(screenX / scaleRatioX);
    }

    private int scaleY(int screenY){
        return (int)(screenY / scaleRatioY);
    }

}

Pridáme importy a uložíme. Triede sa v konstruktoru odovzdávajú parametre scaleRatioX a scaleRatioY, ktoré vyjadrujú pomer medzi skutočnými a virtuálnymi pixely obrazovky. Rovnako ako sme nastavili na fyzickú obrazovku obrazovku virtuálne s nejakým pomerom, musíme s rovnakým pomerom prispôsobiť aj užívateľský vstup, pretože InputManager zbiera súradnice z fyzickej obrazovky, ktoré väčšinou nezodpovedajú súradniciam na obrazovke virtuálne. K tomuto prispôsobenie slúžia privátnej metódy Scalex () a Scalea (). Ostatné @Override metódy sú vstavané a reagujú na užívateľský vstup, pričom nás v tejto chvíli zaujíma metóda touchdown (), ktorá je volaná vždy, keď sa používateľ dotkne obrazovky.

Posledný triedu, ktorú dnes budeme robiť, je premietačka. Otvoríme triedu Renderer.java a vyplníme:

public class Renderer {

    private OrthographicCamera cam;
    private ShapeRenderer shapeRenderer;
    private SpriteBatch batcher;
    private final Vector2 demandedScreen,screenBoundBegin;
    private final GameScreen gameScreen;
    private final int BEGINYCONSTANT;
    private Chicken chicken;
    private GameManager gameMng;


    public Renderer(GameManager gameManager,float orthoHeight,float orthoWidth) {

        this.gameMng=gameManager;
        this.gameScreen=gameMng.getGameScreen();
        this.demandedScreen=gameScreen.DEMANDED_SCREEN;
        this.screenBoundBegin=gameScreen.SCREEN_BOUND_BEGIN;
        this.chicken=gameMng.getChicken();
        this.BEGINYCONSTANT=gameMng.getObjectManager().getBEGINYCONSTANT();
        this.cam = new OrthographicCamera();
        this.cam.setToOrtho(true, orthoWidth,orthoHeight);
        this.shapeRenderer = new ShapeRenderer();
        this.shapeRenderer.setProjectionMatrix(cam.combined);
        this.batcher = new SpriteBatch();
        this.batcher.setProjectionMatrix(cam.combined);
    }


    public void render(float delta) {

        Gdx.gl.glClearColor(0, 0, 0, 1);    //black background reduce flashing
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batcher.begin();
        batcher.end();

        shapeRenderer.begin(ShapeType.Filled);
        shapeRenderer.setColor(0,0.7f,0,1);
        shapeRenderer.rect(screenBoundBegin.x, screenBoundBegin.y+BEGINYCONSTANT,
        demandedScreen.x, demandedScreen.y-BEGINYCONSTANT); // trava

        shapeRenderer.setColor(1,1,0,1);
        shapeRenderer.rect(chicken.getPositionX(),chicken.getPositionY(),
        chicken.getWidth(),chicken.getHeight()); // slepice
        shapeRenderer.end();
    }

}

Pridáme importy a uložíme. Pomocou metódy render () vykresľuje dva obdĺžniky - jeden zelený, ten reprezentuje trávu (plochu), po ktorej sa bude môcť sliepky pohybovať. Druhý, žltý, ktorý nám dočasne nahrádza grafiku sliepky. Objekt batcher máme pripravený pre budúce diely semináre.

Triedy sme síce nadefinovali, ale nevytvorili sme zatiaľ všetky ich inštancie - ideme na to. Otvoríme triedu GameScreen.java a pod existujúce premenné pridáme nové:

private GameManager gameManager;
private Renderer renderer;

V konstruktoru pod nastavením virtuálne obrazovky (pod else vetva) vykonáme ich inicializácia + inicializáciu inputManageru:

gameManager = new GameManager(this);
InputManager inputManager = new InputManager(gameManager,this,w/orthoWidth,h/orthoHeight);
Gdx.input.setInputProcessor(inputManager);
renderer = new Renderer(gameManager,orthoHeight, orthoWidth);

Do metódy render () pridáme dve metódy pre obsluhu inštancií, výsledný jej tvar bude:

@Override
public void render(float delta) {
gameManager.update(delta);
renderer.render(delta);
}

Pridáme importy a uložíme.

Rekapitulovať výsledný tvar triedy GameScreen.java po vyššie uvedených drobných úpravách nie je nutné, ak by ste si neboli istí, nájdete zdroj tejto a všetkých ostatných skupín v prílohe k stiahnutiu.

Výsledkom predchádzajúceho a dnešného dielu je takmer celá objektová kostra. Aplikáciu vyskúšajte, zobrazovaný žltý obdĺžnik by sa mal postupne presunúť na miesto vášho kľučku na obrazovke. Projekt obsahuje warnings o nevyužitých premenných, tieto určite využijeme v ďalších dieloch nášho seminára.

Nabudúce vložíme obrázok sliepky do našej Android hry v Jave - Programujeme Android hru

Nabudúce žltý obdĺžnik nahradíme grafikou sliepky a pridáme ďalšie vychytávky.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 33x (5.78 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Programujeme Android hru - Rozdelenie hry do tried I
Všetky články v sekcii
Programujeme Android hru
Preskočiť článok
(neodporúčame)
Programujeme Android hru - Assets load
Článok pre vás napísal Jaroslav Polívka
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje převážně jazykům JAVA a C++
Aktivity