【问题标题】:Android (AndEngine): Sprite with body attached going up and downAndroid(AndEngine):附有身体的精灵上下移动
【发布时间】:2012-09-04 13:08:37
【问题描述】:

我试图让游戏中的敌人上下起伏;因为我使用的是带有 Sprite 的物理体,所以我不能使用实体修饰符,所以我决定每次它的 sprite 到达某个点时使用 .setLinearVelocity(float x, float y) 方法稍微推动一下身体在屏幕上。

只有一个身体效果很好,但我需要让其他敌人(相同的精灵,不同的身体)每 5 秒产生一次并做同样的事情,但我不知道如何跟踪它们......我的意思是,我不知道如何控制每个身体是否相互独立地到达 Y 位置...

例如,现在的代码是这样的:

private void add_Box_Face()
{
    float random_x = (float) (28 +  (int)(Math.random() * ((this.CAMERA_WIDTH - 28*2) + 1)));

    final Body rectangle_face_body;

    final Sprite rectangle_face = new Sprite(random_x, this.y, this.mRectangleFaceTextureRegion, this.getVertexBufferObjectManager());

    rectangle_face_body = PhysicsFactory.createBoxBody(this.m_PhysicsWorld, rectangle_face, BodyType.DynamicBody, this.BOX_FIXTURE_DEF);

    rectangle_face_body.setUserData("target");

            //I give the body a initial push
    rectangle_face_body.setLinearVelocity(0, -5);

            //I register an update handler to the sprite to control if it reaches a certain Y value
    rectangle_face.registerUpdateHandler(new IUpdateHandler() 
    {
        @Override
        public void onUpdate(float pSecondsElapsed) 
        {

               if (rectangle_face.getY() >= y-50)
               {
                       //Here I just use a flag so that later on below I can do the push
                 MyApp.this.setLinearVelocity = true;
               }
        }

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

    });

            //Here I register the physic connector and if the flag permits it, I push the body up
    this.m_PhysicsWorld.registerPhysicsConnector(new PhysicsConnector(rectangle_face, rectangle_face_body, true, false)
    {
        @Override
        public void onUpdate(float pSecondsElapsed)
        {
            super.onUpdate(pSecondsElapsed);

            if(MyApp.this.setLinearVelocity)
            {
                rectangle_face_body.setLinearVelocity(0, -3);
                MyApp.this.setLinearVelocity = false;
            }



        }
    });

    this.mscene.attachChild(rectangle_face);

}

使用这样的代码,第一个物体按计划执行,它上下移动,但一旦另一个物体弹出,它就会下降,另一个物体会上升,因为布尔值 setLinearVelocity 总是设置为 true,所以有一个不断向上的推动;当第三个身体进来时,第二个身体也会倒下,最后一个身体会上升

有了这段代码,我并没有期待太多......但我不知道我还能尝试什么......我该如何控制它?

提前致谢:)

编辑:在下面的 anwser 中添加了工作代码

【问题讨论】:

    标签: android andengine physics


    【解决方案1】:

    我建议您将敌人的代码与更新处理程序的代码分开。创建一个包含 Sprite 和 Body 的类 Enemy,将您的 Enemies 保存在一个数组中并覆盖您的 PhysicsWorld 的 onUpdate 方法,以便它通过 Enemies 数组并对所有敌人执行您想要的操作。

    这里的代码 sn-p 显示了一个非常简单的方法:

    mEngine.registerUpdateHandler(new IUpdateHandler() {
            @Override
            public void reset() {}
    
            @Override
            public void onUpdate(float pSecondsElapsed) {
                for (Enemy e : enemies) {
                    e.checkPositionAndBounce();
                }
            }
        });
    

    请注意,这可能不是一个好主意,因为此代码可能会在与物理引擎不同的线程上运行,这可能会导致各种问题。更好的方法是覆盖 PhysicsWorld 的 onUpdate 方法:

    @Override
    public void onUpdate(final float pSecondsElapsed) {
        super.onUpdate();
        for (Enemy e : enemies) {
            e.checkPositionAndBounce();
        }
    }
    

    如果您不确定第一个 sn-p 的含义,请查找“匿名内部类”。

    【讨论】:

    • 感谢您的回复和帮助!是的,我尝试使用数组并且它有效!就像你说的那样,我正在覆盖 PhyiscsWorld 的 onUpdate 方法,即使有十几个移动的物体(这几乎是我想要做的最糟糕的情况),它似乎也很顺利。我想发布代码现在的样子,以防有人想要做同样的事情经过,但由于我没有足够的声誉,我还不能回答我的问题,我不想添加它到原来的帖子,因为它会变得太长;再次感谢你的帮助! :)
    【解决方案2】:

    好的,这是最终的工作代码(我没有创建一个方法来检查敌人的位置或一个类,只是因为我现在只是在搞乱机制;我会在什么时候创建一个新项目我已经准备好开始了):

    this.m_PhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false)
    {
        @Override
        public void onUpdate(float pSecondsElapsed)
        {
            super.onUpdate(pSecondsElapsed);
    
            for(int i = 0; i <= MyApp.this.mSpriteCounter; i++)
            {
    
                if (rectangle_face[i].getY() >= y-50)
                {       
                    final PhysicsConnector spritePhysicsConnector = m_PhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(rectangle_face[i]); 
    
                    spritePhysicsConnector.getBody().setLinearVelocity(0, -3);      
                 }
            }
        };
    

    在这段代码中, rectangle_face[] 是一个 Sprite 数组;每个精灵都是这样创建的:

    private void add_Box_Face()
    {
    
        float random_x = (float) (28 +  (int)(Math.random() * ((this.CAMERA_WIDTH - 28*2) + 1)));
    
        final Body rectangle_face_body;
    
    
        rectangle_face[this.mSpriteCounter] = new Sprite(random_x, y, this.mRectangleFaceTextureRegion, this.getVertexBufferObjectManager());
    
    
        rectangle_face_body = PhysicsFactory.createBoxBody(this.m_PhysicsWorld, rectangle_face[this.mSpriteCounter], BodyType.DynamicBody, this.BOX_FIXTURE_DEF);
    
        rectangle_face_body.setUserData("target");
    
        rectangle_face_body.setLinearVelocity(0, -5);
    
    
        this.m_PhysicsWorld.registerPhysicsConnector(new PhysicsConnector(rectangle_face[this.mSpriteCounter], rectangle_face_body, true, false));
    
        this.mscene.attachChild(rectangle_face[this.mSpriteCounter]);
    
    }
    

    就是这样,再次感谢您的帮助:)

    【讨论】:

    • 不客气,感谢您回来并发布代码供他人使用。
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多