libgdx等距指向网格并检查阻止的瓷砖碰撞

时间:2014-02-22 12:01:33

标签: java android libgdx isometric

基本上我有一张等距地图,我的播放器总是在屏幕中间固定并居中。为了检查碰撞,我首先将点转换为地图坐标,然后使用这些坐标来检查平铺本身(取决于玩家移动的方式)是否具有包含单词“已阻止”的属性。如果是,则停止移动(返回oldposY和oldposX) 嗯,它有效。我的播放器停在不包含“已屏蔽”的磁贴上 每次播放器在此视频中停止时代码都会检测到他是否触及了标有“已屏蔽”属性的磁贴,但这是错误的。

以下是展示行动中问题的视频: http://youtu.be/FG12KGw_eg4

我正在屏幕的左上角打印我的x,y坐标,即使我只是朝一个方向行驶,它也会显示我的x和y增加或减少。因此,例如,如果我只在我的屏幕上向右走,那么当您认为只有X应该增加时,x和y都会增加。对于行进,向上,向右,向左,向左等任何方向都是如此。我不知道这是否有帮助,但我认为这意味着MapUtils.toIsometricGridPoint函数无法正常工作。  知道我的角色扮演者总是固定在屏幕的中心会不会简化这一点?

使用代码。这是我的方法MapUtils.toIsometricGridPoint

/** converts point to its coordinates on an isometric grid
    *  @param point the point to convert
    *  @param cellWidth the width of the grid cells
    *  @param cellHeight the height of the grid cells
    *  @return the given point converted to its coordinates on an isometric grid */

/** @see #toIsometricGridPoint(Vector2, float, float) */
   public static Vector3 toIsometricGridPoint(Vector3 point, float cellWidth, float cellHeight) {
      Vector2 vec2 = toIsometricGridPoint(point.x, point.y, cellWidth, cellHeight);
      point.x = vec2.x;
      point.y = vec2.y;
      return point;
   }

以下是我在Player类中实现它的方法,以使用toIsometricGridPoint代码查找标记为已阻止的切片:

    private boolean isCellBlocked(float x, float y) {
    Vector3 touch = new Vector3(x, y, 0);
    Play.camera.unproject(touch); //the touch variable has nothing to do with touch atm, it's just what it's called.
    MapUtils.toIsometricGridPoint(touch, collisionLayer.getTileWidth(), collisionLayer.getTileHeight()); //collisionlayer is a layer on my map obviously
    Cell cell = collisionLayer.getCell((int) touch.x, (int) touch.y);
    return cell != null && cell.getTile() != null && cell.getTile().getProperties().containsKey("blocked"); //a string Ive marked some tiles properties with in my tiled map editor
    }

最后用于检查然后对碰撞作出反应的代码(取决于行进的方向):

public boolean collidesRight() {
        for(float step = 0; step < getHeight(); step += collisionLayer.getTileHeight() / 2)
                if(isCellBlocked(getX() + getWidth(), getY() + step)){
                   Gdx.app.log("Found Blocked Tile", "Yes");
                   return true;
                }

             return false;

它检测到奇怪地方的碰撞,但它检测到标有我的字符串“阻塞”的瓷砖,但是它正在检测这些瓷砖并将播放器停在错误的位置并且它无法正常工作。这几乎就好像它以某种方式将其瓷砖检测从视觉上的地图上移开了。

0 个答案:

没有答案