делаю небольшой движок для своей игры(C#+ TAO Framework), и теперь дошло, что игровой цикл сделан не верно=(( он обрабатывает только объекты созданные изначально... Теперь нужно как нить заставить объекты созданные в ходе выполнения обрабатывать код с каждым тиком... Есть мысля заносить все созданные объекты в массив(нужно разобраться как динамически-расширяемый массив делать) и обрабатывать его, но мне кажется это будет сильно грузить систему... есть ли способ сделать это по другому?? если будет приложен код, то буду благодарен в двойне... Более мощный компьютер глючит быстрее и точнее.
Сообщение отредактировал BrightSpot - Пятница, 05 Июля 2013, 14:31
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1 { // Класс, на основе которого наследуем объекты abstract public class Object { virtual public bool Start() { return true; }
virtual public bool Update() { return true; }
virtual public void OnDestroy() { } }
public class ObjectList { private List<Object> list; private bool run;
public ObjectList() { list = new List<Object>(); run = true; }
public void AddObject(Object obj) { list.Add(obj); if (!obj.Start()) run = false; }
public bool Frame() { if (run) { foreach (Object obj in list) if (!obj.Update()) run = false; } else { foreach (Object obj in list) obj.OnDestroy(); return false; }
return true; } }
// Теперь делаем наследника Object. Например, класс Player или Enemy - все, что угодно. // и реализуем абстрактные методы public class Player : Object { override public bool Start() { Console.WriteLine("Я - игрок!"); return true; } // Можем не реализовывать методы апдейта и дестроя }
public class Enemy : Object { override public bool Start() { Console.WriteLine("Я - враг! Уруру!"); return true; }
override public bool Update() { // Игра заканчивается, когда вводим символ b if (Console.Read() == 'b') return false; return true; }
override public void OnDestroy() { Console.WriteLine("Я умер."); } }
class Program { static ObjectList objList = new ObjectList(); static bool change = true;
static void Game() { if (change) { objList.AddObject(new Player()); // Добавляем объект игрока objList.AddObject(new Enemy()); // И объекты врага objList.AddObject(new Enemy()); change = false; } }
static void Main(string[] args) { while (true) if (objList.Frame()) Game(); else break; } } }
Сам писал)
Добавлено (05.07.2013, 17:41) --------------------------------------------- Вкратце - создается класс списка объектов и сам абстрактный класс объектов, от которого наследуем классы игрока, врагов, NPC, etc., куда прописываем реализацию функций Start (выполняется при создании объекта), Update (выполняется всегда, пока какой-либо объект не вернул false в Start или Update), OnDestroy (выполняется по окончании игры).
Пока все хорошо и ни один объект не вернул false в апдейте или старте, то выполняется функция Game(), там все основное действие (добавление объектов, события всякие, етц.)
Добавлено (05.07.2013, 17:42) --------------------------------------------- И систему это не грузит ни разу, все так и делают список объектов.
Сообщение отредактировал Izaron - Пятница, 05 Июля 2013, 17:36