2

我正在制作一个游戏,我需要大约 50 个小虫子从各个方向进入场景。我希望他们在屏幕上随机移动,但似乎不可能。似乎如果我使用 MoveModifier,我必须为每个精灵提供一个结束位置。有什么方法可以在不使用移动修饰符的情况下做到这一点。我不熟悉 box 2d 扩展,但我看到很多人通过将精灵附加到物理实体来使用它来移动精灵。我是否需要这个扩展我不清楚。我还需要精灵来检测它们自己和其他动画精灵之间的碰撞检测。我怎么能做到这一点我不太清楚。请帮忙。以下是我的代码.. 看起来对吗

    private Runnable mStartMosq = new Runnable() {
    public void run() {
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        Log.d("Level1Activity", "width " + dm.widthPixels + " height " + dm.heightPixels);

        int i = nMosq++;

        Scene scene = Level1Activity.this.mEngine.getScene();
        float startX = gen.nextFloat() * CAMERA_WIDTH;
        float startY = gen.nextFloat() * (CAMERA_HEIGHT);   // - 50.0f);
        sprMosq[i] = new Sprite(startX, startY,
                mMosquitoTextureRegion,getVertexBufferObjectManager());
        body[i] = PhysicsFactory.createBoxBody(mPhysicsWorld, sprMosq[i], BodyType.DynamicBody, FIXTURE_DEF);

        sprMosq[i].registerEntityModifier(new SequenceEntityModifier(
                new AlphaModifier(5.0f, 0.0f, 1.0f), 
                new MoveModifier(60.0f, sprMosq[i].getX(), dm.widthPixels/2 , sprMosq[i].getY(), dm.heightPixels/2 , EaseBounceInOut.getInstance())));

        scene.getLastChild().attachChild(sprMosq[i]);
        mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprMosq[i], body[i], true, true));
        if (nMosq < 50) {
            mHandler.postDelayed(mStartMosq, 5000);
        }
    }
};
4

1 回答 1

2

老实说,对于这个问题,你不需要 box2d,除非你想在你的 bug 发生冲突时做一些花哨的事情。为此,您需要使用 IUpdateHandler。我会给你一个粗略的例子,说明我将如何解决你的问题:

    //Velocity modifier for the bugs. Play with this till you are happy with their speed
    private final velocity = 1.0f;

    sprMosq[i] = new Sprite(startX, startY,
    mMosquitoTextureRegion,getVertexBufferObjectManager());

    //Register update handlers
    sprMosq[i].registerUpdateHandler(new IUpdateHandler(){

        @Override
        public void onUpdate(float pSecondsElapsed) {
            //First check if this sprite collides with any other bug.
            //you can do this by creating a loop which checks every sprite
            //using sprite1.collidesWith(sprite2)

            if(collision){
                doCollisionAction(); //Whatever way you want to do it
            } else {
                float XVelocity;  //Velocity on the X axis
                float YVelocity;  //Velocity on the Y axis
                //Generate a different random number between -1 and 1
                //for both XVelocity and YVelocity. Done using Math.random I believe

                //Move the sprite
                sprMosq[i].setPosition(XVelocity*velocity*pSecondsElapsed,
                                    YVelocity*velocity*pSecondsElapsed); 

            }


        }

        @Override
        public void reset() {
        }

    });

这应该会导致每个 bug 在渲染游戏的每一帧时随机移动。如果您想添加更多错误并消耗处理能力,您可以降低随机性的频率,但您可能希望检查的次数少于该算法所做的每一帧。为此,您可能希望使用 TimerHandler 代替它在一定时间后自动重置。

于 2012-07-10T19:08:44.500 回答