如何从 Slick2D 中为游戏创建的 Sprite 对象的 ArrayList 中的一个特定精灵调用更新方法?

How to call update method on one particular sprite from an ArrayList of Sprite objects created in Slick2D for a game?

我正在使用 Slick2D 制作一个包含大量精灵的简单游戏。有一个玩家精灵会推动地图周围的其他物体精灵。

我使用 ArrayList 来存储创建的所有精灵类型,但是当我使用播放器推送特定类型的精灵(例如木块)时,该地图中出现的所有该特定精灵类型都会出现也更新了。我如何指定更新一个特定的木块而不是更新游戏中加载的所有木块?

数组列表:

private ArrayList<Sprite> sprites;

创建所有精灵并将它们存储在 ArrayList 中:

public static ArrayList<Sprite> loadSprites(String filename) {

    ArrayList<Sprite> list = new ArrayList<>();

    /*bunch of code to load the sprite*/

    list.add(World.createSprite(name, x, y));

    return list;
}

这里的 types 是一个二维数组,我根据地图坐标存储精灵的所有名称,我从 csv 文件中获取这些名称。

public static Sprite createSprite(String name, float x, float y) {
    switch (name) {
        case "player":
            return new Player(x, y, "player");
        case "wood":
            return new Wall(x, y, "wood");
        case "tile":
            return new Floor(x, y, "tile");
        case "wall":
            return new Stone(x, y, "wall");
        case "metal":
            return new Target(x, y, "metal");
    }
    return null;
}

提前致谢。 :)

您需要做的是识别玩家推动的对象。假设您的列表中有三个精灵,都是木材类型。从你在问题中写的内容来看,如果玩家开始推动,显然所有精灵也会更新,因为:

  • 您的程序无法确定应该推送哪个精灵。
  • 您的程序知道应该推送什么 sprite,但无法确定要在视觉上更新什么 sprite(很难用您提供的代码判断)

所以您应该做的是确保仅对玩家正在与之交互的 object/sprite 执行推送操作。你需要有约束来检查这个交互这个约束可能是按下一个按钮或与那个特定的精灵/对象相交。因此,您可以执行以下操作:

  1. 遍历您的数组列表并检查 object/sprite 您的播放器与哪个相交。
  2. 如果与列表中的某个对象有交集,您可以确切地知道那是什么对象,并且可以对该对象调用更新、推送或任何其他方法。
  3. 如果您有不止一个可能的更新对象,您需要指定您的搜索,例如您只能与您的玩家正在查看的对象/精灵互动。
  4. 调用该特定对象所需的方法(例如 push())。

您应该确定自己的游戏架构,这也可能是一个解决方案。我的意思是你应该确定你的游戏是如何内部设计的。一般来说,游戏中的每个游戏对象都应该有精灵,也许还有声音或某些其他属性。这样你就可以确保每个对象都有一个特定的精灵,这样你就不会在更新任何其他精灵时遇到麻烦,因为你只能通过这个特定的对象访问这个特定的精灵。所以也许你应该考虑不迭代精灵列表而是迭代你世界中的游戏对象列表(我不确定但也许精灵是你的游戏对象,但精灵只是游戏对象的图形表示.).检查与这些游戏对象中的每一个的交互,并在情况下执行特定操作。此类代码可能如下所示:

//inside the update method of your player
for(GameObject gameObject : world.getAllGameObjects()){             
            if(player.getHitbox().intersects(gameObject.hitbox())){
                gameObject.update() //push, update sprite, whatever
    }
}

检查交叉点只是一种解决方案,正如我已经说过的,您还可以检查按键的按下或特定距离。根据我的理解,对您来说重要的是识别单个对象并更新该单个对象。

很难说出你的问题到底是什么,因为我不了解你的整个代码,但如果你确保找到正确的对象进行交互,并确保只有这个对象以图形方式更新,这将有效.

除了本身的体系结构之外,问题可能出在这里:

 if (Loader.getSpriteOfType("wood", Player.getPlayerX() - 1, Player.getPlayerY())) {
        dir = DIR_LEFT;
    }

我不确定 Loader.getSpriteOfType(..) 做了什么,因为我不知道精灵或对象在您的游戏周期中是如何完全存储和处理的,但我假设它 returns 所有(不仅是特定的) 类型 "wood" 的精灵,因为它正在搜索 "wood" 并找到 "wood" 的所有对象,但是你只想要你的玩家正在与之交互的那个,所以也许你应该在那个 if 子句中更具体(不过只是一个假设,因为我不知道你的代码)。

希望这对您有所帮助,让您有所思考。