发动机gles中的碰撞检测2

时间:2014-09-30 16:16:59

标签: java android andengine

我正在尝试在andengine Gles2的TMXmap示例中的所有仙人掌上的cactus-property项目上设置碰撞检测。我尝试了各种方法 - 任何人都可以给我一个有效的方法吗?

原始代码 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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我不熟悉Android开发,但错误似乎表明PhysicsFactory尚未导入。也许尝试将这样的import语句添加到文件的顶部?

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