2015-03-12 3 views
0

Я добрый новый для LibGdx, и я все еще учусь. Я работаю над небольшим игровым проектом, чтобы изучить эту приятную структуру. Однако у меня возникают проблемы с моей игрой. Моя игра - стрелок сверху вниз. Существует человеческий характер (космический морской), который должен стрелять в инопланетянина, который всегда будет двигаться в его направлении, пока он не умрет. У моего кода еще нет пуль. Я смог заставить стрелка вращаться в направлении курсора, а иностранец вращается в направлении стрелка, но я не могу заставить инопланетянина двигаться в его направлении , Я почти уверен, что мой метод, который делает это, является абсолютно неправильным. Я пробовал много, чтобы исправить это, но я не могу исправить это! Я ценю ваше внимание, ребята! Вы можете найти полный код главного класса здесь: https://github.com/Igor-Lopes/LibGdx/blob/master/Splash.java#L125LibGdx - Переместить Sprite в направлении другого

public void moveAlien() { 
    float mX = 0; 
    float mY = 0; 
    int velocity = 50; 
    vAlien = new Vector2(-1 * (float) Math.sin(Alienbody.getAngle()) * velocity, 
      (float) Math.cos(Alienbody.getAngle() * velocity)); 

    mX = (float) Math.cos(Math.toRadians(spacemarine.getRotation())); 
    mY = (float) Math.sin(Math.toRadians(spacemarine.getRotation())); 

    vAlien.x = mX; 
    vAlien.y = mY; 
    if (vAlien.len() > 0) { 
     vAlien = vAlien.nor(); 
    } 
    vAlien.x = vAlien.x * velocity; 
    vAlien.y = vAlien.y * velocity; 
    vAlien.x += vAlien.x * Gdx.graphics.getDeltaTime(); 
    vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime(); 
} 

public float rotateMarine() { 
    float angle = 0; 
    float mouseX = 0; 
    float mouseY = 0; 
    mouseX = Gdx.input.getX(); 
    mouseY = 677 - Gdx.input.getY(); 
    angle = (float) Math.toDegrees(Math.atan2(mouseX - spacemarine.getX(), 
      mouseY - spacemarine.getY())); 
    if (angle < 0) 
     angle += 360; 
    spacemarine.setRotation(angle * -1); 
    return angle; 
} 

public float rotateAlien(Sprite s, float posX, float posY) { 
    float angle = 0; 
    float mouseX = 0; 
    float mouseY = 0; 
    mouseX = posX; 
    mouseY = posY; 
    angle = (float) Math.toDegrees(Math.atan2(mouseX - s.getX(), mouseY - s.getY())); 
    if (angle < 0) 
     angle += 360; 
    s.setRotation(angle * -1); 
    return angle; 
} 

@Override 
public void render(float delta) { 
    float angle; 
    moveAlien(); 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    world.step(Gdx.graphics.getDeltaTime(), 6, 2); 
    angle = rotateMarine(); 
    rotateAlien(alien, spacemarine.getX(), 
      spacemarine.getY()); 
    if (Gdx.input.isKeyPressed(Input.Keys.W) == true 
      && spacemarine.getY() < 560) { 
     Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() + 4, 
       angle); 
    } 
    if (Gdx.input.isKeyPressed(Input.Keys.S) == true 
      && spacemarine.getY() > 0) { 
     Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() - 4, 
       angle); 
    } 
    if (Gdx.input.isKeyPressed(Input.Keys.D) == true 
      && spacemarine.getX() < 920) { 
     Marinebody.setTransform(spacemarine.getX() + 4, spacemarine.getY(), 
       angle); 
    } 
    if (Gdx.input.isKeyPressed(Input.Keys.A) == true 
      & spacemarine.getX() > 8) { 
     Marinebody.setTransform(spacemarine.getX() - 4, spacemarine.getY(), 
       angle); 
    } 
    alien.setPosition(Alienbody.getPosition().x, Alienbody.getPosition().y); 
    spacemarine.setPosition(Marinebody.getPosition().x, Marinebody.getPosition().y); 
    batch.begin(); 
    spacemarine.draw(batch); 
    alien.draw(batch); 
    batch.end(); 
    // stage.act(); 
    // stage.draw(); 
} 
+0

Вы используете Box2D? Если это так, то вы не должны устанавливать позиции 'Body' напрямую, но пусть физический движок (Box2D) справится с этим. Это означает, что вы должны использовать силы и импульсы для перемещения тела. – Springrbua

+0

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

+0

Как только вы начали использовать Libgdx, я предлагаю вам начать с менее сложных игр без использования Box2D. В любом случае, (IMHO) лучший способ узнать Box2D - http://www.iforce2d.net/b2dtut/. Примеры находятся на C++, насколько я помню, но теория такая же, и вы должны иметь возможность делать то же самое с оберткой jBox2D. – Springrbua

ответ

0

У меня было решение на некоторое время, но я забыл отправить сообщение. Вот способ перемещения списка врагов к игроку.

public void moveAlien() { 

    for (Aliens a : aliens) { //List of Aliens (Enemy) 
     Sprite s = a.getSprite(); //Get current enemy's sprite 
     float targetX = spacemarine.getX(); //Player's X 
     float targetY = spacemarine.getY(); //Player's Y 
     float spriteX = s.getX(); //Enemy's X 
     float spriteY = s.getY(); //Enemy's Y 
     float x2 = s.getX(); //Enemy's new X 
     float y2 = s.getY(); //Enemy's new Y 
     float angle; // We use a triangle to calculate the new trajectory 
      angle = (float) Math 
        .atan2(targetY - spriteY, targetX - spriteX); 
      x2 += (float) Math.cos(angle) * 125 
        * Gdx.graphics.getDeltaTime(); 
      y2 += (float) Math.sin(angle) * 125 
        * Gdx.graphics.getDeltaTime(); 
      s.setPosition(x2, y2); //Set enemy's new positions. 
     } 
} 
0

У меня нет достаточного количества очков репутации еще добавить «комментарий», и я не уверен, если это ваша проблема, но одна определенная ошибка делает «Y + = X» в вашем методе moveAlien на строке: vAlien.y + = vAlien.x * Gdx.graphics.getDeltaTime();

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

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