libgdx bekommen Bildschirmbreite und-Höhe für 2d-Spiele
Ich bin kaum beginnen sich über die Entwicklung android-Spiele. ich versuche zu animieren, meine Elfe und ich haben dies erfolgreich gemacht, aber jetzt, dass ich das zeichnen von Schaltflächen, damit ich anfangen kann, meine Spieler bewegen, Sie sind nicht in der richtigen position, wenn Sie sein sollten. könnte mir jemand helfen?
Es sieht toll aus in der desktop-version, aber nicht auf meinem android-Handy.
dies ist mein code für die main-Klasse.
package com.Adventcloud.RealGame;
public class RealGame implements ApplicationListener {
private OrthographicCamera camera;
private SpriteBatch batch;
//private Texture background;
private AnimatedSprite playerAnimated;
//Buttons
public static Texture leftButton;
public static Texture rightButton;
public static Texture shootButton;
public static Texture jumpButton;
@Override
public void create() {
int width = Gdx.graphics.getWidth();
int height = Gdx.graphics.getHeight();
Texture.setEnforcePotImages(false);
camera = new OrthographicCamera();
camera.setToOrtho(false, 1280, 720);
leftButton = new Texture(Gdx.files.internal("leftButton.png"));
rightButton = new Texture(Gdx.files.internal("rightButton.png"));
shootButton = new Texture(Gdx.files.internal("shootButton.png"));
jumpButton = new Texture(Gdx.files.internal("jumpButton.png"));
batch = new SpriteBatch();
//background = new Texture(Gdx.files.internal(""));
Texture spaceshipTexture = new Texture(Gdx.files.internal("spritesheet.png"));
Sprite playerSprite = new Sprite(spaceshipTexture);
playerAnimated = new AnimatedSprite(playerSprite);
playerAnimated.setPosition(1280/2, 0);
}
@Override
public void dispose() {
batch.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(0.95f, 0.95f, 0.95f, 0.95f);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.begin();
//batch.draw(background, 0, 0);
playerAnimated.draw(batch);
batch.draw(leftButton, 0, 0, Gdx.graphics.getWidth()/4, Gdx.graphics.getHeight()/6);
batch.draw(rightButton, Gdx.graphics.getWidth()/4, 0, Gdx.graphics.getWidth()/4, Gdx.graphics.getHeight()/6);
batch.draw(shootButton, (Gdx.graphics.getWidth()/4)*2, 0, Gdx.graphics.getWidth()/4, Gdx.graphics.getHeight()/6);
batch.draw(jumpButton, (Gdx.graphics.getWidth()/4)*3, 0, Gdx.graphics.getWidth()/4, Gdx.graphics.getHeight()/6);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
hier ist mein code für meine animierten sprite
package com.Adventcloud.RealGame;
public class AnimatedSprite {
private static final int FRAME_COLS = 16;
private static final int FRAME_ROWS = 16;
private static final int IDLE_COLS = 4;
private static final int IDLE_ROWS = 1;
private Sprite sprite;
private Animation animation;
private TextureRegion[] frames;
private TextureRegion currentFrame;
private float stateTime;
public AnimatedSprite(Sprite sprite){
this.sprite = sprite;
Texture texture = sprite.getTexture();
TextureRegion[][] temp = TextureRegion.split(texture, texture.getWidth() /FRAME_COLS, texture.getHeight() /FRAME_ROWS);
frames = new TextureRegion[IDLE_COLS * IDLE_ROWS];
//Animation for idling ======================================
int index = 0;
for (int i = 0; i < IDLE_ROWS; i++) {
for (int j = 1; j <= IDLE_COLS; j++) {
frames[index++] = temp[i][j];
}
}
animation = new Animation(0.2f, frames);
stateTime = 0f;
//end of idle animation ====================================
}
public void draw(SpriteBatch spriteBatch) {
stateTime += Gdx.graphics.getDeltaTime();
//continue to keep looping
currentFrame = animation.getKeyFrame(stateTime, true);
spriteBatch.draw(currentFrame, sprite.getX() - 32, sprite.getY() + 128, 128, 128);
}
public void setPosition(float x, float y){
float widthOffset = sprite.getWidth() /FRAME_COLS;
sprite.setPosition(x- widthOffset /2, y);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist tatsächlich, was die Kamera gemacht wurde, für (mindestens eines der Dinge). Sie können einen benutzerdefinierten Arbeitsbereich und es wird hochskaliert, um den Bildschirm passen/Fenster.
Zum Beispiel, wenn Sie wollen, haben ein Seitenverhältnis von 16/9 und Ihren Bildschirm von 80 "worldunits" (vielleicht Meter?) breit, so verwenden Sie einen viewport 80 Breite 45 Höhe.
So verwenden
camera = new OrthographicCamera(80, 45);
Dies schafft eine Kamera mit 80 Einheiten in der Breite, 45 in der Höhe und der P(0,0) in der Mitte.
Wenn man das macht
Texture
mit einer Größe von1
ist20px
breit und20px
hoch auf einem1600*900px
Bildschirm, und10px
breit und10px
hoch auf einem800*450px
Bildschirm.Zeichnen Sie ein Objekt an den Koordinaten P(0,0) zieht seine linke, untere Ecke in die Mitte des Bildschirms, Zeichnung bei P(-40, 0) zieht es an den linken Rand.
Vergessen Sie nicht, zu sagen, die
SpriteBatch
diese Kamera:Bewegen Sie die Kamera verwenden
camera.translate(deltaX, deltaY);
Wenn Sie die Kamera bewegen oder drehen Sie es oder tun Sie etwas anderes, was änderungen der matrix vergessen Sie nicht, rufen
camera.update()
.Nun können Sie alles berechnen, in "worldunits" und es wird hochskaliert, um den Bildschirm passen.
Hoffe ich konnte helfen