java - libgdx 왜 카메라가 캐릭터를 따르지 않습니까?

기사 출처 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 ()에서 저는 Tee를 따라 카메라를 만들려고합니다.

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

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를 호출하면 상당히 확대됩니다 (실제로 모든 이미지의 크기가 커질 것입니다).

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/14629653/

관련 기사
java - 자바에서 자릿수 지정
java - Regex Multiple Negative Lookahead
java - 다중 스레드 가비지 수집 [중복]
java - Java에서 병렬로 여러 목록을 어떻게 반복합니까? [복제]
java - SLF4J :“org.slf4j.impl.StaticLoggerBinder”클래스를로드하지 못했습니다. JUnit 테스트를 실행할 때
java - NullPointerException 잡기의 대안
java - AtomicReferenceArray가있을 때 동시 목록 및 집합의 요점은 무엇입니까?
java - 힙 공간이 부족 해지는 원인은 무엇이며이를 방지 할 수있는 모범 사례가 있습니까? [닫은]
java - xlsx 파일을 출력하려고하지만 계속 옥텟 스트림을 가져 오는 Java 서블릿
java - 정적 블록이 두 번 호출됩니다. 여러 클래스 로더일까요?