3

私はlibgdxを初めて使用し、チュートリアルを読みました(チュートリアルコードが私のベースです)。動かせるキャラクターがいるのですが、カメラがそのキャラクターを追ってくれません :(

ここに私の WorldRenderer.java があります:

package com.evolutio.tee.view;

import com.evolutio.tee.model.Block;
import com.evolutio.tee.model.Tee;
import com.evolutio.tee.model.World;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
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.Rectangle;

public class WorldRenderer {

    private static final float CAMERA_WIDTH = 10f;
    private static final float CAMERA_HEIGHT = 7f;

    private World world;
    private OrthographicCamera cam;

    /** for debug rendering **/
    ShapeRenderer debugRenderer = new ShapeRenderer();

    /** Textures **/
    private Texture teeTexture;
    private Texture blockTexture;

    private SpriteBatch spriteBatch;
    private boolean debug = false;
    private int width;
    private int height;
    private float ppuX; // pixels per unit on the X axis
    private float ppuY; // pixels per unit on the Y axis

    public void setSize (int w, int h) {
        this.width = w;
        this.height = h;
        ppuX = (float)width / CAMERA_WIDTH;
        ppuY = (float)height / CAMERA_HEIGHT;
    }

    public WorldRenderer(World world, boolean debug) {
        Tee tee = world.getTee();
        this.world = world;
        cam = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
        cam.position.set(CAMERA_WIDTH / 2f, CAMERA_HEIGHT / 2f, 0);
        cam.update();
        this.debug = debug;
        spriteBatch = new SpriteBatch();
        loadTextures();
    }

    private void loadTextures() {
        teeTexture = new  Texture(Gdx.files.internal("tee/tee.png"));
        blockTexture = new Texture(Gdx.files.internal("world/dreck.png"));
    }

    public void render() {
        spriteBatch.begin();
            drawBlocks();
            drawTee();
        spriteBatch.end();
        //if (debug) drawDebug();
    }


    private void drawBlocks() {
        for (Block block : world.getBlocks()) {
            spriteBatch.draw(blockTexture, block.getPosition().x * ppuX, block.getPosition().y * ppuY, Block.SIZE * ppuX, Block.SIZE * ppuY);
        }
    }

    private void drawTee() {
        Tee tee = world.getTee();
        spriteBatch.draw(teeTexture, tee.getPosition().x * ppuX, tee.getPosition().y * ppuY, Tee.SIZE * ppuX, Tee.SIZE * ppuY);
        cam.position.set(tee.getPosition().x, tee.getPosition().y, 0);
    }

    private void drawDebug() {
        // render blocks
        debugRenderer.setProjectionMatrix(cam.combined);
        debugRenderer.begin(ShapeType.Rectangle);
        for (Block block : world.getBlocks()) {
            Rectangle rect = block.getBounds();
            float x1 = block.getPosition().x + rect.x;
            float y1 = block.getPosition().y + rect.y;
            debugRenderer.setColor(new Color(1, 0, 0, 1));
            debugRenderer.rect(x1, y1, rect.width, rect.height);
        }
        // render Tee
        Tee tee = world.getTee();
        Rectangle rect = tee.getBounds();
        float x1 = tee.getPosition().x + rect.x;
        float y1 = tee.getPosition().y + rect.y;
        debugRenderer.setColor(new Color(0, 1, 0, 1));
        debugRenderer.rect(x1, y1, rect.width, rect.height);
        debugRenderer.end();
    }
}

drawTee() で、Tee に追従するカメラを作成しようとします。

cam.position.set(tee.getPosition().x, tee.getPosition().y, 0);
4

1 に答える 1

11

これを試して

public class WorldRenderer {

private static final float CAMERA_WIDTH = 10f;
private static final float CAMERA_HEIGHT = 7f;

private World world;
private OrthographicCamera cam;

/** for debug rendering **/
ShapeRenderer debugRenderer = new ShapeRenderer();

/** Textures **/
private Texture teeTexture;
private Texture blockTexture;

private SpriteBatch spriteBatch;
private boolean debug = false;
private int width;
private int height;
private float ppuX; // pixels per unit on the X axis
private float ppuY; // pixels per unit on the Y axis

public void setSize (int w, int h) {
    this.width = w;
    this.height = h;
    ppuX = (float)width / CAMERA_WIDTH;
    ppuY = (float)height / CAMERA_HEIGHT;
}

public WorldRenderer(World world, boolean debug) {
    Tee tee = world.getTee();
    this.world = world;
    this.cam = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
    this.cam.setToOrtho(false,CAMERA_WIDTH,CAMERA_HEIGHT);
    this.cam.position.set(CAMERA_WIDTH / 2f, CAMERA_HEIGHT / 2f, 0);
    this.cam.update();
    this.debug = debug;
    spriteBatch = new SpriteBatch();
    loadTextures();
}

private void loadTextures() {
    teeTexture = new  Texture(Gdx.files.internal("tee/tee.png"));
    blockTexture = new Texture(Gdx.files.internal("world/dreck.png"));
}

public void render() {
    moveCamera(tee.getPosition().x, CAMERA_HEIGHT / 2);
    spriteBatch.setProjectionMatrix(cam.combined);
    spriteBatch.begin();
        drawBlocks();
        drawTee();
    spriteBatch.end();
    //if (debug) drawDebug();
}

public void moveCamera(float x,float y){
    if ((tee.getPosition().x > CAMERA_WIDTH / 2)) {
        cam.position.set(x, y, 0);
        cam.update();
    }

}


private void drawBlocks() {
    for (Block block : world.getBlocks()) {
        spriteBatch.draw(blockTexture, block.getPosition().x, block.getPosition().y, Block.SIZE, Block.SIZE);
    }
}

private void drawTee() {
    Tee tee = world.getTee();
    spriteBatch.draw(teeTexture, tee.getPosition().x, tee.getPosition().y, Tee.SIZE, Tee.SIZE);
}

spriteBatch.begin() の前に sprite.setProjectionMatrix(cam.combined) を使用する必要があるのは、spriteBatch が独自のカメラを使用しない場合、画面に表示されるものに対して更新が行われないためです。ppuX、ppuY のものを取り出す必要があります。さまざまなデバイスの画面のサイズを変更することは知っていますが、カメラを台無しにするため、カメラをそのままにしてsetProjectionMatrixを呼び出すと、かなりズームインされます(実際、すべての画像のサイズは巨大になります.)

于 2013-01-31T16:09:38.917 に答える