【问题标题】:Best practice to use Sprites in a game using AndEngine GLES2在使用 AndEngine GLES2 的游戏中使用 Sprites 的最佳实践
【发布时间】:2012-07-15 04:41:41
【问题描述】:

目前我正在对我的所有精灵进行静态引用,并在我的 SimpleBaseGameActivity 的 OnCreateResource 方法中加载和初始化它们,但是现在我必须在精灵上覆盖 onAreaTouched 侦听器以及在初始化精灵时我可以覆盖它的方式。但我有一个静态方法为每个精灵创建图集和纹理区域。我在我的场景类中使用这些精灵,我想在那里覆盖 onAreaTouched。我可以在我的场景中为那个特定的精灵注册TouchArea,这样就可以完成但我想以某种方式覆盖 OnAreaTouched,以便可以完成代码的可重用性。 这是我目前创建和加载精灵的方式。

defualtCageSprite = createAndLoadSimpleSprite("bg.png", this, 450, 444);

这是我的方法 createAndLoadSimpleSprite。

public static Sprite createAndLoadSimpleSprite(String name,
        SimpleBaseGameActivity activity, int width, int height) {

    BitmapTextureAtlas atlasForBGSprite = new BitmapTextureAtlas(
            activity.getTextureManager(), width, height);
    TextureRegion backgroundSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory
            .createFromAsset(atlasForBGSprite, activity, name, 0, 0);
    Sprite sprite = new Sprite(0, 0, backgroundSpriteTextureRegion,
            activity.getVertexBufferObjectManager());
    activity.getTextureManager().loadTexture(atlasForBGSprite);

    return sprite;
}

现在如何在不丢失代码可重用性的情况下覆盖某些精灵的 onAreaTouched。

【问题讨论】:

    标签: java android opengl-es-2.0 andengine code-reuse


    【解决方案1】:

    有什么理由需要在运行时加载纹理吗?通常的方法是在加载应用程序时将所需的纹理全部加载到单个图集中,以便您以后可以快速使用它们。

    至于代码的可重用性,Todilo 关于枚举的想法似乎正是您所需要的。例如,假设你有两种物体——当你触摸它们时消失的物体和当你触摸它们时飞起来的物体。您枚举这两个类别并将一段代码放入触摸事件处理代码中,以检查对象是否应该消失或飞起来。

    如果您在运行应用程序之前不知道对象在触摸时应该做什么,有一种更动态的方法可以实现相同的结果。只需在运行时创建两个列表,然后根据对象在触摸时应该做什么,将对该对象的引用放在其中一个列表中。然后在触摸事件处理中做这样的事情:

    if (disappearList.contains(touchedObject)) {
        disappear(object)
    }
    if (flyUpList.contains(touchedObject)) {
        flyUp(object)
    }
    

    太糟糕了,AndEngine 不允许用户在精灵上设置监听器,这会让事情变得更容易一些。

    编辑: 增加了 BlackPawnTextureBuilder 的使用说明: 你的 Atlas 必须是 BuildableBitmapTextureAtlas 类型,然后你像这样添加所有纹理

    BitmapTextureAtlasTextureRegionFactory.createFromAsset(buildableAtlas, this, "image.png"));
    

    然后

    try {
        this.buildableAtlas.build(new BlackPawnTextureBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(1));
    } catch (final TextureAtlasSourcePackingException e) {
        Debug.e(e);
    }
    

    我不知道这是否适用于动画精灵,你必须尝试一下。 此外,没有覆盖 onTouch,您必须在 onAreaTouched 方法中执行此操作。这种情况的一个例子是

    if (pSceneMotionEvent.getAction() == MotionEvent.ACTION_DOWN && disappearList.contains(pTouchArea)) {disappear();}
    

    【讨论】:

    • 如果我将所有需要的纹理加载到单个图集,图集大小应该是多少?使用单个图集有什么好处,顺便说一下,运行时是什么意思,我在我的引擎的 createResources 上初始化所有精灵,然后在我的应用程序中使用它们。
    • 而且我只是不必在onTouch上为精灵设置动画,我必须根据不同的精灵调用我的模型的不同方法。
    • 图集大小取决于你使用的图片大小,比如我需要1024x512。好处是更小的内存消耗和更快的渲染。运行时是指应用程序运行的时间。您可以使用 BlackPawnTextureBuilder 将纹理放置到图集上,这样您就不必手动执行此操作。使用我的方法,您可以做任何您想做的事情,它不受动画精灵的限制。
    • 您能否给出一个代码示例,说明使用 BlackPawnTextureBuilder 加载至少 3 个精灵和 2 个动画精灵,它们都覆盖了 onTouch。非常感谢。
    • 我将编辑答案,不能将代码放入 cmets,因为它不会被格式化。
    【解决方案2】:

    你确定你不想要更多的功能而不是覆盖 ontouch 吗?为那些需要覆盖 onarea 和所有其他需求的 sprite 创建一个继承类怎么样。

    【讨论】:

    • 我不能为每个精灵设置一个单独的类。我需要对每个精灵的 onTouch 事件进行不同的实现。
    • 那么我想不出一个不会让实现变得混乱的好方法。这取决于实现,但假设你有一个类型的枚举,那么也许 onareatouch 可以由它来确定。不幸的是,所有其他解决方案(例如使用命令模式的某些变体来将方法作为参数传递)似乎有点矫枉过正。我明白你在做什么,但不幸的是,我没有解决办法。
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多