代码之家  ›  专栏  ›  技术社区  ›  WillDonohoe

盒2d闪光,摧毁尸体

  •  0
  • WillDonohoe  · 技术社区  · 14 年前

    这是我一直想解决的一个问题,尽管我一直找不到解决的方法。我想我可能错过了什么,但我似乎找不到什么。

    我试图从B2World中销毁实体,我在各种教程中看到过,当它们在box2d中使用debug draw销毁对象时,形状也会被销毁。出于某种原因,当我这样做时:

    world.DestroyBody(_body) 好像什么都没做。形状保留在屏幕上。

    以前有人遇到过这个问题吗?这让我很担心,因为在玩了一段时间之后,我想要销毁的所有对象都会留在屏幕上,并且仍然会记录碰撞,这确实会使游戏延迟。

    任何帮助都将不胜感激,

    谢谢,
    威尔

    编辑:(解决)谢谢各位,这很有道理。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Mattias    14 年前

    我在一些项目中也遇到过这个问题。我认为当你试图移除一个被box2d引擎“使用”的实体时,就会发生这种情况。我通过将要销毁的实体添加到列表中,然后在下一个渲染之前销毁它们来解决这个问题。

    // add body to list if it should be removed
    if(shouldRemoveBody)
    {
        _removeList.push(bodyToRemove);
    }
    
    // start next render with a check
    if(_removeList.length > 0)
    {
        // remove all bodies in list
    }
    
        2
  •  3
  •   Ken D    14 年前

    为了补充马蒂亚斯所说的话,我做了和他一样的事情,把物体推到移动目录中。

    对于场景中的每个图形精灵,我都有一个actor类,下面是一些代码:

    public class Actor
    {
        protected var m_body:b2Body;
        protected var m_sprite:DisplayObject;
    
        public function Actor(body:b2Body, sprite:DisplayObject)
        {
            this.m_body = body;
            this.m_sprite = sprite;
        }
    
        public function destroy():void
        {
            // remove sprite
            m_sprite.parent.removeChild(m_sprite);
    
            // remove physical body
            GlobalVars.world.DestroyBody(m_body);
        }
    }
    

    每当我想销毁一个对象,我就调用演员的销毁方法。

    注意,这个类的字段是受保护的,所以我们可以由子参与者扩展它。

    这样,工作就顺利了。