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

问题描述:

我正在使用Slick2D与一些精灵进行一个简单的游戏。有一个玩家精灵会在地图周围推送其他物体精灵。如何从一个在Slick2D中为一个游戏创建的Sprite对象的ArrayList调用一个特定的Sprite的更新方法?

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

的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; 
} 

这里类型就是我根据存储精灵的所有名称的二维数组的地图坐标,我从一个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; 
} 

在此先感谢。 :)

+1

请分享您的代码到目前为止 – Mureinik

+0

与问题无关,但如果您尝试在Java中进行游戏开发,请尝试使用Libgdx :) Slick2D有点死了。 http://libgdx.badlogicgames.com/ – Sneh

+0

你可以发布Loader :: getSpriteOfType方法以及World :: createSprite – Sneh

你需要做的是识别玩家推动的物体。假设你的列表中有三个精灵都是木头类型的。从你在你的问题中写道好像如果玩家开始推显然所有精灵得到更新,以及因为无论:

  • 你的程序无法确定究竟应该是什么精灵被推动。
  • 你的程序就知道应该是什么精灵被推动,但无法确定是什么精灵更新视觉(很难与你提供的代码来告诉)

所以,你应该做的是,确保推动作用仅仅是对玩家正在与之交互的对象/精灵执行。你需要约束来检查这个交互,这个约束可能是推动一个按钮或者与那个特定的精灵/对象相交。所以你可以举例如下:

  1. 遍历你的数组列表并检查你的播放器正在与哪个对象/ sprite相交。
  2. 如果与列表中的某个对象有交集,那么您完全知道该是哪个对象,并且可以调用该对象上的更新,推送或任何其他方法。
  3. 如果您有多个可能的候选人进行更新,您需要指定您的搜索,例如,您只能与您的球员正在查看的对象/精灵进行交互。
  4. 调用该特定对象的所需方法(例如push())。

也可能是一个解决方案是你应该确定你的游戏架构。我的意思是你应该确定你的游戏是如何在内部设计的。通常,游戏中的每个游戏对象都应该有精灵,也许有声音或某些其他属性。通过这个你可以确保每个对象都有一个特定的精灵,所以你不会因为更新任何其他精灵而陷入困境,因为你只能通过这个特定的对象访问这个特定的精灵。所以也许你应该考虑不是迭代精灵列表,而是迭代你的世界中的一系列游戏对象(我不确定,但也许精灵是你的一个游戏对象,但精灵只是一个游戏对象的图形表示)。检查与每个这些gameobjects的交互,并在执行特定操作的情况下。这样的代码可能看起来像以下:

//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(..)不会,因为我不知道该怎么精灵或对象entirly存储和在你的游戏周期中处理,但我会假设它会返回所有(不仅是特定的)“木头”类型的精灵,因为它搜索“木头”并找到所有“木头”的对象,但只需要你的玩家正在与之交互的确切的一个,所以也许你应该在if-clause中更具体一些(只是一个假设,尽管我不知道你的代码)。

希望这可以帮助你,并给你一些想法。

+0

非常感谢!我想我知道我的问题在哪里! :)感谢帮助! – Kincaid33

+0

很高兴我可以帮助,不要犹豫,问你是否还有任何问题:) –