2014-09-30 66 views
1

我試圖設置來自andengine Gles2的TMXmap示例中所有仙人掌上仙人掌屬性項目的碰撞檢測。我嘗試了各種方法 - 任何人都可以給我一個有效的方法嗎?andengine gles2中的碰撞檢測

原始代碼 Tmxmaps andengine

一個建議解決方案: collision detection

另一種建議的解決方案: from andengine.org

我已經試過:

if(pTMXTileProperties.containsTMXProperty("cactus", "true")) { 
    final Rectangle rect = new Rectangle(pTMXTile.getTileX()+10, pTMXTile.getTileY(),14, 14); 
    final FixtureDef boxFixtureDef = PhysicsFactory.createFixtureDef(0, 0, 1f); 
    PhysicsFactory.createBoxBody(mPhysicsWorld, rect, BodyType.StaticBody, boxFixtureDef); 
    rect.setVisible(false); 
    mScene.attachChild(rect); 
} 

這是AndEngine: Handling collisions with TMX Objects

但我得到這個錯誤:

Physicsfactory not found 

回答

1

我正在使用TMX示例,您有作爲我的遊戲的基礎。

這是代碼衝突的主要塊:

//定義塊行爲

mPathFinderMap = new IPathFinderMap<TMXLayer>(){ 

      private boolean mCollide; 

      @Override 
      public boolean isBlocked(final int pX, final int pY, final TMXLayer pTMXLayer) { 
       /* 
       * This is where collisions happen and are detected 
       */ 
       mCollide = false; 
       //Null check. Used since not all tiles have properties 
       if(pTMXLayer.getTMXTile(pX, pY).getTMXTileProperties(mTiledMap) != null){ 
        //Get tiles with collision property 
        if(pTMXLayer.getTMXTile(pX, pY).getTMXTileProperties(mTiledMap).containsTMXProperty("COLLISION", "true")) 
         mCollide = true;           
       } 

       if(mTMXmapLoader.getCollideTiles().contains(pTMXLayer.getTMXTile(pX, pY))) 
        mCollide = true; 

       return mCollide; 
      } 

    }; 

/* 
* This method moves the sprite to the designated location 
*/ 
public void walkTo(TMXTile pFinalPosition) { 
    if(mHasFinishedPath){ 
     mHasFinishedPath = false;//This prevents overlapping paths when the user double clicks. Used to prevent stutter 
     //Player coordinates 
     final float[] lPlayerCordinates = mPlayerSprite.convertLocalToSceneCoordinates(mPlayerSprite.getWidth()/2, mPlayerSprite.getHeight()/2); 
     // Get the tile the center of the player are currently waking on. 
     TMXTile lPlayerPosition = SceneManager.mWorldScene.getTouchLayer().getTMXTileAt(lPlayerCordinates[Constants.VERTEX_INDEX_X], lPlayerCordinates[Constants.VERTEX_INDEX_Y]); 
     mFinalPosition = pFinalPosition; 

     // Sets the A* path from the player location to the touched location. 
     if(mPathFinderMap.isBlocked(pFinalPosition.getTileColumn(), pFinalPosition.getTileRow(), SceneManager.mWorldScene.getTouchLayer())){  
      pFinalPosition = getNextTile(lPlayerPosition, pFinalPosition); 
     } 

     // These are the parameters used to determine the 
     int lFromCol = lPlayerPosition.getTileColumn(); int lFromRow = lPlayerPosition.getTileRow(); 
     int lToCol = pFinalPosition.getTileColumn(); int lToRow = pFinalPosition.getTileRow(); 
     boolean lAllowDiagonal = false; 
     // Find the path. This needs to be refreshed 
     AStarPath = mAStarPathFinder.findPath(MAX_SEARCH_DEPTH, mPathFinderMap, 0, 0, mTiledMap.getTileColumns() - 1, mTiledMap.getTileRows() - 1, SceneManager.mWorldScene.getTouchLayer(), 
       lFromCol, lFromRow, lToCol, lToRow, lAllowDiagonal, mHeuristic, mCostCallback); 

     //Log.i("AstarPath", "AStarPath " + AStarPath); 
     //Only loads the path if the AStarPath is not null 
     Path lPlayerPath = loadPathFound(); 
     //Log.i("AstarPath", "lPlayerPath " + lPlayerPath); 
     if(lPlayerPath != null) 
      moveSprite(lPlayerPath);//Moves the sprite along the path 
     else 
      mHasFinishedPath = true;//If the path is null the player has not moved. Set the flag to true allows input to effect the sprite 
    }else{ 
     //Update parameters 
     mFinalPosition = pFinalPosition; 
     mWaypointIndex = 0; 
    } 
} 

