【问题标题】:TMX Tiled Andengine Android - FATAL EXCEPTION -TMX Tiled Andengine Android - 致命异常 -
【发布时间】:2014-06-11 11:21:42
【问题描述】:

刚刚开始使用 tmx 平铺地图文件作为我的 2d 平台游戏的地图。这是我目前的代码。

    private void loadLevel() {
    // TODO Auto-generated method stub
    try {
        TMXLoader tmxLoader = new TMXLoader(
                ResourceManager.getInstance().activity.getAssets(),
                engine.getTextureManager(),
                TextureOptions.BILINEAR_PREMULTIPLYALPHA, vbom);

        this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/testmap2.tmx");
    } catch (final TMXLoadException tmxle) {
        Debug.e(tmxle);
    }
    for (int i = 0; i < this.mTMXTiledMap.getTMXLayers().size(); i++) {
        TMXLayer layer = this.mTMXTiledMap.getTMXLayers().get(i);
        this.attachChild(layer);
    }
    for (final TMXObjectGroup group : this.mTMXTiledMap
            .getTMXObjectGroups()) {
        for (final TMXObject object : group.getTMXObjects()) {

            if (group.getName().equals("Unwalkable")) {
                Rectangle rect = new Rectangle(object.getX(),
                        object.getY(), object.getWidth(),
                        object.getHeight(), vbom);

                FixtureDef boxFixtureDef = PhysicsFactory.createFixtureDef(
                        0.0f, 0.0f, 1f, false,
                        CATEGORYBIT_WALL,
                        MASKBITS_WALL, (short) 0);

                PhysicsFactory.createBoxBody(physicsWorld, rect,
                        BodyType.StaticBody, boxFixtureDef);

                rect.setVisible(false);

                final PhysicsHandler physicsHandler = new PhysicsHandler(
                        rect);
                rect.registerUpdateHandler(physicsHandler);

                attachChild(rect);

            }

        }
    }
}

但它给了我这个错误 - 致命异常:UpdateThread 和 java.lang.IllegalArgumenetException:找不到属性值:'width'

这是我的 tmx 文件的问题吗?它是如何编码的或我是如何设置的?还是在编码端?谢谢你们,我真的很感谢你的帮助。以下是 LogCat 的其余部分,以备不时之需。

04-25 08:36:01.716: E/AndroidRuntime(13119): FATAL EXCEPTION: UpdateThread
04-25 08:36:01.716: E/AndroidRuntime(13119): java.lang.IllegalArgumentException: No value found for attribute: 'width'
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.util.SAXUtils.getAttributeOrThrow(SAXUtils.java:47)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.util.SAXUtils.getIntAttributeOrThrow(SAXUtils.java:86)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.extension.tmx.TMXObjectGroup.<init>(TMXObjectGroup.java:37)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.extension.tmx.TMXParser.startElement(TMXParser.java:161)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:143)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:513)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:474)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:321)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:279)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.extension.tmx.TMXLoader.load(TMXLoader.java:117)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.extension.tmx.TMXLoader.loadFromAsset(TMXLoader.java:102)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at com.meowcatfighter.goodygreen.scene.GameScene.loadLevel(GameScene.java:96)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at com.meowcatfighter.goodygreen.scene.GameScene.createScene(GameScene.java:85)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at com.meowcatfighter.goodygreen.scene.SceneManager.setGameScene(SceneManager.java:75)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at com.meowcatfighter.goodygreen.scene.MainMenuScene.onMenuItemClicked(MainMenuScene.java:66)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.entity.scene.menu.MenuScene.onAreaTouched(MenuScene.java:139)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.entity.scene.Scene.onAreaTouchEvent(Scene.java:413)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:357)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.entity.scene.CameraScene.onSceneTouchEvent(CameraScene.java:64)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.entity.scene.Scene.onChildSceneTouchEvent(Scene.java:420)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:338)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.engine.Engine.onTouchScene(Engine.java:452)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.engine.Engine.onTouchEvent(Engine.java:438)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.input.touch.controller.BaseTouchController$TouchEventRunnablePoolItem.run(BaseTouchController.java:102)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.util.adt.pool.RunnablePoolUpdateHandler.onHandlePoolItem(RunnablePoolUpdateHandler.java:54)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.util.adt.pool.RunnablePoolUpdateHandler.onHandlePoolItem(RunnablePoolUpdateHandler.java:1)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.util.adt.pool.PoolUpdateHandler.onUpdate(PoolUpdateHandler.java:88)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.input.touch.controller.BaseTouchController.onUpdate(BaseTouchController.java:62)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.engine.Engine.onUpdate(Engine.java:584)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.engine.Engine.onTickUpdate(Engine.java:548)
04-25 08:36:01.716: E/AndroidRuntime(13119):    at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)

