Обнаружение libGDX box2d конкретного экземпляра объекта - PullRequest
0 голосов
/ 28 мая 2018

Меня немного смущает метод beginContact из box2d.

У меня есть класс Runner , который порождает в игре одного бегуна.В игре у меня есть несколько бегунов, и я хочу обнаружить столкновение между конкретным экземпляром бегуна и препятствием.В beginContact () Я хочу запустить hit () метод для раннера, которого ударили.

public void beginContact(Contact contact) {

    final Body a = contact.getFixtureA().getBody();
    final Body b = contact.getFixtureB().getBody();
    if ((BodyUtils.bodyIsRunner(a) && BodyUtils.bodyIsEnemy(b)) ||
            (BodyUtils.bodyIsEnemy(a) && BodyUtils.bodyIsRunner(b))) {
        Runner c;
        if(BodyUtils.bodyIsRunner(a)) c = (Runner) a.getUserData();
        else c = (Runner) b.getUserData();
        c.hit();

Но в этой строке:

if(BodyUtils.bodyIsRunner(a)) c = (Runner) a.getUserData();

Игра вылетает с исключением:

com.pl.runner.box2d.RunnerUserData cannot be cast to com.pl.runner.entities.Runner

Я не знаю, как с этим справиться сейчас, так что еслилюбой может дать совет или решение, я буду очень благодарен.Возможно, я упускаю что-то простое, я застрял в этом коде слишком долго.

Вот класс RunnerUserData:

public class RunnerUserData extends UserData {

    private final Vector2 runningPosition = new Vector2(Constants.RUNNER_X, Constants.RUNNER_Y);
    private final Vector2 dodgePosition = new Vector2(Constants.RUNNER_DODGE_X, Constants.RUNNER_DODGE_Y);
    private Vector2 jumpingLinearImpulse;


    public RunnerUserData(float width, float height) {
        super(width,height);
        jumpingLinearImpulse = Constants.RUNNER_JUMPING_LINEAR_IMPULSE;
        userDataType = UserDataType.RUNNER;
    }

    public Vector2 getJumpingLinearImpulse() {
        return jumpingLinearImpulse;
    }

    public void setJumpingLinearImpulse(Vector2 jumpingLinearImpulse) {
        this.jumpingLinearImpulse = jumpingLinearImpulse;
    }

    public float getHitAngularImpulse() {
        return Constants.RUNNER_HIT_ANGULAR_IMPULSE;
    }

    public float getDodgeAngle() {
        // In radians
        return (float) (-90f * (Math.PI / 180f));
    }

    public Vector2 getRunningPosition() {
        return runningPosition;
    }

    public Vector2 getDodgePosition() {
        return dodgePosition;
    }
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Поскольку мои RunnerUserData играют немного другую роль в моей игре, я просто не могу передать Runner в body.setUserdata (runner).

Так что у меня есть небольшой обходной путь иработает нормально, может быть, кому-нибудь когда-нибудь это поможет: в методе beginContact ():

            Body c;
            if(a.getUserData() instanceof RunnerUserData) c = a;
            else c = b; //checks which body is a runner
            for (Runner r : runners){
                if(r.getUserData() == c.getUserData()){
                    runners.remove(r); 
                    break; //do something if you detect proper runner and quit the loop
                }
            }
0 голосов
/ 29 мая 2018

Ваша проблема описывается довольно просто исключением: вы пытаетесь привести RunnerUserData к Runner, что вы не можете сделать, потому что Runner не является экземпляром RunnerUserData.

Обходным путем будет передача фактического Runner объекта в качестве пользовательских данных, например body.setUserdata(this) (в классе Runner).

Вы можете использовать следующеечтобы определить, являются ли пользовательские данные прибора объектом Runner:

if (body.getUserData() instanceof Runner) {}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...