碰撞后从Tiled Map中删除对象

时间:2017-12-08 16:52:22

标签: java libgdx collision

大家好!

我正在使用Libgdx创建类似于Mario Bros的2D游戏。我在YouTube上观看了Mario Bros的教程。我把钻石放在Tiled地图中,让玩家收集这些钻石。我在碰撞中取得了成功。但是,我有两个问题: - 首先,我不能让所有的钻石在碰撞后消失(只有一颗钻石消失)。 - 其次,if(f2.getUserData()instanceof Treasure)不起作用。

    这是我的代码:

public TiledMapTileLayer.Cell getCell(){
    TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(8);
    return  layer.getCell((int) (body.getPosition().x * MainGame.PPM / 64),
            (int) (body.getPosition().y * MainGame.PPM / 64));

}

if(f1.getUserData() == "HARRY" && f2.getUserData() == "COINS"){
        System.out.println("coins");
        //if(f2.getUserData() instanceof Treasure){
            System.out.println("Works");
         treasure.getCell().setTile(null);
        //}

    }

我希望当玩家碰撞时,钻石会消失。

但结果是,如果我把(treasure.getCell()。setTile(null);)置于if语句中并不起作用。而且,如果我把它放在没有if语句的情况下,只有一颗钻石消失,而不是玩家碰撞的那颗钻石。我放在Tiled地图中的第一颗钻石消失了

1 个答案:

答案 0 :(得分:0)

关于事情的一对夫妇......

  1. 在Java ==中比较Strings 等对象时的引用(如果两者都引用相同的对象,则为true)。所以f2.getUserData() == "COINS"似乎应该是:"COINS".equals((String) f2.getUserData()),它会比较所讨论的String的实际字符序列(也是...... "COINS",以避免任何可能的NullPointerException {1}})。

  2. 根据您的代码,if(f2.getUserData() instanceof Treasure)正在将Treasure对象与String进行比较(除非Treasure扩展String或其他内容 - 我不熟悉您正在使用的库。

  3. 您是否设置了f2.getUserData()的值?如果是,请使用Treasure对象而不是String“COINS”实例。也许它有一个像Treasure coins = new Treasure("COINS")之类的构造函数。

    1. 此代码:treasure.getCell().setTile(null);引用一个对象(我假设是一个Treasure对象),未在示例代码中定义(即它可能在某处定义)上面的源代码与提供的示例代码相比)。这可能就是为什么只有一颗钻石消失了。我认为你的意思更像是这个(假设Treasure extends String或类似的东西......)

      if("HARRY".equals(f1.getUserData()) && "COINS".equals(f2.getUserData())){ System.out.println("coins"); if(f2.getUserData() instanceof Treasure){ System.out.println("Works"); ((Treasure)f2.getUserData()).getCell().setTile(null); } }

    2. 希望有帮助并且有意义!