2013-08-04 2 views
2

저는 libgdx를 사용하고 있으며 스프라이트를 그리려는 타일 맵이 있습니다. 그러나 스프라이트가 실제 윈도우에 그려 지므로 카메라를 움직일 때 스프라이트는 같은 위치에있게됩니다. 지도상에서 움직이기 원한다. 내가 현재 내 개체화면에 스프라이트를 그려야합니다.

@Override 
    public void render(float delta) { 
     translateCamera(); 

     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     camera.update(); 

     renderer.setView(camera); 

     renderer.render(bgLayers); 
     batch.begin(); 

     batch.draw(splayerSprite, Gdx.graphics.getWidth()/2, 
       Gdx.graphics.getHeight()/2); 

     batch.end(); 
     renderer.render(fgLayers); 

    } 

렌더링 그것은 항상 화면의 중앙에 끝나게 방법

이 그러나 나는 각각 따로 예를 들어처럼 이동 할 수 있도록하려면,이다와 카메라 (W, A, S, D) 방향키로 내 플레이어를 움직이십시오. 그런 다음 카메라를 플레이어에 고정시키고 다른 플레이어를 자유롭게하려면

나는 당신은 당신의 화면 마다의 중심에 그리는 코드를 말하고있다

답변

6

문제는 SpriteBatch 투영 행렬이 Camera 투영 행렬로 설정되지 않을 것이다. 즉, 은 Camera에 상대적으로 렌더링되지 않습니다. 이것이 카메라가 움직이는 이유이지만, 스프라이트는 움직이지 않습니다. 올바른 행렬이 사용되지 않습니다.

또한 스프라이트는 화면 너비의 절반, 화면 높이의 절반으로 렌더링됩니다. 이 전화를 수정하려면 sprite.draw. Sprite의 내부 위치가 사용됩니다.

을 통해 SpriteBatch 투영 매트릭스를 설정하십시오. 이렇게하면 스프라이트가 카메라를 기준으로 렌더링됩니다.

@Override 
public void render(float delta) { 
    translateCamera(); 

    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    camera.update(); 

    renderer.setView(camera); 

    renderer.render(bgLayers); 

    //here's the line that was missing. 
    batch.setProjectionMatrix(camera.combined); 
    batch.begin(); 

    //be sure to call this instead of specifying position yourself! 
    splayerSprite.draw(batch); 
    batch.end(); 
    renderer.render(fgLayers); 

} 

WASD를 누를 ​​때마다 여전히 카메라의 위치를 ​​스프라이트의 위치로 스냅해야합니다. 그렇지만 그것은 간단합니다.플레이어가 방향 키를 사용하여 독립적으로하는 경우에만

if(!wasd_isDown){ 
    float deltaX = 0; 
    float deltaY = 0; 
    float MOVE_DIST = 10;//or whatever you need. 

    if(leftPressed) deltaX = -MOVE_DIST; 
    else if(rightPressed) deltaX = MOVE_DIST; 

    if(upPressed)deltaY = MOVE_DIST; 
    else if(downPressed)deltaY = -MOVE_DIST; 

    camera.position.add(deltaX, deltaY, 0); 
} 

이 카메라가 이동할 수 있습니다, 그리고 수 :

방향 키를 누르면 경우
//snap the camera to the sprite's center. 
if(wasd_isDown){ 
    float centerX = sprite.getX()+sprite.getWidth()/2; 
    float centerY = sprite.getY()+sprite.getHeight()/2; 
    camera.position.set(x,y, 0); 
} 

, 너무처럼 Vector3.add를 통해 카메라의 위치 벡터를 번역 스프라이트는 카메라의 방향과 관련하여 렌더링됩니다. 또한 WASD를 누르면 카메라가 즉시 스프라이트에 다시 스냅됩니다.

2

batch.draw(splayerSprite, Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2);

감사합니다, 그래서 나와 함께 곰하시기 바랍니다 libgdx하는 새입니다. Gdx.graphics.getWidth()/2Gdx.graphics.getHeight()/2을 입력 값에 따라 실제 값으로 변경해야합니다.

편집 # 2 : 라인 batch.setProjectionmatrix(camera.combined);은 내가 언급 한 모든 이외에 필요하다, 나는 모두 특정 라인 (이 기본 libGDX 프로젝트에 포함되어 있습니다) 내 코드에 이미 있었고,하지 않았다 통지하지 않았다 그 줄을 제거하고 데모를 실행 해보십시오. 내가 겪었을지도 모를 혼란을 없애기를 바랍니다.

편집 : 분명히 아무도 내 대답을 좋아하지 않았으므로 깨끗한 libGDX 게임에 지정된 컨트롤을 사용하여 데모를 작성했습니다. 카메라가 대상이되는 위치와 관계없이 (변환 된 이후) 스프라이트는 이고 항상이 전체 화면의 중앙에 렌더링되었습니다. 정적 위치 대신 batch.draw()에서 스프라이트의 위치를 ​​사용하는 것이 매우 필요합니다. 그렇지 않으면 이동하지 않습니다.