/* 
* Updates the path 
*/ 
public void updatePath(TMXTile pFinalPosition) {  
    //Player coordinates 
    final float[] lPlayerCordinates = mPlayerSprite.convertLocalToSceneCoordinates(mPlayerSprite.getWidth()/2, mPlayerSprite.getHeight()/2); 
    // Get the tile the feet of the player are currently waking on. 
    TMXTile lPlayerPosition = SceneManager.mWorldScene.getTouchLayer().getTMXTileAt(lPlayerCordinates[Constants.VERTEX_INDEX_X], lPlayerCordinates[Constants.VERTEX_INDEX_Y]); 

    // Sets the A* path from the player location to the touched location. 
    if(mPathFinderMap.isBlocked(pFinalPosition.getTileColumn(), pFinalPosition.getTileRow(), SceneManager.mWorldScene.getTouchLayer())){  
     pFinalPosition = getNextTile(lPlayerPosition, pFinalPosition); 
    } 

    // Determine the tile locations 
    int FromCol = lPlayerPosition.getTileColumn(); 
    int FromRow = lPlayerPosition.getTileRow(); 
    int ToCol = pFinalPosition.getTileColumn(); 
    int ToRow = pFinalPosition.getTileRow(); 
    // Find the path. This needs to be refreshed 
    AStarPath = mAStarPathFinder.findPath(MAX_SEARCH_DEPTH, mPathFinderMap, 0, 0, mTiledMap.getTileColumns()-1, mTiledMap.getTileRows()-1, SceneManager.mWorldScene.getTouchLayer(), 
      FromCol, FromRow, ToCol, ToRow, false, mHeuristic, mCostCallback); 

    //Loads the path with the astar specifications 
    Path lPlayerPath = loadPathFound(); 
    //Moves the sprite along the path 
    if(lPlayerPath != null){ 
     moveSprite(lPlayerPath); 
    }else{ 
     //If the path is still null after the path manipulation then the path is finished 
     mHasFinishedPath = true; 
     mWaypointIndex = 0; 
     //mPlayerSprite.stopAnimation(); 
     //AStarPath = null; 
    } 
} 

的TMXmapLoader沒有休息:

//Get the collision, ext, and changing tiles from the object sets on the map 
    mCollideTiles = this.getObjectGroupPropertyTiles("COLLIDE", TMXGroupObjects); 
    mExitTiles = this.getObjectPropertyTiles("EXIT", mTMXObjects); 
    mChangingTiles = this.getObjectGroupPropertyTiles("CHANGE", TMXGroupObjects); 
... 
public ArrayList<TMXTile> getCollideTiles(){ 
    return mCollideTiles;  
} 
... 
public ArrayList<TMXTile> getObjectGroupPropertyTiles(String pName, final int pLayer, ArrayList<TMXObjectGroup> pTMXObjectGroups){ 
    ArrayList<TMXTile> ObjectTile = new ArrayList<TMXTile>(); 
    for (final TMXObjectGroup pObjectGroups : pTMXObjectGroups) { 
     // Iterates through the properties and assigns them to the new variable 
     for (final TMXObjectGroupProperty pGroupProperties : pObjectGroups.getTMXObjectGroupProperties()) { 
      //Sees if any of the elements have this condition 
      if (pGroupProperties.getName().contains(pName)) { 
       for (final TMXObject pObjectTiles : pObjectGroups.getTMXObjects()) { 
        int ObjectX = pObjectTiles.getX(); 
        int ObjectY = pObjectTiles.getY(); 
        // Gets the number of rows and columns in the object 
        int ObjectRows = pObjectTiles.getHeight()/WorldActivity.TILE_HEIGHT; 
        int ObjectColumns = pObjectTiles.getWidth()/WorldActivity.TILE_WIDTH; 

        for (int TileRow = 0; TileRow < ObjectRows; TileRow++) { 
         for (int TileColumn = 0; TileColumn < ObjectColumns; TileColumn++) { 
          float lObjectTileX = ObjectX + TileColumn * WorldActivity.TILE_WIDTH; 
          float lObjectTileY = ObjectY + TileRow * WorldActivity.TILE_HEIGHT; 
          ObjectTile.add(mTMXTiledMap.getTMXLayers().get(pLayer).getTMXTileAt(lObjectTileX, lObjectTileY));      
         }        
        } 
       } 
      }   
     } 
    } 
    return ObjectTile; 
} 
+0

嘿,你基本上是做一個特殊瓷磚的座標數組,並在他們創建矩形對象,以處理碰撞? – 2014-10-03 04:55:00

+0

種。是的,特殊瓷磚的座標數組。矩形?沒有。在這個代碼中實際上沒有box2d物理。您可以使用isBlocked()來確定目標圖塊是否爲碰撞對象。但是一旦建立起來,你就可以在Tiled中創建一個碰撞層,並且代碼將在玩家四處走動時處理這些瓦片的碰撞。 – 2014-10-03 05:08:33

+0

你有這樣一個工作的例子,我可以下載/結帳 – 2014-10-03 14:08:15

0

我不熟悉Android的發展,但這個錯誤似乎表明PhysicsFactory尚未導入。也許嘗試添加像這樣的導入語句到您的文件的頂部?

import org.anddev.andengine.extension.physics.box2d.PhysicsFactory; 
+0

當我將測試這一點家 – 2014-09-30 19:05:18