Last active
August 29, 2015 14:03
-
-
Save Happsson/d26f45cd12c1bc026906 to your computer and use it in GitHub Desktop.
Enkelt box2d exempel.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.mygdx.game; | |
import com.badlogic.gdx.ApplicationAdapter; | |
import com.badlogic.gdx.Gdx; | |
import com.badlogic.gdx.Input.Keys; | |
import com.badlogic.gdx.InputAdapter; | |
import com.badlogic.gdx.InputMultiplexer; | |
import com.badlogic.gdx.graphics.GL20; | |
import com.badlogic.gdx.graphics.OrthographicCamera; | |
import com.badlogic.gdx.math.Vector2; | |
import com.badlogic.gdx.physics.box2d.Body; | |
import com.badlogic.gdx.physics.box2d.BodyDef; | |
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; | |
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; | |
import com.badlogic.gdx.physics.box2d.FixtureDef; | |
import com.badlogic.gdx.physics.box2d.PolygonShape; | |
import com.badlogic.gdx.physics.box2d.World; | |
public class MyGdxGame extends ApplicationAdapter { | |
//Vi behöver en kamera | |
private OrthographicCamera camera; | |
//Skapar body här för att kunna använda den för att styra. | |
Body body; | |
//Vi behöver en värld | |
private World world; | |
//En debugrenderer, för att kunna se objekt utan att ha gett dem någon grafik. | |
private Box2DDebugRenderer debugRenderer; | |
//Behöver ett par intar för att kunna hålla koll på var på skärmen man pekar. | |
private int nerX, nerY, dragX, dragY; | |
@Override | |
public void render() { | |
//Nollställer screenen vid varje uppdatering. | |
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT); | |
//Världen måste uppdateras varje gång. | |
//Argumenten har och göra med hur ofta världen ska uppdateras, hur ofta kollisioner ska kollas efter m.m. | |
//De här värdena är nån typ av rekomendation. | |
world.step(0.02f, 8, 3); | |
//använder vår debugrenderer för att visa bilden genom vår kamera. Osäker på vad .combined betyder. | |
debugRenderer.render(world, camera.combined); | |
} | |
@Override | |
public void create() { | |
//1. initerar kameran. | |
camera = new OrthographicCamera(Gdx.graphics.getWidth()/70, Gdx.graphics.getHeight()/70); | |
//initierar debugrenderaren. | |
debugRenderer = new Box2DDebugRenderer(); | |
//2. Initierar världen. Första värdet i vektorn är gravitationen i sidled, andra i höjdled. 9.81 Newton är gravitationen på jorden. | |
//true på slutet innebär att objekt tillåts "sova". Det gör att objekt som inte rör på sig inte heller görs några beräkningar på, | |
//det sparar på processorkraft. | |
world = new World(new Vector2(0,-9.81f), true); | |
//3.1 Definierar ett objekt. Vi börjar med en box som får agera mark. | |
BodyDef bdef = new BodyDef(); //body definition | |
bdef.position.set(0 ,0); //positionen, i meter. Varje pixel är en meter. | |
bdef.type = BodyType.StaticBody; //vilken typ av objekt. Static är stillastående objekt som inte kan påverkas av andra objekt. | |
//3.2 Skapar objektet. | |
body = world.createBody(bdef); | |
PolygonShape shape = new PolygonShape(); | |
shape.setAsBox(5, .05f); //storleken i meter. | |
//3.3 Definierar fixture. | |
FixtureDef fdef = new FixtureDef(); | |
fdef.shape = shape; | |
//3.4 Skapar fixturen. | |
body.createFixture(fdef); | |
/* | |
* Skapar ett till objekt som kan samspela med det första objektet, bara för att visa hur det funkar. | |
* Gör alltså om steg 3.1 - 3.4. | |
* | |
*/ | |
//3.1 Vi kan återanvända bdef och fdef efter att vi är klara med föresta objektet. | |
bdef.position.set(0, 2); //position, skapas ovanför det andra objektet. | |
bdef.type = BodyType.DynamicBody; //Dynamisk, innebär att den rör på sig som ett vanligt objekt. Faller, kan bli knuffad, kan styras, osv. | |
//3.2 skapar objektet | |
shape.setAsBox(.2f, .2f); //storleken i meter. | |
body = world.createBody(bdef); | |
//3.3 fdef är redan skapad så det behöver vi inte göra, däremot ska vi leka med lite inställnignar. | |
fdef.friction = .3f; //Friktion mot andra objekt, i regel mellan 0-1, men kan gå högre. | |
fdef.restitution = 0.2f; //Hur mycket den studsar, mellan 0-1. Vid 1 studsar den lika högt för alltid. | |
fdef.density = 10; //Densitet, i kg/m^2 | |
//3.4 skapar fixturen. | |
body.createFixture(fdef); | |
/* | |
* Styrning för boxen. | |
* | |
* Gdx.input.setInputProcessor(new InputMultiplexer(new InputAdapter() { } | |
* kan användas för att styra objekt. Den måste implementeras efter att vi skapat objektet vi vill styra, och före vi skapar | |
* nästa objekt. | |
* | |
* Här kan man kontrollera både touch från en mobilskärm och tangentbord/mus på en dator. | |
* | |
* | |
*/ | |
Gdx.input.setInputProcessor(new InputMultiplexer(new InputAdapter() { | |
//Bara för skojs skull, knappen W får boxen att hoppa. | |
@Override | |
public boolean keyDown(int keycode) { | |
//Switch/case för att se vilken knapp. | |
switch(keycode) { | |
case Keys.W: | |
body.applyForceToCenter(0, 500, true); | |
break; | |
} | |
return false; | |
} | |
@Override | |
public boolean touchDown (int screenX, int screenY, int pointer, int button) { | |
//Noterar bara var nedtrycket kommer när man pekar på skärmen. | |
nerX = screenX; | |
nerY = screenY; | |
return false; | |
} | |
@Override | |
public boolean touchUp(int screenX, int screenY, int pointer, | |
int button) { | |
//räknar ut hur långt man dragit på X- och Y-axeln. | |
dragX = screenX - nerX; | |
dragY = screenY - nerY; | |
//Om man swipeat åt höger, men inte mer än max 50 pixlar uppåt eller nedåt åker lådan åt höger. | |
if (dragX > 100 && dragY > -50 && dragY < 50) body.applyForceToCenter(100, 0, true); | |
//Om man swipeat uppåt, men inte mer än max 50 pixlar åt vänster eller höger hoppar lådan. | |
if ( dragY < -100 && dragX > -50 && dragX < 50) body.applyForceToCenter(0, 500, true); | |
//Om man swipeat åt vänster, men inte mer än max 50 pixlar uppåt eller nedåt åker lådan åt höger. | |
if (dragX < -100 && dragY > -50 && dragY < 50) body.applyForceToCenter(-100, 0, true); | |
//Om man swipeat ned, men inte mer än max 50 pixlar åt vänster eller höger åker lådan nedåt. | |
if ( dragY > 100 && dragX > -50 && dragX < 50) body.applyForceToCenter(0, -500, true); | |
return true; | |
} | |
})); | |
} | |
public void resize(int width, int height) {} | |
public void hide() {} | |
public void pause() {} | |
public void resume() {} | |
public void dispose() {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment