如何在游戏过程中重新定位移动动画?

时间:2017-06-08 13:33:02

标签: java android animation libgdx

我正在使用Android Studio IDE,使用libGDX框架来开发游戏。它是Pac-Man游戏的一个副本,与飞扬的鸟类有着相似的游戏玩法。这个概念是,pac人穿过木板,同时避免来自正确方向的鬼魂,这些鬼魂直接向左移动(不追逐玩家的位置)。我不确定如何创建一个for循环'对于幽灵动画,我希望鬼魂能够在几秒钟后从右侧重新定位并重新出现,除了它们最初完全脱离屏幕。

其中一个Ghosts的课程。

public class Blinky {

private Vector3 position; //x y and z axis
private Rectangle bounds;
private Texture texture1;
private Animation blinkyAnimLeft;

public Blinky(int x, int y) {

    position = new Vector3(x, y, 0);
    Texture texture1 = new Texture("blinkyLeft.png");
    blinkyAnimLeft = new Animation(new TextureRegion(texture1), 2, 0.5f);
    //bounds = new Rectangle(x,y,texture1.getWidth() / 2, texture1.getHeight());
}

public void update(float dt) {

    blinkyAnimLeft.update(dt);
   //bounds.setPosition(position.x, position.y);
}

public Vector3 getPosition() {
   return position;
}

public TextureRegion getTexture() {
    return blinkyAnimLeft.getFrame();
}

//public Rectangle getBounds() {
    return bounds;
}

  public void dispose() {
    texture1.dispose();
  }
}

Ghosts和Player在GamePlayState类中初始化

public class GamePlayState extends State  {
//Variables
private float timePassed = 0;
private Texture background;
public static final int WALK = 1;
public static final double GHOST_WALK = 0.5;
private static final int PLANKS_SPACING = 125;   //gap betwen the planks
private static final int PLANK_COUNT = 4;
private Array<Obstacle> planks;
private Player player;
private Blinky blinky;
private Inky   inky;
private Texture missile;

public GamePlayState(GameStateManager gsm) {
    super(gsm);
    player = new Player(50, 100);
    blinky = new Blinky(400, 220);
    inky = new Inky(400, 240);
    //   missile = new Texture("missile.png");

    background = new Texture("black.jpg");
    cam.setToOrtho(false, PacMan.WIDTH/2, PacMan.HEIGHT/2);

    planks = new Array<Obstacle>();

    for (int i = 1; i<= PLANK_COUNT; i++) {
        planks.add(new Obstacle(i * (PLANKS_SPACING + Obstacle.PLANK_WIDTH)));
    }
}

@Override
public void handleInput() {

}

@Override
public void update(float dt) {
    handleInput();
    player.update(dt);
    blinky.update(dt);
    inky.update(dt);
    cam.position.x = player.getPosition().x + 80;    //update the position of the camera with the bird

    //update when pacman cam viewport has passed plank
    //make cam follow the player
    for (Obstacle plank: planks) {

        if (cam.position.x - (cam.viewportWidth/1) > plank.getPosTopPlank().x + plank.getTopPlank().getWidth()) {

            plank.respositionPlanks(plank.getPosTopPlank().x + ((Obstacle.PLANK_WIDTH + PLANKS_SPACING * PLANK_COUNT )));
        }
        if (plank.collision (player.getBounds()))
        gsm.set(new GamePlayState(gsm));
    }
    cam.update();
    }

@Override
public void render(SpriteBatch sb) {

    sb.setProjectionMatrix(cam.combined);
    sb.begin();
    sb.draw(background, cam.position.x - (cam.viewportWidth/2), 0);
    timePassed += Gdx.graphics.getDeltaTime();

    //Moving Inky
    sb.draw(inky.getTexture(), inky.getPosition().x, inky.getPosition().y);
    inky.getPosition().x -= GHOST_WALK;

    //Moving Blinky
    sb.draw(blinky.getTexture(), blinky.getPosition().x, blinky.getPosition().y);
    blinky.getPosition().x -= GHOST_WALK;

1 个答案:

答案 0 :(得分:0)

你应该从Vector3获得x,y(和z)位置。 然后检查边框

if (inky.getPosition().x < 0){
    Thread.sleep(/*a few sdeconds*/2000);/*Android studio would ask you about wrapping it with try - catch*/
    inky.setPostion( x + /*screen x size*/,
        inky.getPosition().y,inky.getPosition().z)/*add setter in ghost class*/
}

事实上,这不是最好的方法,而是最简单的方法