package com.me.mygdxgame; 

import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Input.Keys; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.Texture.TextureFilter; 
import com.badlogic.gdx.graphics.g2d.Sprite; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.math.Vector2; 

public class MyGdxGame implements ApplicationListener { 
    private OrthographicCamera camera; 
    private SpriteBatch batch; 
    private Texture texture; 
    private Sprite sprite; 
    private Sprite background; 

    private boolean lockToSprite; 
    private Vector2 vecCamera; 
    private Vector2 vecSprite; 

    @Override 
    public void create() {  
     float w = Gdx.graphics.getWidth(); 
     float h = Gdx.graphics.getHeight(); 

     camera = new OrthographicCamera(w, h); 
     batch = new SpriteBatch(); 

     lockToSprite = true; 
     vecCamera = new Vector2(); 
     vecSprite = new Vector2(); 

     texture = new Texture(Gdx.files.internal("data/libgdx.png")); 
     texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 

     TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275); 

     sprite = new Sprite(region); 
     sprite.setSize(0.1f * sprite.getWidth(), 0.1f * sprite.getHeight()); 
     sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2); 
     sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2); 

     background = new Sprite(region); 
     background.setOrigin(background.getWidth()/2, background.getHeight()/2); 
     System.out.println(background.getOriginX()); 
     background.setPosition(-background.getWidth()/2, -background.getHeight()/2); 
    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
     texture.dispose(); 
    } 

    @Override 
    public void render() { 
     camera.translate(vecCamera); 

     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     camera.update(); 

     camera.translate(vecCamera.cpy().mul(-1)); 

     float moveSensitivity = 0.9f; 

     Vector2 vecInputSprite = new Vector2(); 
     if (Gdx.input.isKeyPressed(Keys.UP)) 
      vecInputSprite.y += moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.DOWN)) 
      vecInputSprite.y -= moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.LEFT)) 
      vecInputSprite.x -= moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.RIGHT)) 
      vecInputSprite.x += moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.N)) 
      vecSprite.set(new Vector2()); 

     Vector2 vecInputCamera = new Vector2(); 
     if (Gdx.input.isKeyPressed(Keys.W)) 
      vecInputCamera.y += moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.S)) 
      vecInputCamera.y -= moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.A)) 
      vecInputCamera.x -= moveSensitivity; 
     if (Gdx.input.isKeyPressed(Keys.D)) 
      vecInputCamera.x += moveSensitivity; 

     if (Gdx.input.isKeyPressed(Keys.R)) { 
      vecCamera.set(new Vector2()); 
      lockToSprite = false; 
     } 

     if (vecInputCamera.len2() != 0) 
      lockToSprite = false; 
     else if (Gdx.input.isKeyPressed(Keys.L)) 
      lockToSprite = true; 

     if (lockToSprite) { 
      vecCamera.set(vecSprite); 
     } else { 
      vecCamera.add(vecInputCamera); 
     } 

     vecSprite.add(vecInputSprite); 

     batch.setProjectionMatrix(camera.combined); 
     batch.begin(); 
     background.draw(batch); 
     sprite.setPosition(vecSprite.x, vecSprite.y); 
     sprite.draw(batch); 
     //batch.draw(sprite, vecSprite.x, vecSprite.y); 
     batch.end(); 
    } 

    @Override 
    public void resize(int width, int height) { 
    } 

    @Override 
    public void pause() { 
    } 

    @Override 
    public void resume() { 
    } 
} 
+1

이것이 문제가되는 것은 맞지만 카메라를 움직이고 스프라이트가 정지 되어도 문제가 해결되지는 않습니다. –

+0

@WilliamMorrison "입력에 따라 변경"이라고 말했을 때 스프라이트가 카메라의 위치에 관계없이 전역 화면의 중앙으로 그려지는 것을 고려하면 스프라이트에 대해 엄격하게 말하며 'translateCamera() '라고 불렀다. 물론 카메라 위치도 입력의 영향을받습니다. 새로운 libGDX 게임의 새로운 복사본으로 데모를했습니다. – Pandacoder

+0

스프라이트 **는 카메라의 매트릭스가 변경 될 때마다 매번 같은 위치에 렌더링 되더라도 ** 이동합니다. 이것이 사실이 아니라면 정적으로 배치 된 객체는 카메라가 변환 될 때 화면을 가로 질러 움직이지 않는 것처럼 보입니다. OP의 문제는 카메라의 행렬과 일치하도록 스프라이트 배치의 행렬을 업데이트하지 않습니다. +1 데모. 쇼의 노력과 헌신! –

관련 문제