簡體   English   中英

Java LibGDX精靈的移動速度是相機的兩倍

[英]Java LibGDX sprite moving twice as fast as camera

因此,我有一個extends ApplicationAdapter implements InputProcessor的類,並在屏幕上四處拖動時extends ApplicationAdapter implements InputProcessor以下操作。

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {

    float x = Gdx.input.getDeltaX();
    float y = Gdx.input.getDeltaY();

    if (Store.isGameState) {
        Store.Entity.player.setxMove(x);
        Store.Entity.player.setyMove(-y);
    }
    return true;
}

在播放器類中,我有一個執行以下操作的更新方法:

    @Override
    public void update() {
        x += xMove;
        y += yMove;
        Store.Camera.Camera.position.set(Store.Entity.player.getXPos() + Store.Entity.player.getWidth() / 2, Store.Entity.player.getYPos() + Store.Entity.player.getHeight() / 2, 0);
        Store.Camera.Camera.update();
    }

和一個渲染方法是:

public void render(SpriteBatch SB) {
    SB.begin();
    Store.Entity.sprite.setPosition(Store.Entity.player.getXPos(), Store.Entity.player.getYPos());
    Store.Entity.sprite.draw(SB);
    SB.end();
}

在所有這些都能正常工作的情況下,相機將像我的精靈一樣四處移動。 但是,我的精靈無法以與照相機相同的速度移動,因此我無法終生弄清楚為什么會這樣。 精靈的移動速度大約是相機的兩倍,並且不在我理想的播放器中心。

編輯:

所以在我的GameState中,我有以下內容:

package com.imjoshscott.dataria.states;

import com.imjoshscott.dataria.Game;
import com.imjoshscott.dataria.Store;

public class GameState extends State {

    public GameState(Game game) {
        super(game);
        Store.isGameState = true;
        Store.Entity.getPlayer(game, Store.Entity.getSprite());
        Store.Graphics.getSpriteBatch();
        Store.Graphics.getTiledMap();
        Store.Graphics.getTiledMapRenderer();
        Store.Camera.getCamera();
        Store.Camera.getHudCamera();
        Store.Camera.Camera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
        Store.Camera.HudCamera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
        Store.Camera.Camera.viewportHeight = Game.GAME_HEIGHT / 2.5f;
        Store.Camera.Camera.viewportWidth  = Game.GAME_WIDTH / 2.5f;
    }

    @Override
    public void update() {
        Store.Graphics.tiledMapRenderer.setView(Store.Camera.Camera);
        Store.Entity.player.update();
    }

    @Override
    public void render() {
        Store.Graphics.tiledMapRenderer.render();

        Store.Entity.player.render(Store.Graphics.SB);
    }

}

Store類中的Camera內容:

public static class Camera {
    public static OrthographicCamera Camera;
    public static OrthographicCamera HudCamera;

    public static OrthographicCamera getCamera() {
        if(Camera == null)
            Camera = new OrthographicCamera();
        return Camera;
    }
    public static OrthographicCamera getHudCamera() {
        if(HudCamera == null)
            HudCamera = new OrthographicCamera();
        return HudCamera;
    }
}

編輯:顯示更新和渲染方法

public void update() {
    moveCreature();
    Store.Entity.sprite.setPosition(Store.Entity.player.getXPos(), Store.Entity.player.getYPos());
    Store.Camera.Camera.position.set(Store.Entity.player.getXPos(), Store.Entity.player.getYPos(), 0);
    Store.Camera.Camera.update();
    xMove = 0f;
    yMove = 0f;
}


public void render(SpriteBatch SB) {
    SB.begin();
    Store.Entity.sprite.draw(SB);
    SB.end();
}

更新我以前的答案是不正確的,在查看並檢查項目后,我看到了GameState類的render()方法(在環顧了幾個地方但沒有骰子之后,如果再次發現這個非常奇怪的問題,我會直接針對此問題)。

public void render() {
    Store.Graphics.tiledMapRenderer.render();

    Store.Entity.player.render(Store.Graphics.SB);
}

我們需要添加以解決非常奇怪的問題的一件事是添加以下代碼

Store.Graphics.SB.setProjectionMatrix(Store.Camera.Camera.combined);

所以我們有

public void render() {
    Store.Graphics.SB.setProjectionMatrix(Store.Camera.Camera.combined);
    Store.Graphics.tiledMapRenderer.render();

    Store.Entity.player.render(Store.Graphics.SB);
}

這意味着我們需要將投影矩陣設置為當前活動的SpriteBatch才能正確渲染內容。 同樣安全的設置是在渲染圖塊之前,因為它使用的是與播放器相同的相機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM