Animatsioonid¶
Hoiustame stseeni kirjeldavaid olekuid muutujates
Kasutame neid iga kaadri puhul stseeni uuesti joonistamiseks
Uuendame muutujate väärtusi ajas, et viia stseenil läbi muudatusi
Siinpuhul circleX ja circleY hoiavad endas ringi koordinaate
ning xSpeed ja ySpeed hoiavad ringi horisontaalset/vertikaalset
kiirust. Kui ringi keskpunkt jõuab mänguakna serva, siis muudetakse
vastav kiirus vastassuunaliseks, et ring alati mänguakna sisse jääks.
Täiendatud kood:
package ee.taltech.iti0301.libgdxdemo;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
public class libgdxDemo extends ApplicationAdapter {
ShapeRenderer shapeRenderer;
float circleX = 200;
float circleY = 100;
float xSpeed = 2;
float ySpeed = 1;
@Override
public void create () {
shapeRenderer = new ShapeRenderer();
}
@Override
public void render () {
circleX += xSpeed;
circleY += ySpeed;
if (circleX < 0 || circleX > Gdx.graphics.getWidth()) {
xSpeed *= -1;
}
if (circleY < 0 || circleY > Gdx.graphics.getHeight()) {
ySpeed *= -1;
}
Gdx.gl.glClearColor(.25f, .25f, .25f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(0, 1, 0, 1);
shapeRenderer.circle(circleX, circleY, 75);
shapeRenderer.end();
}
@Override
public void dispose () {
shapeRenderer.dispose();
}
}
Delta Time¶
Koodil on üks puudus - me ei saa määrata, kui tihti render()
meetodit välja kutsutakse. Nii töötaks mäng aeglasemalt või kiiremini
olenevalt seadmest, mille peal seda jooksutatakse, ehk täpsemalt selle
seadme kaadrisagedusest (frame rate). Mäng peaks aga töötama samal
kiirusel olenemata seadmest.
Selleks peab ringi liikumine sõltuma ajast, mis on möödunud viimasest kaadrist. Kui on möödunud väga vähe aega, peaks ka ring olema liikunud väga vähe. Kui aga on möödunud rohkem aega, peaks ring olema liikunud kaugemale.
LibGDX pakub lahendusena Gdx.graphics.getDeltaTime() meetodit, mis
tagastab viimasest kaadrist möödunud aja. Tähistab protsenti ühest
sekundist, nt 0.5 on pool sekundit.
Paneme xSpeed ja ySpeed tähistama vahemaad (pikslites), mis
liigutakse sekundis:
float xSpeed = 120;
float ySpeed = 60;
Nüüd peaks ring liikuma horisontaalselt 120 pikslit sekundis, vertikaalselt 60 pikslit sekundis.
Kuna render() meetod käivitatakse igal kaadril, siis lisame liikumisloogika sinna.
Kiirus korrutatakse ajamuutujaga, et objekt liiguks ühtlaselt sõltumata kaadrisagedusest:
circleX += xSpeed * Gdx.graphics.getDeltaTime();
circleY += ySpeed * Gdx.graphics.getDeltaTime();
Nüüd liigub ring sama kiirusega, olenemata seadme kaadrisagedusest.