7

テレポートで接触中にプレイヤーの体を動かそうとしていますが、setTransform が実行されません。これは私の接触リスナーです。

mPhysicsWorld.setContactListener(new ContactListener()
    {

        @Override
        public void beginContact(Contact contact) 
        {

            final Fixture fixtureA = contact.getFixtureA();
            final Body bodyA = fixtureA.getBody();

            final Fixture fixtureB = contact.getFixtureB();
            final Body bodyB = fixtureB.getBody();
            if(bodyA.getUserData().equals("Player") || bodyB.getUserData().equals("Player") )
            {

                for(int i = 0; i < telList.size(); i++)
                {
                    if(bodyA.getUserData() == telList.get(i))
                    {
                        Teleport tl = telList.get(i);
                        if(tl.look.getX() > pl.look.getX())
                        {
                            pl.moveTo(150, 320);
                            pl.setLinearVelocity(new Vector2(-4.5f,0));
                        }else
                        {
                            pl.moveTo(150, 320);
                            pl.setLinearVelocity(new Vector2(4.5f,0));
                        }
                        break;
                    }else if(bodyB.getUserData() == telList.get(i))
                    {
                        Teleport tl = telList.get(i);
                        if(tl.look.getX() > pl.look.getX())
                        {
                            pl.moveTo(150, 320);
                            pl.setLinearVelocity(new Vector2(-4.5f,0));
                        }else
                        {
                            pl.moveTo(150, 320);
                            pl.setLinearVelocity(new Vector2(4.5f,0));
                        }
                        break;
                    }
                }
            }
        }

        @Override
        public void endContact(Contact contact) 
        {

        }
        });

Player クラスにはメソッドがあります

public void moveTo(int x, int y)
{
    body.setTransform(new Vector2(x/32,y/32), 0);
}

正常に動作しますが、連絡先リスナー内では実行されません。そして、if ブロックに入って pl.setLinearVelocity(new Vector2(-4.5f,0)); になっているので、確実に接触が発生します。実行されます。

前もって感謝します

4

1 に答える 1

6

連絡先リスナー内で setTransform を使用できない理由はわかりませんが、この方法でこの問題を解決しました。タスク用のクラスを作成しました

public class moveBodyTask {

Player pl;
float x;
float y;
boolean direction;
moveBodyTask(Player b, float x1, float y1, boolean d)
{
    pl = b;
    x = x1;
    y = y1;
    direction = d;
}

public void move()
{
    pl.moveTo(x, y);
    if(direction)
        pl.setLinearVelocity(new Vector2(5,0));
    else
        pl.setLinearVelocity(new Vector2(-5,0));

}

}

次に、contackリスナー内で、リストに新しいタスクを追加するだけです

    taskList.add(new moveBodyTask(pl, x+TILE_SIZE, y, true));

更新中に実行します

scene.registerUpdateHandler(new IUpdateHandler()
    {

        @Override
        public void onUpdate(float pSecondsElapsed) {
            if(!taskList.isEmpty())
            {
                for(int i = 0; i < taskList.size(); i++)
                {
                    taskList.get(i).move();
                }
                taskList.clear();
            }

        }

        @Override
        public void reset() {
            // TODO Auto-generated method stub

        }
    });

私にとってはうまくいきます。

于 2011-08-31T15:53:40.710 に答える