Skip to content

Instantly share code, notes, and snippets.

@Happsson
Last active August 29, 2015 14:03
Show Gist options
  • Save Happsson/d26f45cd12c1bc026906 to your computer and use it in GitHub Desktop.
Save Happsson/d26f45cd12c1bc026906 to your computer and use it in GitHub Desktop.
Enkelt box2d exempel.
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