摄像机没有跟随玩家



我使用libgdx有一个球员移动在x方向从左到右。现在我想让相机跟随它(就像在Flappy Bird中一样)。

发生的情况是,当玩家到达屏幕的右边界时,玩家离开了屏幕,而摄像机没有跟随他。

我尝试了以下选项,但没有一个工作:

  • camera.position.set(player.getX(), camera.position.y, 0);
  • camera.position.set(player.getX(), 0, 0);
  • Vector3 vector3= camera.unproject(new Vector3(player.getX(), 0f, 0f)); player.setX(vector3.x);

我知道这个问题已经存在于SO上,但在这种情况下没有答案有效。也许我错过了一些我不知道的重要的东西。


代码:

<

Game.java类/em>

  public class Game extends com.badlogic.gdx.Game implements   ApplicationListener {
  public static Vector2 VIEWPORT = new Vector2(320, 480);
  public static int WIDTH;
  public static int HEIGHT;

@Override
public void create() {
    WIDTH = Gdx.graphics.getWidth();
    HEIGHT = Gdx.graphics.getHeight();
    // VIEWPORT = new Vector2(WIDTH/2, HEIGHT/2);
    VIEWPORT = new Vector2(WIDTH, HEIGHT);
    setScreen(new GameScreen(this));
 }
@Override
public void resize(int width, int height) {
    // TODO Auto-generated method stub
    super.resize(width, height);
}
@Override
public void resume() {
}
@Override
public void pause() {
}
}

import android.util.Log;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.viewport.FitViewport;
import java.util.Collections;
public class GameScreen implements Screen {
private OrthographicCamera camera;
private Player  player;
private PlayerInputHandler inputHandler1, inputHandler2;
private Sound sound;
FitViewport viewp;
public static int WIDTH;
public static int HEIGHT;

int width_spacing = 0;
int height_spacing = 0;

Stage stage;

Skin skin;

public GameScreen(Game game) {
   stage = new Stage(new FitViewport(Game.WIDTH, Game.HEIGHT));
    camera = (OrthographicCamera)  stage.getCamera();
     Gdx.input.setInputProcessor(stage);
}

@Override
public void show() {
    resetGame();
}
public void resetGame() {

    WIDTH = Gdx.graphics.getWidth();
    HEIGHT = Gdx.graphics.getHeight();
    width_spacing = Game.WIDTH / 24;
    height_spacing = Game.HEIGHT / 14;
    stage.clear();
      skin = new Skin(Gdx.files.internal("data2/uiskin.json"));
    prepareInputHandlers();
    prepare_stage();
}

public void addPlayer() {
    Texture texture = new Texture("player.png");
    player = new Player(texture);
    player.setPosition(Game.WIDTH / 2, Game.HEIGHT * 2 / 3);
    stage.addActor(player);
}

@Override
public void resize(int width, int height) {
    stage.getViewport().update(width, height, true);
}
@Override
public void render(float delta) {
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    if (delta > 1 / 60f) {
        player.setX(player.getX() + (4 * delta));

               camera.position.set(player.getX(), camera.position.y, 0);

    }
    update();

    stage.act(delta);
    stage.draw();
}
private void update() {
    camera.update();

}
private void prepareInputHandlers() {
    inputHandler2 = new PlayerInputHandler(player, Input.Keys.LEFT, Input.Keys.RIGHT, Input.Keys.UP, Input.Keys.DOWN);
}

@Override
public void dispose() {

    sound.dispose();
    player.getTexture().dispose();
}


public void prepare_stage() {
     addPlayer();
    player.setWidth(64);
    player.setHeight(64);


}
@Override
public void resume() {
    // TODO Auto-generated method stub
}
@Override
public void hide() {
    // TODO Auto-generated method stub
}
@Override
public void pause() {
    // TODO Auto-generated method stub
}
 }
<

Player.java类/em>

 import com.badlogic.gdx.graphics.Texture;
 public class Player extends com.badlogic.gdx.scenes.scene2d.ui.Image{
private Texture texture;

public Player(Texture texture) {
    super(texture);
  }
     public Texture getTexture() {
    return texture;
}
   @Override
   public void act(float delta) {
    super.act(delta);
   }

  }

尝试使用舞台摄像机而不是创建自己的摄像机。像这样改变你的GameScreen构造函数:

    public GameScreen(Game game) 
    {
        stage = new Stage(new FitViewport(Game.WIDTH, Game.HEIGHT));
        camera = (OrthographicCamera) stage.getCamera();
        Gdx.input.setInputProcessor(stage);
    }

然后在render方法中设置相机位置就像

一样
    camera.position.set(player.getX(), camera.position.y, 0);

camera.update()调用前


在你的代码中也有一些奇怪的东西-为什么你有camera.position.set()和设置player x在这种情况下:

    if (delta > 1 / 60f) //??
    {
        player.setX(player.getX() + (4 * delta));
        camera.position.set(player.getX(), camera.position.y, 0);
    }

我很确定你不需要这个-但是即使你需要

    camera.position.set(player.getX(), camera.position.y, 0);

应该退出if语句,因为现在发生的事情是,即使你正在改变你的播放器位置(使用键盘通过PlayerInputHandler对象)你**不更新相机位置。试着删除if语句或者至少做一些类似

的事情
    public void render(float delta) 
    {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        if (delta > 1 / 60f) 
        {
            player.setX(player.getX() + (100 * delta));
        }
        camera.position.set(player.getX(), camera.position.y, 0);
        update();
        stage.act(delta);
        stage.draw();
    }

最后一件事是,如果你的舞台是空的(不包括球员),当相机将开始跟随球员-你会看到作为球员没有移动:)添加更多的东西到舞台

最新更新