2013-03-18 58 views
0

我是新来libgdx,我试图做一个精灵的举动,而相机如下。我可以让精灵完美地移动,直到我将相机连接到它。当我点击时,精灵将移动到它感觉的任何地方(看起来),并且相机将正确地跟随。我尝试了一些不同的东西,但在这一点上它只是猜测和检查。雪碧不能正常移动。 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 2013-03-18 03:18:02

+0

当用户点击/触摸时,我想获取x和y坐标并让精灵在那里移动。相机应随之移动,因此精灵将始终位于相机的中心。类似于Diablo这样的游戏。 – user2180581 2013-03-18 06:17:42

+0

当我有机会的时候,我会发布一个真实的答案(如果有人不打我的话)。你可以按照自己想要的一种方式在屏幕中心绘制角色,固定相机,然后沿相反方向移动地图/敌人/物体等,而不是移动角色。这给人物移动的幻觉,但保持他们在屏幕的中心。 – Jyro117 2013-03-18 13:03:55

回答

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 2013-03-19 02:35:18

+0

我最好的建议是查看LibGDX中的Scene2d框架设置。我承认这是一个相当复杂的系统,但它会告诉你只有一种方法来组织“对象组”。 – Jyro117 2013-03-19 02:50:00