繁体   English   中英

TMX Tiled Andengine Android-致命意外-

[英]TMX Tiled Andengine Android - FATAL EXCEPTION -

刚开始使用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:未找到属性“宽度”的值

我的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)

编辑14/4/29

因此,我与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ørnLindeijer
  • IRC-[15:02] ==频道:#tiled
  • IRC-[15:02] ==服务器:asimov.freenode.net [美国TX]
  • IRC-[15:02] ==帐户:bjorn
  • IRC-[15:02] == WHOIS结束
  • 我-哦,天哪,你是铺瓷砖的人吗?

哈哈,真有趣。 但是现在我有更多的问题了! 到底是什么?

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

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

跟踪andengine SAXUtils.java:

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

pAttributes是“属性”类型:

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

返回:作为字符串的属性值;如果该属性不在列表中,则返回null。

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

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

我一直在AndEngine论坛上获得支持。 特别感谢Therdiday为我的每一个步骤提供帮助,并感谢bjorn抽出宝贵的时间向我提供有价值的指导。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM