2014-04-25 44 views
0

刚开始使用tmx平铺的地图文件作为我的2D平台游戏的地图。这是迄今为止的代码。TMX Tiled Andengine Android - FATAL EXCEPTION -

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) 

(编辑 - 大部分得益于马捷Spili用于编辑的logcat这是对现在的眼睛更容易:!d)

编辑14年4月29日

所以,所以我说话到Tiled的制造商比约恩。

  • 我 - 它只是似乎没有不管我用什么样的代码,但因为它总是错误
  • 我 - 当我看到的例子TMX文件中的一个,在最后它看起来像....

    <objectgroup name="Unwalkable" width="400" height="21"> 
    
  • 我 - 但是当我看出我创建的tmx文件时,没有高度和宽度的规范。你如何指定对象层的高度/宽度?
  • bjorn - dpod:这些属性不再写出来。
  • bjorn - dpod:AndEngine应该固定不需要它们。由于对象组没有大小限制,它们基本上总是毫无意义的。
  • 比约恩 - 像“getTMXObjectGroupProperties”或“containsTMXProperty”这些函数名是绝对疯了...
  • 比约恩 - 在瓷砖,该代码会更喜欢“的foreach(对象组*组,MAP-> objectGroups() ){if(group-> hasProperty(“wall”)){...
  • IRC - [15:02] == bjorn [〜quassel @ pdpc/supporter/active/bjorn]
  • IRC - [15 :02] ==真实姓名:托尔比约恩Lindeijer
  • IRC - [15:02] ==渠道:#tiled
  • IRC - [15:02] ==服务器:asimov.freenode.net [TX,USA]
  • IRC - [15:02] ==帐户:比约恩
  • IRC - [15:02] ==的WHOIS
  • 我结束 - 哦,我的天哪你是谁做瓷砖的家伙?

这很有趣哈哈。但现在我已经有更多的问题!究竟是什么?

回答

0

我一直在AndEngine论坛上得到支持。特别感谢Therdiday帮助我的每一步,并感谢Bjorn为我提供宝贵的时间指导。

解决方案是TMX扩展本身变得相当笨拙。为了满足扩展的要求,你必须在一个编辑器中手动编辑TMX文件本身(如果你愿意,你可以在eclipse中做到这一点),并添加一个“height = x”和“width = x”值,其中x等于字面意思任何数字,用于TMX文件中的每个对象层。

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

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

0

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

SAX(简单API for XML解析器)试图从中获取宽度属性,但它无法找到它。

正在关注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文件是否具有解析器期望的宽度属性。

(GoodyGreen- Woops。我编辑了错误的职位。卸下编辑并把它放在问题。)

+0

感谢您的支持。我能够一起移除物体层,并使地图显示在GLES2上的屏幕上。示例TMX文件看起来很有趣,并且具有对象层的宽度和高度属性,我认为您不能在Tiled应用程序本身中进行配置。虽然我没有设法在GLES2中创建墙体对象,但我决定在锚中心完成所有这些工作。尽管我遇到了很多不同的问题,但如果你愿意帮助我,我会很感激,并会保持更新。感谢您的时间:) – GoodyGreen

+0

好的,所以我陷入了我在GLES 2中的位置。现在我得到了我在GLES 2中收到的同样的错误。“没有找到属性的值:'width'”我是寻找一个andengine锚中心示例,展示如何将TMX对象转换为矩形和我可以在引擎中操作和使用的项目。我只会放弃我用来实现矩形的示例代码。如果你熟悉这种想法,那么你的帮助是非常感谢的( – GoodyGreen

+0

)所以我有幸与制作Tiled的bjorn交谈,谈话对此太长了,所以我会把它作为一个编辑发布给我原来的帖子。 – GoodyGreen

相关问题