Libgdx Why doesn't the camera follow the symbol?

I am new to libgdx and I have read the tutorial (tutorial code is my base). I have a character that I can move, but the camera won't follow the character :(

Here's my 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();
    }
}

      

at drawTee () I am trying to make a camera after Tee.

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

      

+3


source to share


1 answer


try it

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);
}

      



Using sprite.setProjectionMatrix (cam.combined) before spriteBatch.begin () is needed, because if you don't use spriteBatch it uses its own camera, so your updates don't do anything for what appears on the screen. You have to pull out the ppuX, ppuY material. I know it is for resizing the screen for different devices, but it twists the camera, so if you save it and call setProjectionMatrix it will be the way to scale (in fact, the size of all images will be huge.)

+11


source







All Articles