(编辑 - 非常感谢 Matej Spili 编辑 LogCat!现在看起来更轻松了!:D)

编辑 4/29/14

所以,我与 Tiled 的制造者 bjorn 进行了交谈。

  • 我 - 我使用什么代码似乎并不重要,因为它总是那个错误
  • 我 - 当我查看一个示例 tmx 文件时,最后它看起来像....

    <objectgroup name="Unwalkable" width="400" height="21">
    
  • 我 - 但是当我查看我创建的 tmx 文件时,没有指定高度和宽度。如何指定对象层的高度/宽度?​​
  • bjorn - dpod:不再写出这些属性。
  • bjorn - dpod: AndEngine 应该被修复为不需要它们。它们基本上总是毫无意义的,因为对象组没有大小限制。
  • bjorn - 这些函数名称如“getTMXObjectGroupProperties”或“containsTMXProperty”绝对是疯狂的......
  • bjorn - 在 Tiled 中,该代码更像:“foreach (ObjectGroup *group, map->objectGroups()) { if (group->hasProperty("wall")) { ...
  • IRC - [15:02] == bjorn [~quassel@pdpc/supporter/active/bjorn]
  • IRC - [15:02] == 真实姓名:Thorbjørn Lindeijer
  • IRC - [15:02] == 频道:#tiled
  • IRC - [15:02] == 服务器:asimov.freenode.net [TX,美国]
  • IRC - [15:02] == 帐户:bjorn
  • IRC - [15:02] == WHOIS 结束
  • 我 - 天哪,你是制作瓷砖的人?!

这很有趣哈哈。但现在我有更多的问题! foreach 到底是什么?

【问题讨论】:

    标签: java android opengl-es-2.0 andengine tiled


    【解决方案1】:

    您的 .tmx 文件只是一个 xml,其中包含有关您创建的平铺地图的一些信息。

    似乎 SAX(XML 解析器的简单 API)正在尝试从中获取宽度属性,但无法找到它。

    跟进和引擎 SAXUtils.java:

    final String value = pAttributes.getValue("", pAttributeName);
    

    pAttributes 是 Attributes 类型:

    http://www.saxproject.org/apidoc/org/xml/sax/Attributes.html#getValue(java.lang.String, java.lang.String)

    返回:字符串形式的属性值,如果属性是 不在列表中。

    检查您的 .tmx 文件是否具有解析器所期望的宽度属性。

    (GoodyGreen- Woops。我编辑了错误的帖子。删除编辑并将其置于问题中。)

    【讨论】:

    • 感谢您的支持。我能够一起删除对象层,并使地图显示在 GLES2 的屏幕上。示例 TMX 文件看起来很有趣,并且具有对象层的宽度和高度属性,我认为您无法在 Tiled 应用程序本身中配置这些属性。虽然我没有设法在 GLES2 中创建墙壁对象,但我决定在锚中心做所有这些事情。虽然我遇到了许多不同的问题,但如果你愿意帮助我,我将不胜感激,并将保持更新。谢谢你的时间:)
    • 好的,所以我陷入了 GLES 2 中的位置。现在我遇到了与 GLES 2 中相同的错误。“找不到属性值:'width'”我'我正在寻找一个 andengine 锚中心示例,该示例展示了如何将 TMX 对象转换为可以在 andengine 中操作和使用的矩形和项目。我将废弃我在尝试实现矩形时使用的示例代码。如果您熟悉这种想法,非常感谢您的帮助(:
    • 所以我有幸与制作 Tiled 的 bjorn 交谈。这段对话太长了,所以我会把它作为对我原来帖子的编辑发布。
    【解决方案2】:

    我一直在 AndEngine 论坛上获得支持。特别感谢 Therdiday 帮助我的每一步,并感谢 bjorn 抽出时间在这里和那里给我宝贵的指导。

    解决方案是 TMX 扩展本身相当笨重。为了满足扩展的要求,您必须在编辑器中手动编辑 TMX 文件本身(如果需要,您可以在 eclipse 中执行此操作)并添加“height=x”和“width=x”值,其中 x 等于字面意思任何数字,适用于 TMX 文件中的每个对象层。

    我想不是每个 TMX 扩展都是这样的,但我使用的 RealMayo 需要它。 Therdiday 推荐了他的版本,因为它不需要那些空属性。此外,“顺便说一句,我的版本和默认锚中心版本之间的唯一区别是它对有界相机和折线支持的实现。” https://github.com/Therdiday/AndEngineTMXTiledMapExtension

    无论如何,如果有人有类似的问题,请给我发消息。我可以提供更多信息。

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 2014-12-21
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多