Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 5 - Programujeme Android hru - Základní vestavěné třídy podruhé

V minulém díle, Programujeme Android hru - Render, delta a FPS, jsme si udělali dohodu, kterou budeme využívat v podstatě až do konce semináře. Rozebrali jsme si důležité pojmy Delta a FPS a vytvořili novou třídu GameScreen.java.

Dnes se prostřednictvím vykreslení základních geometrických útvarů na obrazovku seznámíme s dalšími základními vestavěnými třídami, které budeme do budoucna potřebovat. Budeme pokračovat v naší třídě GameScreen.java, dnes v ní nebudeme nic mazat, budeme pouze připisovat. Zatím známe vestavěné třídy:

  • BitmapFont - obsahuje písmo
  • SpriteBatch - stará se o vykreslení obdélníkového grafického elementu

A naučíme se další třídy:

  • Circle - jak už vyplývá z názvu této třídy, tak díky ní můžeme dle našich požadavků vytvořit matematicky popsatelný geometrický útvar kruh. Základními parametry instance jsou samozřejmě souřadnice středu a poloměr v pixelech.
  • Rectangle - opět jak z názvu vyplývá, dle třídy v paměti vytvoříme instanci obdélníka (čtverce), jeho parametry jsou souřadnice levého spodního bodu (rohu), jeho šířka a výška (px).
  • Vector2 - třída má vyjadřovat veličinu vektor. To málo, co vím o vektoru, je, že má nejen velikost, ale i směr. Používali jsme ho ve škole v hodinách fyziky k vyjádření síly. Cítím, že k vyjádření vektoru v kartézské soustavě souřadnic budu potřebovat buď dva body, které určí počátek vektoru a koncový bod, nebo jen počátek a úhel? Instance vektoru obsahuje ale jen jeden bod, takže si představuji, že jako počátek vždy slouží bod [0,0]. S vektory můžeme provádět matematické operace např. jejich sčítání pomocí metody add(Vector2 v), násobení pomocí scl(Vector2 v) atd. Sám spíše instanci Vectoru2 využívám prostě jen jako dvě čísla, která mi vyjadřují nějaký bod na obrazovce.
  • ShapeRenderer - zase z angličtiny odvodíme: shape - tvar, render - poskytnout, renderer - poskytovatel. Třída se nám stará o vykreslování nějakých tvarů na obrazovku.

Jdeme do praxe, spustíme Eclipse, otevřeme naší třídu GameScreen.java a jak ji máme z předchozího dílu, tak do ní dnes budeme pouze přidávat. Chceme vykreslovat tvary, takže nejdříve musíme vytvořit instanci třídy ShapeRenderer. Pod stávající proměnné si tedy přidejme:

private ShapeRenderer shapeRenderer;

V našem kontruktoru public GameScreen() proměnnou shapeRenderer inicializujeme přidáním pod již stávající inicializace:

shapeRenderer = new ShapeRenderer();

Začneme vykreslením kruhu, abychom tohle mohli provést, potřebujeme nejdříve určit střed kruhu, k tomu si vytvoříme instanci třídy Vector2. Pod stávající proměnné si přidejme další proměnné:

private Vector2 circleMiddle;
private Circle circle;

V našem konstruktoru opět proměnné inicializujeme:

circleMiddle = new Vector2(600,400);
circle = new Circle(circleMiddle,40);

Přidáme importy, aby nám zmizely chyby. V metodě render(float delta) ve větvi else vykreslení kruhu obsloužíme, na konec větve else připíšeme kód:

shapeRenderer.begin(ShapeType.Filled);
shapeRenderer.setColor(1,1,0,1);
shapeRenderer.circle(circle.x,circle.y,circle.radius);
shapeRenderer.end();

Přidáme importy, uložíme a spustíme. Po chvíli by se vám měl společně s deltou ukázat i kruh...

Kruh se úspěšně vykreslil… - Programujeme Android hru

Stejným způsobem, jakým jsme vykreslili kruh si vykreslíme i čtverec, obdélník a úsečku. Pod stávající proměnné si přidáme (deklarujeme) další:

private Rectangle rectangle1,rectangle2; //nas ctverec a obdelnik
private Vector2 lineBegin,lineEnd; //bod pocatku a bod konce nasi usecky

Provedeme inicializaci v konstruktoru:

