2014-04-25 45 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

相關問題