【问题标题】:Andengine Collision Not detected未检测到与引擎碰撞
【发布时间】:2015-06-11 16:04:45
【问题描述】:

我创建了一个玩家矩形和一个敌人矩形,它们创建了应该发生碰撞的矩形体,并且应该调用接触侦听器的 beginContact() 方法。不知道为什么它没有被调用:/

public class GameScene extends Scene{
Engine mEngine;
Camera mCamera;
BaseGameActivity activity;
VertexBufferObjectManager vbom;

PhysicsWorld world;

Rectangle player;
Rectangle enemy;

public GameScene(Engine mEngine, Camera mCamera, BaseGameActivity activity, VertexBufferObjectManager vbom) {
    this.mEngine = mEngine;
    this.mCamera = mCamera;
    this.activity = activity;
    this.vbom = vbom;

    load();
}

void load(){

    world = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH),false);


    player = new Rectangle(mCamera.getWidth()/2,mCamera.getHeight()/2,50,50,vbom){
        @Override
        public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
            fire();
            return true;
        }
    };

    enemy = new Rectangle(mCamera.getWidth()/2,mCamera.getHeight()/2 - 400,50,50,vbom){
        @Override
        public void onAttached() {

            TimerHandler handler = new TimerHandler(3, new ITimerCallback() {
                @Override
                public void onTimePassed(TimerHandler pTimerHandler) {
                    enemyFire();
                }
            });

            handler.setAutoReset(true);

            registerUpdateHandler(handler);
            super.onAttached();
        }
    };

    attachChild(enemy);
    attachChild(player);
    registerUpdateHandler(world);

    world.setContactListener(new ContactListener() {
        @Override
        public void beginContact(Contact contact) {
            Log.e("begin","Contact");
        }

        @Override
        public void endContact(Contact contact) {

        }

        @Override
        public void preSolve(Contact contact, Manifold manifold) {

        }

        @Override
        public void postSolve(Contact contact, ContactImpulse contactImpulse) {

        }
    });
    registerTouchArea(player);
}

void enemyFire(){
    Rectangle rect = new Rectangle(mCamera.getWidth()/2,mCamera.getHeight()/2 - 400,50,50,vbom);
    FixtureDef fix = PhysicsFactory.createFixtureDef(0.5f,0.5f,0.5f);
    Body b = PhysicsFactory.createBoxBody(world,rect, BodyDef.BodyType.KinematicBody,fix);

    b.setLinearVelocity(0, 7);
    attachChild(rect);
    world.registerPhysicsConnector(new PhysicsConnector(rect, b));

}


void fire(){
    Rectangle rect = new Rectangle(mCamera.getWidth()/2,mCamera.getHeight()/2,50,50,vbom);
    FixtureDef fix = PhysicsFactory.createFixtureDef(0.5f,0.5f,0.5f);
    Body b = PhysicsFactory.createBoxBody(world,rect, BodyDef.BodyType.KinematicBody,fix);

    b.setLinearVelocity(0,-7);
    attachChild(rect);
    world.registerPhysicsConnector(new PhysicsConnector(rect,b));

}

}

【问题讨论】:

    标签: android box2d andengine


    【解决方案1】:

    因为它有点复杂。应该是这样的:

    private ContactListener createContactListener()
    {
    ContactListener contactListener = new ContactListener()
    {
        @Override
        public void beginContact(Contact contact)
        {
            final Fixture x1 = contact.getFixtureA();
            final Fixture x2 = contact.getFixtureB();
    
            if (x2.getBody().getUserData().equals("player")&&x1.getBody().getUserData().equals("monster"))
            {
            Log.i("CONTACT", "BETWEEN PLAYER AND MONSTER!");
            }
        }
    
        @Override
        public void endContact(Contact contact)
        {
    
        }
    
        @Override
        public void preSolve(Contact contact, Manifold oldManifold)
        {
    
        }
    
        @Override
        public void postSolve(Contact contact, ContactImpulse impulse)
        {
    
        }
    };
    return contactListener;
    

    }

    在这里您可以找到更多信息: http://www.matim-dev.com/handling-collisions-between-bodies.html

    【讨论】:

    • 你到底尝试了什么?
    • 这就是我所做的......创建了一个方法'createContactListener()'并在load()中我做了world.setContactListener(createContactListener())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2015-03-27
    • 2015-03-07
    • 2019-07-16
    相关资源
    最近更新 更多