LibGdx如何使用滚动OrthographicCamera?(LibGdx How to Scro

2019-08-08 04:24发布

我一直在loocking 10小时(直译)和我做,我要问。 事情是我正在学习如何使用LibGdx编程Java游戏。 我做了水平空间船舶游戏。 所以,我在这里最严重的问题是,我不知道该怎么做滚动(我认为抽签将更好地解释)。 我想画一个hudge背景(空间),让我OrthographicCamera向右移动就像我的飞船,所以它会创建一个空间背景滚动效果。 没有敌人并没有什么,但在屏幕上了船。

我triying这

 public void moveCamera(float x,float y){
    cam.position.set(x, y, 0);
 }

然后我使用该方法在我WorldRender render()方法:

public void render(float delta){ 
    ship.Move(delta);
    moveCamera(ship.getPosition().x,ship.getPosition().y);
    cam.update();
    System.out.println(""+cam.position);
    spriteBatch.begin();
        drawBackground();
        drawShip();
    spriteBatch.end();
}

我真正移动相机的位置(我可以看到,由于println的),但它不是在比赛中的移动,所以飞船只是由窗口的边缘自败。

spriteBatch.end之前我也试过这个()

spriteBatch.setProjectionMatrix(camera.combined);

但是当我做了Windows OLY显示黑屏,没有船,什么都没有。 正如我说过的,我绝望了,我看到很多的例子(滚动鼠标,paralexscrolling等),但都是以先进的或只是没有我的代码做。 任何帮助西港岛线可以理解

这是我画的东西。 背景和船舶都在里面WorldRender纹理。 我画的背景图片很广,所以我的本意是做一些滚动了,我说。 这是代码

private void loadTextures(){
    shipTexture=new Texture(Gdx.files.internal("nave.png"));
    background=new Texture(Gdx.files.internal("fondo.jpg"));
}

public void drawShip(){
    spriteBatch.draw(shipTexture,ship.getPosition().x*ppuX,ship.getPosition().y*ppuY, ship.WIDTH*ppuX,ship.HEIGHT*ppuY);
}

public void drawBackground(){
    spriteBatch.draw(background, -10*ppuX,0*ppuY, Gdx.graphics.getWidth()*10,Gdx.graphics.getHeight());     
}

在这里,您可以下载代码,如果有人想在极限模式,以帮助

我的代码(不工作)

我终于解决了IT !!!! WIIIIIIIIII! 这是我在一个类名WorldRenderer使用的代码,有至极是内GameScreen卡勒为呈现方式,调整等

 public WorldRenderer(World world) {
    // TODO Auto-generated constructor stub

    this.world=world;
    this.ship=world.getShip();
    this.cam = new OrthographicCamera(CAMERA_WIDTH,CAMERA_HEIGHT);

    this.cam.setToOrtho(false,CAMERA_WIDTH,CAMERA_HEIGHT);
    this.cam.position.set(ship.getPosition().x,CAMERA_HEIGHT/2,0);
    this.cam.update();//actualizamos la camara
    spriteBatch=new SpriteBatch();
    loadTextures();
}

private void loadTextures(){
    shipTexture=new Texture(Gdx.files.internal("nave.png"));
    background=new Texture(Gdx.files.internal("fondo.jpg"));
}

  public void drawShip(){
          spriteBatch.draw(shipTexture,ship.getPosition().x,ship.getPosition().y,10,10);
}

public void drawBackground(){
    spriteBatch.draw(background, 0,0, 500,50);
} 

 public void render(float delta){ 
    ship.Move(delta);
    moveCamera(ship.getPosition().x);
    spriteBatch.setProjectionMatrix(cam.combined); 
    spriteBatch.begin();
        drawBackground();
        drawShip();
    spriteBatch.end();
}

 public void moveCemara(float x){
    cam.position.set(x+20,cam.position.y, 0);
    cam.update();
}

在船内我有这样的方法至极我称之为内呈现WorldRenderer移动它

public void Move(float delta){
    if(Gdx.input.isKeyPressed(Keys.LEFT)) this.position.x -=velocity *delta;
    if(Gdx.input.isKeyPressed(Keys.RIGHT)) this.position.x +=velocity *delta;
    if(Gdx.input.isKeyPressed(Keys.UP)) this.position.y +=velocity *delta;
    if(Gdx.input.isKeyPressed(Keys.DOWN)) this.position.y -=velocity *delta;
}

此外,我要非常感谢谁帮助我的人。 我标志着第一个答案为好,但,混合使用这两个是什么给了我真正的解决方案。

我离开这里有些TUTOS我跟着至极是菜鸟不错

那是一个很好的一切-从划伤,政党成员LiGdxForNoobs

一个简单的游戏plataform platformGame

一个非常简单的游戏bucketGame

Answer 1:

它不清楚如何绘图? 我不知道你是否在做正确的这一做法..你能提供你的背景和船舶的细节? 你可以在你的背景图片提供细节,它是一个巨大的形象,你的周围滚动还是要重复你滚动重复的图像?

- 编辑 -

好吧,我想我有一个想法,可能是什么了。 我将相机通常适用于当前的环境。

请将下列的大小调整

    public void resize(int width, int height) {
    cam = new OrthographicCamera(width, height);
    cam.translate(width / 2, height / 2, 0);
}

放在开始下面的渲染()

cam.position.set(posX,posY,0);
cam.update();
cam.apply(Gdx.gl10);
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // #14

这会让你有设置在窗口的左下角的原点清晰的屏幕。 然后,您应该先画你的背景

spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
spriteBatch.draw(background,0,0,sizeX,sizeY);
spriteBatch.end()

怎么看,看起来当您移动相机的位置POSX和波西。 然后你的船加进来

- 多个编辑---

那么你就可以计算出POSX和波西作为

POSX = defaultOffsetX + shipX

等等..

总之希望这可以帮助我还在学习只有自己,所以这可能不是最好的方法..但它似乎工作。



Answer 2:

我不知道如果这是你唯一的错误,但是这是一个错误。 如果这是你说你在做:

spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.setProjectionMatrix(camera.combined); 
spriteBatch.end();

你不会看到任何东西。 当setProjectionMatrix被称为开始()/结束()块内。 当前批次刷新到GPU。 所以,你实际上是不拉丝用相机矩阵东西。 你应该这样做,而不是:

    spriteBatch.setProjectionMatrix(camera.combined); 
    spriteBatch.begin();
    drawBackground();
    drawShip();
    spriteBatch.end();

编辑:

如果你不叫那行,spriteBatch使用它自己默认的摄像头(这不会注意到你的camera.update()的修改,所以这不是你想要的)。

您现在应该更多地关注您所使用的坐标。 我不太清楚你真正需要的PPU转换的东西。 首先,在虚构的世界坐标定义的一切,请注意,你会看到一些伸展在你的世界。

public void drawShip(){
    spriteBatch.draw(shipTexture,ship.getPosition().x,ship.getPosition().y, 10, 10);
}//your ship is 10 units wide and tall!

public void drawBackground(){
    spriteBatch.draw(background, -10,0, 500, 100);     
} //your background is 500 units wide, and 100 units tall

//camera setup
camera = new OrthographicCamera(50, 50);
//your camera will print to screen 50 units of your world

如果你能看到一个拉伸的世界,试着去了解它是如何工作的(如果你看不到任何东西,有什么不对的地方)。

编辑2

我接过来一看你的代码。 首先拆下PPU的,因为它掩盖了你的代码。 你设置你的凸轮位置到ship.postion,而在ship.position * PPU绘制。 此外,您的背景是太大了(这就是为什么你看到它的像素化)。 你应该看到的东西合理的与此有关。 (有一天你会不得不初始化你的相机以另一种方式来处理拉伸,却忘记了,直到你了解所有的作品)。

this.cam = new OrthographicCamera(CAMERA_WIDTH,CAMERA_HEIGHT);

public void drawShip(){ 
    spriteBatch.draw(shipTexture, ship.getPosition().x ,ship.getPosition().y, 10, 10);
}

public void drawBackground(){
    spriteBatch.draw(background, -CAMERA_WIDTH/2, -CAMERA_HEIGHT/2, 100, 100); //let bg begin where camera starts. (0,0)
}


public void render(float delta){ 
    ship.Move(delta);
    moverCamara(ship.getPosition().x, ship.getPosition().y);
    spriteBatch.setProjectionMatrix(cam.combined);
    spriteBatch.begin();
        drawBackground();
        drawShip();
    spriteBatch.end();
}


Answer 3:

嘿,我已经编辑代码看看以下

public class WorldRenderer {

private World world;
private Ship ship;

private Texture shipTexture,background;
private SpriteBatch spriteBatch;

private OrthographicCamera cam;

float screenSizeX = 100;
float screenSizeY = 100;

float shipSizeX = 10;
float shipSizeY = 10;

public void setSize (int w, int h) {
    cam = new OrthographicCamera(screenSizeX,screenSizeY);
}


public WorldRenderer(World world) { 
    this.world=world;
    this.ship=world.getShip();
    spriteBatch=new SpriteBatch();
    loadTextures();
}



private void loadTextures(){
    shipTexture=new Texture(Gdx.files.internal("nave.png"));
    background=new Texture(Gdx.files.internal("fondo2.jpg"));
}

public void drawShip(){ 
    spriteBatch.draw(shipTexture, ship.getPosition().x,ship.getPosition().y, shipSizeX,shipSizeY);
}

public void drawBackground(){

    spriteBatch.draw(background, 0,0);
}


public void render(float delta){ 

    ship.Move(delta);

    moverCamara(ship.getPosition().x,ship.getPosition().y);

    spriteBatch.setProjectionMatrix(cam.combined);      
    spriteBatch.begin();
        drawBackground();
        drawShip();
    spriteBatch.end();
}




public void moverCamara(float x,float y){
    cam.position.set(x, y, 0);
    cam.update();
}

}

这样,你的船总是在屏幕的中间和后台移动。 希望这可以帮助



文章来源: LibGdx How to Scroll using OrthographicCamera?