2010-04-12 3 views
3

Я делаю небольшую стратегическую игру, чтобы помочь мне научиться Java в интересном стиле. Дело в том, что я видел единицы как объекты, которые бы сами рисовали на карте игры (используя изображения и буферизацию) и реагировали бы на действия мыши с прикрепленными к ним слушателями.Java-классы в программировании игр?

Теперь, основываясь на некоторых учебниках, которые я читал относительно базового игрового программирования, все, кажется, нарисовано в методе Graphics моего класса Map. Если появляется новый блок, я просто обновляю метод Map.Graphics, это не так просто, как создание нового объекта Unit, который бы сам рисовал ... В этом случае я бы застрял с целым рядом методов Map вместо используя классы для рендеринга новых вещей.

Итак, мой вопрос в том, можно ли использовать классы для единиц рендеринга, объекты интерфейса и т. Д., Или мне придется создавать методы и просто делать какие-то структурные программирования вместо объектно-ориентированных? Я немного смущен, и я хотел бы иметь мысленный план того, как все будет организовано.

Спасибо!

ответ

1

Как сказал ск, вы могли бы сделать это с растяжимым интерфейсом, что-то вроде:

public interface GameElement { 
    public void draw(Graphics g); 
} 

public class Sprite implements GameElement{ 
    private Image image; 
    private int x; 
    private int y; 
    public void draw(Graphics g) { 
       g.drawImage(image,x,y,null); 
    } 
} 

public class GameLoop { 

     public void drawElements(final Graphics2D g, final List<GameElement> elements) { 
       for (final GameElement gameElement : elements) { 
         gameElement.draw(g); 
       } 
     } 


} 

, но, как вы сказали, что вы хотите сделать это с слушателем, может дать вам проблемы в будущем. Как уже указывал dash-tom-bang, все элементы отображаются в одном игровом цикле, после того как все они уже были обновлены. Если вы делаете это с помощью слушателя, и у вас есть игровой цикл или любой другой поток, изменяющий список единиц, вы можете получить одновременную модификацию доступа. Кроме того, таким образом вы будете рисовать все элементы в одной точке, что позволит избежать какого-то странного мерцания в вашей игре.

4

Похоже, что ваши объекты должны иметь общий интерфейс, чтобы все их можно было отбрасывать для рендеринга.

E.g. иметь общий список вашего типа интерфейса, заполнить его игровыми объектами, затем перечислить список и вызвать общий метод для выполнения рендеринга.


Это C# код, но он должен быть похож на Java

public interface IRenderable 
{ 
    void RenderMe(Graphics graphics) 
} 

List<IRenderable> myGameObjects; 

foreach (IRenderable myGameObject in myGameObjects) 
{ 
    myGameObject.RenderMe(myMap); 
} 

В то время как объекты удерживаются в списке они могут реагировать на события и обновлять их внутреннее состояние готовности к следующему визуализации цикла ,

1

В то время как «реальные» игровые проекты в разных формах, в конечном счете, у вас есть что-то вроде этого:

while True: 
    ProcessUserInput() 

    for o in objects: 
     o.Update() 

    for o in objects: 
     o.Render() 

Используйте любой механизм, который вы найдете дорогие для реализации любых и всех этих функций. :) Полиморфизм в порядке, поэтому вы можете свободно использовать это, если вам это нравится. Вероятно, «карта мира» должна быть первым элементом в списке, если только ваша система рендеринга недостаточно развита, чтобы обрабатывать чертеж вне порядка (в основном, сортировка глубины).

С вашего вопроса, возможно, что единицы принадлежат карте? В этом случае функция Map.Render будет перебирать все принадлежащие ему единицы, вызывая Render на каждом из них по очереди. Несмотря на это, это, наверное, самый чистый, если код для рисования единицы находится в классе для этого устройства.

Удачи вам!