【问题标题】:AndEngine - removing a particular Sprite & Its bodyAndEngine - 移除特定的 Sprite 及其主体
【发布时间】:2012-03-02 01:01:26
【问题描述】:

我想在单击项目时删除正文。如您所见,我将其设置为壁挂装置。

当点击该项目时,精灵被移除,现在我只想移除身体..

public void addSprites(Scene scene, int x,int y,int width,int height,String type,Body body){
    Sprite sprite = null;

    if(type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_WOOD)) {
        sprite = new Sprite(x, y, width, height, this.wood, this.getVertexBufferObjectManager()){
            @Override
            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
                mScene.detachChild(this);
                mPhysicsWorld.destroyBody(woodBody);
                return true;
            }

        };
           final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
          woodBody =  PhysicsFactory.createBoxBody(this.mPhysicsWorld, sprite, BodyType.StaticBody, wallFixtureDef);
             mScene.registerTouchArea(sprite);
        Log.e("TYPE", "Wood");
    }
    scene.attachChild(sprite);
            }

我想要做的是当单击该项目时,我想删除它所附加的精灵和身体。我的代码有效,但唯一的问题是它删除了所有的身体,我使用该方法将项目附加到一个级别,所以它总共有 3 个项目,当单击一个时,身体会从所有精灵中删除, 当它应该只是被点击的时候。

有人知道怎么做吗?

【问题讨论】:

    标签: java android andengine


    【解决方案1】:

    我不确定,但可能会发生这种情况,因为您对所有主体都使用相同的变量

    woodBody =  PhysicsFactory.createBoxBody(this.mPhysicsWorld, sprite, BodyType.StaticBody, wallFixtureDef);
    

    为了在 body 和 sprite 之间建立良好的连接,我建议你扩展 Sprite 并在你的类中声明 body 变量。例如我就是这样做的

    public class Ball extends Sprite{
    
    final FixtureDef ballFixtureDef = PhysicsFactory.createFixtureDef(1.0f, 0.0f, 0.0f, false, Main.CATEGORYBIT_BALL, Main.MASKBITS_BALL, (short)0);
    
    Body body;
    float velocityX, velocityY; 
    int type;   
    
    public Ball(float pX, float pY, TextureRegion pTextureRegion, PhysicsWorld pWorld, float velocityX, float velocityY, int type) 
    {
        super(pX, pY, pTextureRegion);
        this.type = type;
        this.velocityX = velocityX;
        this.velocityY = velocityY;
        body = PhysicsFactory.createCircleBody(pWorld, this, BodyType.DynamicBody, ballFixtureDef);
        body.setUserData(Ball.this);
        pWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true));
    }
    }
    

    以及用body销毁精灵的方法

    private void destroyBall(final Ball ball)
        {
            this.runOnUpdateThread(new Runnable(){
    
                @Override
                public void run() {
    
                    final Body body = ball.body;
                    mPhysicsWorld.unregisterPhysicsConnector(mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(ball));
                    mPhysicsWorld.destroyBody(body);
                    mScene.detachChild(ball);
                    ballsList.remove(ball);
                }});
    
        }
    

    你只是用这种方式创建对象

    Ball b = new Ball(float pX, float pY, TextureRegion pTextureRegion, PhysicsWorld pWorld, float velocityX, float velocityY, int type) 
    {
        @Override
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY)
        {
            destroyBall(this);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我不太确定,但我认为您需要先标记需要删除的项目或对象。然后当游戏更新时,它应该遍历所有对象并检查哪些对象被标记,然后删除它们。我也是新手,但这里什么都没有:

      因此,在 AndEngine 中执行此操作的一个好方法是首先像这样创建一个 IUpdateHandler:

      /**
      * This wil get called every frame and is placed inside of your
      * main game activity or where ever you want.
      **/
      public IUpdateHandler getCollisionUpdateHandler(){
      
          return new IUpdateHandler(){
      
               @Override
               public void onUpdate(float pSecondsElapsed) {
      
                   // loop through all of your sprites
                   for(int i=0; i<GameActivity.this.spriteList.length; i++) {
      
                        //if sprite is flagged for deletion, begin removal
                        if( GameActivity.this.spriteList.get(i).isDelete()){
                             // get the next sprite to delete
                             final mSprite Object = GameActivity.this.spriteList.get(i);
                             // can remove it from the list now
                             Game.this.spriteList.remove(i); 
      
                             final Scene scene = GameActivity.this.mEngine.getScene();
                             final Body body = GameActivity.this.mPhysicsWorld.getPhysicsConnectorManager().findBodyByShape(Object);
                             mPhysicsWorld.destroyBody(body);
                             //scene.getLayer(0).removeEntity(Object);
                             //scene.getLayer(1).removeEntity(Object);
                             scene.detachChild( Object );
                        }
                     }
                 }
            }
       }
      

      然后只需注册该更新处理程序。像这样:

      mScene.registerUpdateHandler( this.getCollisionUpdateHandler() );
      

      所以现在无论何时你想删除一个精灵(当它被按下时),你只需将你的方法更改为:

      @Override
      public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float  pTouchAreaLocalX, final float pTouchAreaLocalY) {
          MainActivity.spriteList.add( this );
          this.delete = true;
          return true;
      }
      

      希望对您有所帮助。这是我从哪里得到它的:(我只是试图让它适合你的问题:))

      www.andengine.org/forums/tutorials/box2d-collision-and-removal-t523.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多