2013-03-18 2 views
0

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

public class MyGdxGame implements ApplicationListener { 
OrthographicCamera mCamera; 
SpriteBatch mBatch; 
Texture mTexture, mMap; 
Sprite sprite; 
float touchX, touchY; 
float spriteX, spriteY, speed = 5; 

@Override 
public void create() { 
    float CAMERA_WIDTH = 480, CAMERA_HEIGHT = 320; 

    mBatch = new SpriteBatch(); 
    mTexture = new Texture(Gdx.files.internal("data/logo.png")); 
    mMap = new Texture(Gdx.files.internal("data/sc_map.png")); 
    mCamera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT); 
    mCamera.setToOrtho(false, CAMERA_WIDTH, CAMERA_HEIGHT); 
} 

@Override 
public void dispose() { 

} 

@Override 
public void render() { 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    mBatch.setProjectionMatrix(mCamera.combined); 
    mCamera.update(); 
    mBatch.begin(); 
    updateInput(); 
    drawD(); 
    mBatch.end(); 

} 

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

@Override 
public void pause() { 
} 

@Override 
public void resume() { 
} 

public void drawD() { 
    mCamera.position.set(spriteX, spriteY, 0); 
    mBatch.draw(mMap, 0, 0); 
    mBatch.draw(mTexture, spriteX, spriteY); 

} 

public void updateInput() { 

    if (Gdx.input.justTouched()) { 

     touchX = Gdx.input.getX(); 
     touchY = Gdx.input.getY(); 

    } 
    if (touchX != spriteX) { 

     if (spriteX < touchX) { 
      spriteX += speed; 
     } 
     if (spriteX > touchX) { 
      spriteX -= speed; 
     } 
    } 
    if (touchY != spriteY) { 
     if (spriteY > Gdx.graphics.getHeight() - touchY) { 
      spriteY -= 10; 
     } 
     if (spriteY < Gdx.graphics.getHeight() - touchY) { 
      spriteY += 10; 
     } 
    } 

} 

}

+0

Можете ли вы описать более подробно, что вы имеете в виду под «Я пытаюсь сделать спрайт двигаться, пока камера следует "? – Jyro117

+0

Когда пользователь нажимает/касается, я хочу получить координаты x и y и переместить спрайт туда. Камера должна двигаться вместе с ней, поэтому спрайт всегда будет находиться в центре камеры. Похоже на такие игры, как Diablo. – user2180581

+0

Я отправлю реальный ответ, когда у меня появится шанс (если кто-то меня не избивает). Один из способов сделать то, что вы хотите, - это нарисовать персонажа в центре экрана, зафиксировать камеру, а затем переместить карту/врагов/объектов/и т. Д. В противоположном направлении вместо перемещения символа. Это создает иллюзию движения персонажа, но удерживает их в центре экрана. – Jyro117

ответ

2

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

  • Ортографическая камера, когда вы устанавливаете камеру 0,0, является центром экрана. Ширина и высота - это то, что вы указали в конструкторе. Таким образом, верхний край будет x, 160, а нижний край будет x, -160. Левый край будет равен -240, y, а правый край - 240, y.
  • drawD() Обратите внимание, что я рисую спрайт посередине изображения, и он не перемещается. Вместо этого я перемещаю карту в противоположном направлении (y инвертируется).
  • updateInput() Примечание. Я передаю значение дельта (это время в секундах между кадрами), что позволяет плавно перемещать вещи. Скорость равна 120, так что это плавно перемещает вашего персонажа со скоростью 120 секунд.
  • Условие if в принципе является просто способом сравнения значений поплавка, поэтому он останавливается, когда он приближается. Это предотвращает перегрузку позиции цели, а затем отскакивает назад и вперед, потому что она, возможно, не сможет получить точное значение.
  • Я добавил, что вы отправляете вызовы для загруженных текстур, это важно, поскольку вы не хотите заполнять свою память.

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

Основываясь на ваш комментарий я верю, что вы ищете что-то ближе к этому:

public class MyGdxGame implements ApplicationListener { 
    OrthographicCamera mCamera; 
    SpriteBatch mBatch; 
    Texture mTexture, mMap; 
    float touchX, touchY; 
    float spriteX, spriteY, speed = 120; 

    final float CAMERA_WIDTH = 480, CAMERA_HEIGHT = 320; 

    @Override public void create() { 
     mCamera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT); 

     mBatch = new SpriteBatch(); 
     mTexture = new Texture(Gdx.files.internal("data/logo.png")); 
     mMap = new Texture(Gdx.files.internal("data/sc_map.png")); 
    } 

    @Override public void dispose() { 
     mTexture.dispose(); 
     mMap.dispose(); 
    } 

    @Override public void render() { 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     updateInput(Gdx.graphics.getDeltaTime()); 
     mCamera.update(); 
     mBatch.setProjectionMatrix(mCamera.combined); 
     mBatch.begin(); 
     drawD(); 
     mBatch.end(); 
    } 

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

    @Override public void pause() {} 

    @Override public void resume() {} 

    public void drawD() { 
     mBatch.draw(mMap, -spriteX - (mMap.getWidth()/2), spriteY - (mMap.getHeight()/2)); 
     mBatch.draw(mTexture, -32, -32, 64, 64); 
    } 

    public void updateInput(final float delta) { 
     if (Gdx.input.justTouched()) { 
      touchX = Gdx.input.getX() - (Gdx.graphics.getWidth()/2); 
      touchY = Gdx.input.getY() - (Gdx.graphics.getHeight()/2); 
     } 
     final float dv = delta * speed; 
     if (Math.abs(touchX - spriteX) > 1) { 
      if (spriteX < touchX) { 
       spriteX += dv; 
      } 
      if (spriteX > touchX) { 
       spriteX -= dv; 
      } 
     } 
     if (Math.abs(touchY - spriteY) > 1) { 
      if (spriteY > touchY) { 
       spriteY -= dv; 
      } 
      if (spriteY < touchY) { 
       spriteY += dv; 
      } 
     } 
    } 
} 
+0

Большое спасибо, я работал над этим довольно долго. Но это прекрасно. Последний последний вопрос, если вы не возражаете, хотя ... Когда я делаю другие вещи, такие как объекты/стены, мне нужно переместить их вручную или есть способ «прикрепить» их к карте? Еще раз спасибо! – user2180581

+0

Мое лучшее предложение - изучить структуру фреймворка Scene2d в LibGDX. Я признаю, что это довольно сложная система, но она покажет вам только один из способов организации «групп» объектов. – Jyro117

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