rectangle1 = new Rectangle(50,250,50,50);
rectangle2 = new Rectangle(150,250,100,50);
lineBegin = new Vector2(50,200);
lineEnd = new Vector2(750,150);

Opět vše vykreslíme v metodě render(float delta), celá větev else bude vypadat takto:

else{
batcher.begin();
font.draw(batcher, "Delta: "+ storedDelta/100 ,50,400);
batcher.end();

shapeRenderer.begin(ShapeType.Filled);
shapeRenderer.setColor(1,1,0,1);
shapeRenderer.circle(circle.x,circle.y,circle.radius);
shapeRenderer.setColor(1,0,0,1);
shapeRenderer.rect(rectangle1.getX(),rectangle1.getY(),rectangle1.getWidt(),rectangle1.getHeight());
shapeRenderer.setColor(0,0,1,1);
shapeRenderer.rect(rectangle2.getX(),rectangle2.getY(),rectangle2.getWidth(),rectangle2.getHeight());
shapeRenderer.setColor(0,1,0,1);
shapeRenderer.line(lineBegin,lineEnd);
shapeRenderer.end();
}

Přidáme importy, uložíme a spustíme. Po chvilce by se vám měl zobrazit výstup:

Všechny útvary jsou vykresleny - Programujeme Android hru

Pro přehlednost a kontrolu je níže výpis celé naší třídy GameScreen.java, celý zdrojový kód je samozřejmě přiložen ke stažení. Příště ahoj.

package com.wackychicken.screens;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Circle;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;


public class GameScreen implements Screen{

    private BitmapFont font;
    private SpriteBatch batcher;
    private String ourText;
    private float storedDelta;
    private int counter;

    private ShapeRenderer shapeRenderer;
    private Vector2 circleMiddle;
    private Circle circle;
    private Rectangle rectangle1,rectangle2; //nas ctverec a obdelnik
    private Vector2 lineBegin,lineEnd; //bod pocatku a bod konce usecky

    public GameScreen(){

    font = new BitmapFont();
        batcher = new SpriteBatch();
        ourText = "Toto je nas prvni text, ktery vypiseme na obrazovku.";
        storedDelta=0;
        counter=0;

        shapeRenderer = new ShapeRenderer();
        circleMiddle = new Vector2(600,400);
        circle = new Circle(circleMiddle,40);
        rectangle1 = new Rectangle(50,250,50,50);
        rectangle2 = new Rectangle(150,250,100,50);
        lineBegin = new Vector2(50,200);
        lineEnd = new Vector2(750,150);
    }


    @Override
    public void show() {
        // TODO Auto-generated method stub

    }

    @Override
    public void render(float delta) {

    Gdx.gl.glClearColor(0, 0, 0, 1); // pozadi nastavime na pozadovanou barvu
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batcher.begin();
    batcher.setColor(1, 1, 1, 1);
    font.draw(batcher, ourText ,50,450);
    batcher.end();

    if(counter<100)
    {
    storedDelta+=delta;
    counter++;
    }

    else
    {
    batcher.begin();
    font.draw(batcher, "Delta: "+ storedDelta/100 ,50,400);
    batcher.end();

    shapeRenderer.begin(ShapeType.Filled);
    shapeRenderer.setColor(1,1,0,1);
    shapeRenderer.circle(circle.x,circle.y,circle.radius);
    shapeRenderer.setColor(1,0,0,1);
    shapeRenderer.rect(rectangle1.getX(),rectangle1.getY(),rectangle1.getWidth(),rectangle1.getHeight());
    shapeRenderer.setColor(0,0,1,1);
    shapeRenderer.rect(rectangle2.getX(),rectangle2.getY(),rectangle2.getWidth(),rectangle2.getHeight());
    shapeRenderer.setColor(0,1,0,1);
    shapeRenderer.line(lineBegin,lineEnd);
    shapeRenderer.end();
        }
    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub

    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

}

V příští lekci, Programujeme Android hru - Úvaha nad obrazovkami, se zamyslíme nad tím, jak vyřešit problém se zobrazením naší aplikace na mnoha různých obrazovkách.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 16x (627.85 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Programujeme Android hru - Render, delta a FPS
Všechny články v sekci
Programujeme Android hru
Přeskočit článek
(nedoporučujeme)
Programujeme Android hru - Úvaha nad obrazovkami
Článek pro vás napsal Jaroslav Polívka
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje převážně jazykům JAVA a C++
Aktivity