2016-01-28 2 views
0

Несколько дней назад я начал работать над «простой» 2D-игрой. Я попытался сделать это с помощью системы сущностей. Я получил класс GameObject, который расширяет все другие объекты, такие как деревья, враги (шлам) и так далее. Все эти игровые объекты хранятся в arrayList, называемом «gameObjects». Затем я использую цикл for для итерации всех объектов из списка и вызова их основных функций, таких как update() и draw(). До сих пор все работает, хотя я не на 100% уверен, почему. Проблема в том, что по какой-то причине я не могу сделать то же самое с коллизиями.Java | Slick2D | Сущность системы/игровой системы столкновения системы

Я знаю, что эта тема обсуждалась много раз здесь, но даже после многих дней я не могу решить эту проблему. Может кто-то мне помочь, пожалуйста? Кроме того, я прошу прощения за мой английский.

класс

игры:

public class Game extends BasicGame 
{ 
    public Game() 
    { 
     super("Game"); 
    } 

    public void init(GameContainer gameContainer) throws SlickException 
    { 
     World.init(); 
    } 

    public void update(GameContainer gameContainer, int delta) throws SlickException 
    { 
     World.update(); 
    } 

    public void render(GameContainer gameContainer, Graphics g) throws SlickException 
    { 
     World.draw(g); 
    } 
} 

GameObject класс:

public abstract class GameObject 
{ 
    protected void update() 
    { 
    } 

    protected void draw() 
    { 
    } 
} 

Дерево Класс:

public class Tree extends GameObject 
{ 
    public float x, y; 
    private static Image tree; 

    public Tree(float x, float y) 
    { 
     this.x = x; 
     this.y = y; 
     tree = Resources.miscSheet.getSprite(2, 0); 
    } 

    public void draw() 
    { 
     tree.draw(x, y) 
    }   
} 

Слизь класс:

public class Slime extends GameObject 
{ 
    public static float x; 
    public static float y; 
    private static Animation slimeAnim; 

    public Slime(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
     // My own method for loading animation. 
     slimeAnim = Sprite.getAnimation(Resources.slimeSheet, 0, 0, 5, 300); 
    } 

    public void update() 
    { 
     // *Random movement here* 
    } 

    public void draw() 
    { 
     slimeAnim.draw(x, y); 
    } 
} 

мирового класса:

public class World 
{ 
    public static List<GameObject> gameObjects = new ArrayList<GameObject>(); 

    public static void init() 
    { 
     Tree tree = new Tree(0, 0); 
     Tree tree2 = new Tree(200, 200); 
     Slime slime = new Slime(80, 80); 
     gameObjects.add(tree); 
     gameObjects.add(tree2); 
     gameObjects.add(slime); 
    } 

    public static void update() 
    { 
     for (int i = 0; i < gameObjects.size(); i++) 
     { 
      GameObject o = gameObjects.get(i); 
      o.update(); 
     } 
    } 

    public static void draw(Graphics g) 
    { 
     g.setBackground(new Color(91, 219, 87)); 

     for (int i = 0; i < gameObjects.size(); i++) 
     { 
      GameObject o = gameObjects.get(i); 
      o.draw(); 
     } 
    } 
} 

Основной класс:

public class Main 
{ 
    public static AppGameContainer container; 

    public static void main(String[] args) throws SlickException 
    { 
     container = new AppGameContainer(new Game()); 
     container.setDisplayMode(1024, 600, false); 
     container.setShowFPS(false); 
     container.start(); 
    } 
} 

Я удалил все мои предыдущие попытки столкновения, и я пропустил некоторые другие ненужные вещи. Как теперь я могу, например, выполнить столкновения между деревьями и слизнями?

ответ

0

Что я обычно делаю, это наследование от Rectangle на моем верхнем объекте Class. Если ваш класс GameObject наследуется от Rectangle, в каждом случае вы получите метод intersects, который даст вам возможность легко обнаружить столкновение.

class GameObject extends Rectangle{} 

Проблема заключается в проведении теста между всеми вашими объектами. Это будет довольно тяжело, но все же возможно.

for (int i = 0; i < gameObjects.size(); i++) { 
    for (int j = i; j < gameObjects.size(); j++) { 
     if (gameObjects.get(i-1).intersects(gameObjects.get(j)) { 
      // I don't know what you want to do here   
     } 
    } 
} 

Таким образом, вы сравниваете объект A с объектом B только один раз.

+0

Да, это сработало отлично! Большое спасибо! :) – BlueHouse

Смежные вопросы