2017-02-03 9 views
0

У меня возникла проблема рисовать панель здоровья для текстур врага в правильном положении, когда игра начинается, а камера не перемещается, а экран порт:Текстуры бара здоровья движутся быстрее, чем игрок, когда камера начинает двигаться с начальной точки зрения.

FitViewport (GameConfig.WIDTH/GameConfig.PPM, GameConfig.HEIGHT/ GameConfig.PPM, GameCam);

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

И когда игрок получает определенное расстояние от врагов, их поведение установлено прибытию и они выследить игрок также вызывают бары здоровья двигаться дальше от экрана: here is the health bar off screen when the camera and enemies starts to move

public void drawHealthBar(SpriteBatch batch){ 
    batch.begin(); 
    batch.draw(wHB, 
      (this.getX() * GameConfig.PPM) + 20, (this.getY() * GameConfig.PPM) + 35 , 
      (Gdx.graphics.getWidth()/15) * wolfHealth, 8); 
    batch.draw(gHB, 
      (this.getX() * GameConfig.PPM) + 20, (this.getY() * GameConfig.PPM) + 35 , 
      (Gdx.graphics.getWidth()/15) * 1, 8); 
    batch.end(); 
} 

wHB и gHB - это области текстуры здоровья, Кто-нибудь может понять, почему это происходит?

Вот функция визуализации в моем классе Play Screen, где бар здоровья каждого wolfbeast врага втягивается:

public void render(float delta) { 
    update(delta); 
    Gdx.gl.glClearColor(1,0,0,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    // render map 
    renderer.render(); 

    // render map bodies 
    //box2DDebugRenderer.render(world, gameCam.combined); 

    game.getBatch().setProjectionMatrix(gameCam.combined); 
    game.getBatch().begin(); 
    player.draw(game.getBatch()); 
    for(WolfBeast wolfBeast: wolfEnemies){ 
     wolfBeast.draw(game.getBatch()); 
    } 
    for(WaterBlast waterBlast: waterBlasts) { 
     waterBlast.draw(game.getBatch()); 
    } 
    game.getBatch().end(); 

    hud.stage.draw(); 

    for(WolfBeast wolfBeast: wolfEnemies){ 

     if(wolfBeast.wolfHealth > .6) 
      game.getBatch().setColor(Color.GREEN); 
     else if(wolfBeast.wolfHealth > .2) 
      game.getBatch().setColor(Color.ORANGE); 
     else 
      game.getBatch().setColor(Color.RED); 

     wolfBeast.drawHealthBar(game.getBatch()); 
     game.getBatch().setColor(Color.WHITE); 
    } 

    if(Gdx.app.getType() == Application.ApplicationType.Android) { 
     moveButtons.drawButtons(); 
    } 


} 

Позвольте мне знать, если вам нужно больше информации и я обеспечу. Я думаю, что проблема в том, как я масштабирую свой мир с помощью PPM, может кто-нибудь, пожалуйста, скажите мне, что происходит, и как я могу это исправить?

public void update(float dt){ 
    stateTimer += dt; 
    int playerXpos = (int) player.pBody.getPosition().x; 
    int wolfBodyXpos = (int) this.eBody.getPosition().x; 
    //System.out.println("playerXpos: " + playerXpos + " " + "wolfXpos: " + wolfBodyXpos); 
    if (abs(playerXpos - wolfBodyXpos) >= 3.5f) { 
     Arrive<Vector2> arriveSB = new Arrive<Vector2>(entity, target) 
       .setTimeToTarget(.01f) 
       .setArrivalTolerance(2.5f) 
       .setDecelerationRadius(100); 
     entity.setBehavior(arriveSB); 
    } 
    else { 
     entity.setBehavior(null); 
    } 

    setPosition(eBody.getPosition().x - getWidth()/2, eBody.getPosition().y - getHeight()/2); 
    setRegion(getFrame(dt)); 
    entity.update(dt); 
} 

Кроме того, когда я закомментируйте строку, которая позволяет камере следовать плеер и камера не двигается, бары здоровья правильно остаться на врагов. Это не имеет никакого смысла, не должны ли бары двигаться только тогда, когда враги движутся when camera movement is off?

+0

Используйте StretchViewport, если ваша игра имеет box2D – Aryan

+0

Почему эта линия game.getBatch(). setProjectionMatrix (hud.stage.getCamera() вместе); – Aryan

+0

удалил эту строку, но все равно никаких изменений – kingx26

ответ

0

Проблема была в моей проекционной матрице. Я использовал другую проекцию для спрайта и другой для тела, поэтому они переехали в различных speeds.This лучше всего работает:

batch.draw(getFrame(dt), 
      pBody.getPosition().x,pBody.getPosition().y, 
      1,1, 
      1, 1, 
      1,1 , 
      0 
      ); 

Это работает для меня:

public void drawHealthBar(SpriteBatch batch){ 
    batch.draw(wHB, 
      eBody.getPosition().x - .4f, 
      eBody.getPosition().y + .2f, 
      .7f * wolfHealth, .12f 
       ); 
    batch.draw(gHB, 
      eBody.getPosition().x - .4f, 
      eBody.getPosition().y + .2f, 
      .7f, .12f 
       ); 
} 

внести изменения в ценности, основанных по размеру ваших активов и вашему масштабированию

 Смежные вопросы

  • Нет связанных вопросов^_^