2014-12-27 1 views
0

У меня есть плиточная карта шириной 40960 пикселей и высотой 640 пикселей.LibGdx - SideScroller с TiledMap и двумя актерами

У меня также есть главный символ и badguy, которые являются 64px wide и 64px high.

Предполагая, что левый нижний угол плиточной карты отображается в (0,0) в пикселях. Я пытаюсь запустить главный символ в позиции (0,0) плиточной карты и иметь возможность полностью перемещаться на другой конец плиточной карты вдоль оси x, зависящей от ввода пользователя.

Также я хочу, чтобы плохой парень отображался на (255,0) по оси x и имел диапазон перемещения между 255 и 511 по оси x, это будет управляться программно.

В настоящий момент в моем коде будет отображаться черепичная карта и два символа, но когда я перемещаю один из символов, другой персонаж также перемещается.

I have a link here to an image for clarity

Вот мой код в классе, который реализует интерфейс экрана libGdx.

public TestScreen(MyGame game){ 
    this.game = game; 


    camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    camera.position.set(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2, 0); 
    camera.update(); 

    String filename = "levelMaps/level_1.tmx"; 
    map = new TmxMapLoader().load(filename);   
    mapRenderer = new OrthogonalTiledMapRenderer(map); 

    mainPlayer = new Player(); 

    badGuy = new BadGuy(); 
    badGuy.velocity.x = camera.position.x; 
} 

@Override 
public void render(float delta) { 

    Gdx.gl.glClearColor(0, 0, 0.2f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);  

    mapRenderer.setView(camera);   
    mapRenderer.render(); 

    game.batch.begin();  
    mainPlayer.render(game.batch); 

    badGuy.render(game.batch); 
    game.batch.end(); 


    //simple input handling 
    if(Gdx.input.isKeyPressed(Keys.LEFT)){ 
     if(mainPlayer.velocity.x >= 0 && camera.position.x > 400){ 
      mainPlayer.moveLeft();  
      camera.position.x -= Math.abs(superSim.velocity.x); 
     } else { 
      camera.position.x = 400; 
      superSim.velocity.x = 0; 
     } 
    } 

    if(Gdx.input.isKeyPressed(Keys.RIGHT)){ 
     if(mainPlayer.velocity.x >= 0 && camera.position.x < 41286-(64*12)){ 
      mainPlayer.moveRight();  
      camera.position.x += superSim.velocity.x; 
     } 
    } 

    camera.update(); 
    mainPlayer.update(delta); 
} 

Как я могу получить положение badguys, чтобы оставаться неизменным, пока позиция игроков динамична?

Anyhelp действительно оценили

+0

, который является superSim, я думаю, что вы должны добавить к вашему вопросу –

+0

С другой стороны, вы говорите: 'badGuy.velocity.x = camera.position.x;' правильно или хотите сказать 'badGuy.position. x = camera.position.x; ' –

+0

yep thats right –

ответ

0

Это, как я inialize свою камеру, чтобы быть 16 * 9 единиц.

private OrthographicCamera camera; 
camera = new OrthographicCamera(16, 9); 
camera.position.set(camera.viewportWidth/2, 
      camera.viewportHeight/2, 0); 
camera.update(); 

Мой метод изменения размера

public void resize(int width, int height) { 
     camera.viewportHeight = 16 * (float) height/(float) width; 
     camera.update(); 
    } 

Действительно моя камера 16 * у единиц, потому что я рассчитать высоту для сохранения той же пропорции.

Используйте deltaTime для перемещения, чтобы приложение работало плавно на разных скоростях fps. Ваша обработка ввода очень странная. Почему вы меняете положение камеры? Если вам нужно, чтобы сделать вашу камеру следить за игроком, то сделать что-то вроде этого:

import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.mygdx.game.entities.Player; 

    public class ExtendedCamera extends OrthographicCamera { 
     public Player player; 

     public ExtendedCamera(Player player) { 
      super(Constants.WORLD_WIDTH, Constants.WORLD_HEIGHT); 
      this.player = player; 
     } 

     public void followPlayer() { 
      if (player.body.getPosition().x - position.x > Constants.CAMERA_FOLLOW_LINE_X) { 
       position.x = player.body.getPosition().x 
         - Constants.CAMERA_FOLLOW_LINE_X; 
       update(); 
      } else if (player.body.getPosition().x - position.x < -Constants.CAMERA_FOLLOW_LINE_X) { 
       position.x = player.body.getPosition().x 
         + Constants.CAMERA_FOLLOW_LINE_X; 
       update(); 
      } 
      if (player.body.getPosition().y - position.y > Constants.CAMERA_FOLLOW_LINE_Y) { 
       position.y = player.body.getPosition().y 
         - Constants.CAMERA_FOLLOW_LINE_Y; 
       update(); 
      } else if (player.body.getPosition().y - position.y < -Constants.CAMERA_FOLLOW_LINE_Y) { 
       position.y = player.body.getPosition().y 
         + Constants.CAMERA_FOLLOW_LINE_Y; 
       update(); 
      } 
     } 
    } 

С помощью этого метода наблюдения игрок имеет зону, где он может свободно перемещаться и камера не будет следовать за ним. Если игрок покинул эту зону, камера движется.

+0

Спасибо ... это действительно помогло, и мне удалось заставить ее работать –

+0

Добро пожаловать. – nikoliazekter