libgdx为什么相机不跟随角色呢?

时间:2013-01-31 15:48:33

标签: java android libgdx

我是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()我尝试使相机跟随T恤。

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

1 个答案:

答案 0 :(得分: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,它将被放大(实际上所有图像的大小都会很大。)