Актер LibGDX не выполняет действие

#java #libgdx #action #actor

#java #libgdx #Экшен #актер

Вопрос:

Я не могу заставить своего карточного актера выполнить действие (у меня нет проблем с добавлением и выполнением действий с изображениями и текстурами).Это мой Card.class код :

 public class Card extends Actor {
final float CARD_WIDTH = 500 * cardScale;
final float CARD_HEIGHT = 726 * cardScale;
String face, suit;
public Texture cardFace = new Texture("CardTextures/"   face   suit   ".png");

Vector2 position = new Vector2(0, 0);

public Card(String face, String suit, Vector2 position) {
    this.face = face;
    this.suit = suit;
    this.position = position;
    setBounds(position.x, position.y, CARD_WIDTH, CARD_HEIGHT);
}

public Card(String face, String suit) {
    this.face = face;
    this.suit = suit;
    this.position = position;
    setBounds(position.x, position.y, CARD_WIDTH, CARD_HEIGHT);
}

@Override
public void act(float delta) {
    super.act(delta);

}

@Override
public void draw(Batch batch, float alpha) {
    batch.draw(cardFace, position.x, position.y, cardFace.getWidth() * cardScale, cardFace.getHeight() * cardScale);
}

public String getFace() {
    return face;
}

public String getSuit() {
    return suit;
}

public void setCardPosition(Vector2 position) {
    this.position = position;

}

public void setCardFaceTexture() {
    cardFace = new Texture(("CardTextures/"   this.getFace()   this.getSuit()   ".png"));
}
  

}

Всякий раз, когда я пытаюсь выполнить действие с карточным актером, это не работает. Даже когда я помещаю действия в метод Create(), он не работает. Я попробовал это :

 moveAction = new MoveToAction();
    moveAction.setPosition(300f, 0f);
    moveAction.setDuration(10f);
    Card card = new Card("two", "spades");
    card.addAction(moveAction);
  

Это мой метод рендеринга :

  @Override
public void render() {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
    updateActorBounds();

    camera.update();

    batch.setProjectionMatrix(camera.combined);

    batch.begin();
    font.draw(batch, "FPS:"   Gdx.graphics.getFramesPerSecond(), TABLE_WIDTH / 2 - 65, TABLE_HEIGHT / 2 - 10);
    batch.end();
}
  

Комментарии:

1. вы добавили свою карточку на сцену?

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

3. где вы обновляете переменную положения ваших карт? Вы вызываете act, который вызывает метод super.act(), а в вашем переопределенном методе рисования вы используете batch.draw(cardFace, position.x, position.y, cardFace.getWidth() … но position.x и .y обновляются, когда? действие действует на позицию актера (попробуйте поместить методы getX() и getY() в переопределенный чертеж, чтобы увидеть, есть ли разница)

4. Теперь я понимаю. Установка getX и getY сработала. Но теперь у меня другая проблема. У меня есть все мои карты в массиве (карта [] колода = новая карта [52]). И они инициализируются следующим образом: deck [0] = новая карта («две», «пики») и т. Д…. когда я пытаюсь deck[0].addAction(MoveAction); это просто не работает

5. Вы должны создать новое действие для каждого из них. Вы должны создавать свои действия с помощью Action.MoveToAction вместо нового MoveToAction. Таким образом, используемые вами действия объединяются в пул.

Ответ №1:

Ваш Card использует свою собственную позицию Vector2 position . Когда вы добавляете a MoveAction к своему Card , действие получает доступ и изменяет переменные x and y внутри Actor класса, а не ваши. Это означает, что если вы хотите, чтобы ваш Card отображался там, где указано в действиях, вместо того, чтобы рисовать position.x, position.y , вам нужно рисовать getX(), getY() .

Ваш конструктор будет выглядеть:

 public Card(String face, String suit, Vector2 position) {
    this.face = face;
    this.suit = suit;
    setBounds(position.x, position.y, CARD_WIDTH, CARD_HEIGHT);
}
  

Ваш метод рисования будет выглядеть следующим образом:

 @Override
public void draw(Batch batch, float alpha) {
    batch.draw(cardFace, getX(), getY(), cardFace.getWidth() * cardScale, cardFace.getHeight() * cardScale);
}