[2D] - AzEngine
| |
Aikidos | Дата: Среда, 18 Января 2012, 22:42 | Сообщение # 21 |
постоянный участник
Сейчас нет на сайте
| Quote (Mkasss) Клас , удачи в разработке Спасибо.
Quote (TimKruz) "насколько проще использовать этот движок, чем OpenGL напрямую". Это вопрос? Я туго соображаю сегодня. Весь день почти его кодил.
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
yarickyarick | Дата: Четверг, 19 Января 2012, 01:08 | Сообщение # 22 |
Маленький лицемер
Сейчас нет на сайте
| Aikidos, Тоже писал что-то подобное на C# Сейчас время от времени использую сам=)
|
|
| |
pro100denver | Дата: Четверг, 19 Января 2012, 03:24 | Сообщение # 23 |
участник
Сейчас нет на сайте
| браво! Жаль конечно что нет LUA, ибо таким людям как геймдизайнеры LUA ооочень помогает.
Мой блог.DENVER
|
|
| |
Aikidos | Дата: Четверг, 19 Января 2012, 15:47 | Сообщение # 24 |
постоянный участник
Сейчас нет на сайте
| Quote (pro100denver) браво! Спасибо.
Как и обещал. Сегодня я расскажу пример скриптования объектов и использование альфа канала.
Задача: сделать объект, который постепенно становится прозрачным и когда он станет совсем прозрачным - мы завершаем игру.
Для начала мы откроем наш главный скрипт (пока он называется "main.as") и напишем следующий скрипт: Code void Init() { Game.SetClearColor(0, 0, 0); // Установим цвет очистки экрана на черный GameObject @object = ObjectManager.Create("AZ"); // Создаём объект с именем AZ object.LoadImage("az.png"); // Загружаем изображение для данного объекта object.SetPosition((Game.GetWindowWidth() / 2) - (object.GetImageWidth() / 2), (Game.GetWindowHeight() / 2) - (object.GetImageHeight() / 2)); // Устанавливаем объект в центр окна Script.AddScriptToObject("AZ", "object.as"); // Загружаем скрипт для нашего объекта }
void Update() { if (ObjectManager.Get("AZ") == null) Game.Exit(); // Проверяем наличие объекта. Если его не существует, то завершаем работу игры. }
Теперь напишем скрипт самого объекта: Code void Init() { }
void Update() { GameObject @object = ObjectManager.Get("AZ"); // Получаем наш объект из менеджера объектов if (object != null) { float alpha = object.GetImageAlpha(); // Узнаём текущее значение альфа канала (1.0 - полностью не прозрачен, 0 - полностью прозрачен) if (alpha > 0) object.SetImageAlpha(alpha - 0.01); // Если текущее значение больше нуля, то делаем слегка прозрачным else ObjectManager.Delete("AZ"); // Если объект стал полностью прозрачным, то удаляем его } }
Скрины, думаю, кидать особо нет смысла. Всё и так понятно, что произойдет. Вот вроде и всё. Тут видна работа объектов. Будет интересно выслушать ваше мнение по улучшению этого механизма. Кстати, перед мной встала задача сделать работу очередности прорисовки объектов. Друг предложил сделать как в GM'e (глубину). Что вы думаете по этому поводу?
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
Сообщение отредактировал Aikidos - Четверг, 19 Января 2012, 15:48 |
|
| |
Demeron | Дата: Четверг, 19 Января 2012, 16:14 | Сообщение # 25 |
User created in C++
Сейчас нет на сайте
| Quote (Aikidos) Друг предложил сделать как в GM'e (глубину). Что вы думаете по этому поводу? Берешь и в игре рисуешь сначала дальние объекты, а потом те что ближе, вот и всё. А глубина будет только тормозить. Хотя можно сделать выбор.
|
|
| |
Aikidos | Дата: Четверг, 19 Января 2012, 16:17 | Сообщение # 26 |
постоянный участник
Сейчас нет на сайте
| Quote (Demeron) Берешь и в игре рисуешь сначала дальние объекты, а потом те что ближе, вот и всё. А глубина будет только тормозить. Хотя можно сделать выбор. Сейчас они рисуются в порядке создания. Т.е. те, которые были созданы раньше рисуются первее.
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
zodiak | Дата: Четверг, 19 Января 2012, 16:35 | Сообщение # 27 |
постоянный участник
Сейчас нет на сайте
| Глубина, или слои нужны. Без вариантов. Зачем пользователю напрягаться еще и с порядком отрисовки. Назначил один слой для земли, второй для расительности и можно быть уверенным, что тайл земли никогда не будет поверх дерева. Quote (Demeron) А глубина будет только тормозить. Интересно, чему там тормозить. Ну придется перед выводом отсортировать все спрайты, что с того. На сортировку 10000 объектов уйдет 5-10 микросекунд в кадр. Это ничто, по сравнению с тем, что может наворотить пользователь.
Точка зору окремо взятого індивіда завжди суб'єктивна!
Взломщик Battle City.Net
|
|
| |
Aikidos | Дата: Четверг, 19 Января 2012, 16:37 | Сообщение # 28 |
постоянный участник
Сейчас нет на сайте
| Quote (zodiak) Глубина, или слои нужны. Без вариантов. Зачем пользователю напрягаться еще и с порядком отрисовки. Назначил один слой для земли, второй для расительности и можно быть уверенным, что тайл земли никогда не будет поверх дерева. Я и не спорил с этим. Это конечно нужно.
Quote (zodiak) Интересно, чему там тормозить. Ну придется перед выводом отсортировать все спрайты, что с того. На сортировку 10000 объектов уйдет 5-10 микросекунд в кадр. Это ничто, по сравнению с тем, что может наворотить пользователь. Тормозить не будет. Просто было интересно узнать ваше мнение. Мало ли кого прямо бесит глубина и есть другие, более интересные, варианты. Я GM'ом не пользовался
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
Demeron | Дата: Четверг, 19 Января 2012, 18:33 | Сообщение # 29 |
User created in C++
Сейчас нет на сайте
| Quote (zodiak) Интересно, чему там тормозить. Ну придется перед выводом отсортировать все спрайты, что с того. На сортировку 10000 объектов уйдет 5-10 микросекунд в кадр. Это ничто, по сравнению с тем, что может наворотить пользователь. Ну если много мелких спрайтов, то это, думаю, не выгодно будет. Тем более я думаю что времени больше потратиться... Хотя... Может вы и правы =)
|
|
| |
AGENTX001 | Дата: Четверг, 19 Января 2012, 21:33 | Сообщение # 30 |
почётный гцупер
Сейчас нет на сайте
| Aikidos, по поводу глубины, нужно не меньше 1к слоёв + возможность менять глубину в процессе игры. (нужно для изометрии). Работа с объектами - молодец. Очень не хватает в многих двигах.
|
|
| |
Aikidos | Дата: Четверг, 19 Января 2012, 21:43 | Сообщение # 31 |
постоянный участник
Сейчас нет на сайте
| Quote (AGENTX001) Aikidos, по поводу глубины, нужно не меньше 1к слоёв + возможность менять глубину в процессе игры. Да, так и хотел сделать. Значит выбор сделан. Спасибо всем за поддержку и советы.
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
AGENTX001 | Дата: Четверг, 19 Января 2012, 22:11 | Сообщение # 32 |
почётный гцупер
Сейчас нет на сайте
| Quote (Aikidos) Спасибо всем за поддержку и советы. НЗ Aikidos, ждём возможности полапать!)
|
|
| |
Aikidos | Дата: Пятница, 20 Января 2012, 12:22 | Сообщение # 33 |
постоянный участник
Сейчас нет на сайте
| Почти доделал контроллер клавиатуры. Решил привести пример его работы и заодно показать его особенности.
Для начала напишем следующий главный скрипт:
Code void Init() { GameObject @pRedBox = ObjectManager.Create("RedBox"); // Создаём красный квадрат pRedBox.LoadImage("box_red.png"); pRedBox.SetPosition(200, 300); Script.AddScriptToObject("RedBox", "box_red.as"); GameObject @pGreenBox = ObjectManager.Create("GreenBox"); // Создаём зелёный квадрат pGreenBox.LoadImage("box_green.png"); pGreenBox.SetPosition(700, 300); Script.AddScriptToObject("GreenBox", "box_green.as"); }
void Update() {
}
Вот что у нас получилось:
Как мы видим из главного скрипта - мы загружаем для каждого объекта скрипты ("box_red.as" и "box_green.as"). Вот их код:
box_red.as -> Code void Init() { KbController.Connect(KB_KEY_D, "void Move()", KB_CONNECT_TYPE_UP); // Создаём коннект для клавиши D, указываем имя функции, которая должна выполняться и тип коннекта }
void Update() {
}
void Move() { ObjectManager.Get("RedBox").SetPosition(440, 300); // Перемещаем наш объекта }
box_green.as -> Code void Init() { KbController.Connect(KB_KEY_D, "void Move()", KB_CONNECT_TYPE_UP); // Устанавливаем такой же коннект как и для красного квадрата }
void Update() {
}
void Move() { ObjectManager.Get("GreenBox").SetPosition(500, 300); // Так же перемещаем объект }
Теперь, если мы запустим игру и нажмём клавишу "D", то увидим следующий результат:
Из указанного примера видно, что для каждого объекта игры можно устанавливать свои коннекты для контроллера. Буду рад выслушать ваше мнение.
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
AGENTX001 | Дата: Пятница, 20 Января 2012, 20:14 | Сообщение # 34 |
почётный гцупер
Сейчас нет на сайте
| Aikidos, а зачем такой непонятный код Чё не Code void Update() { if KbController.Press(KB_KEY_D) { ObjectManager.Get("GreenBox").SetPosition(500, 300); } } Почему Code ObjectManager.Get("GreenBox").SetPosition(500, 300); а не Code obj = ObjectManager.Get("GreenBox"); obj.x += 3; И вообще както стрёмно у тебя всё...
|
|
| |
Aikidos | Дата: Пятница, 20 Января 2012, 21:06 | Сообщение # 35 |
постоянный участник
Сейчас нет на сайте
| Quote (AGENTX001) void Update() { if KbController.Press(KB_KEY_D) { ObjectManager.Get("GreenBox").SetPosition(500, 300); } }
можно писать Code if(KbController.IsPressed(KB_KEY_D)) { ObjectManager.Get("GreenBox").SetPosition(500, 300); }
Quote (AGENTX001) obj = ObjectManager.Get("GreenBox"); obj.x += 3; Если я потом буду добавлять физ. двиг и т.п., то настройка позиции через методы неизбежна т.к. при смене позиции смещается же не только изображение. ещё физ. тело будет перемещаться будет и многое другое.
Добавлено (20.01.2012, 21:06) --------------------------------------------- Да и из всех двигов, которых я видел, ни один не предоставлял открытое изменение позиции объекта (двиги под C# не считаются).
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
Сообщение отредактировал Aikidos - Пятница, 20 Января 2012, 21:07 |
|
| |
AGENTX001 | Дата: Пятница, 20 Января 2012, 22:13 | Сообщение # 36 |
почётный гцупер
Сейчас нет на сайте
| Quote (Aikidos) Да и из всех двигов, которых я видел, ни один не предоставлял открытое изменение позиции объекта Да,но у многих есть фишки типа setDirection и setSpeed. Это очень упрощает део))Quote (Aikidos) if(KbController.IsPressed(KB_KEY_D)) { ObjectManager.Get("GreenBox").SetPosition(500, 300); } Так лучше)) Да, кстате: Code pGreenBox.LoadImage("box_green.png"); Не очень удобно, лучше както так: Code spr = LoadImage("box_green.png"); pGreenBox.setSprite(spr); И ещё нужна возможность создавать несколько экземпляров объекта, и работа с каждым из них по идентификатору. Напр: Code GameObject @Bot = ObjectManager.Create("objBot"); // Создаём зелёный квадрат Script.AddScriptToObject("objBot", "botAI.as"); var i; for i=0 to 5 { //не знаю какая у вас конструкция FOR bot[i] = CreateObjectInstance("objBot",random(300),random(300));//создаём 5 ботов и заносим их идентификаторы в массив. } Добавлено (20.01.2012, 22:13) ---------------------------------------------
|
|
| |
Aikidos | Дата: Пятница, 20 Января 2012, 22:17 | Сообщение # 37 |
постоянный участник
Сейчас нет на сайте
| Quote (AGENTX001) spr = LoadImage("box_green.png"); pGreenBox.setSprite(spr); А какие это даёт плюсы?
Quote (AGENTX001) И ещё нужна возможность создавать несколько экземпляров объекта, и работа с каждым из них по идентификатору. Напр: Копии можно создавать. GameObject @clone = ObjectManager.Clone("MyObject", "MyObjectClone");
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
AGENTX001 | Дата: Пятница, 20 Января 2012, 23:41 | Сообщение # 38 |
почётный гцупер
Сейчас нет на сайте
| Quote (Aikidos) А какие это даёт плюсы? Ну ты прик для ста разных объектов заново грузить картинку?) Quote (Aikidos) GameObject @clone = ObjectManager.Clone("MyObject", "MyObjectClone"); Я говорю не про копии, а про экземпляры. Вот представь, есть объект пули, в момент выстрела, его нужно создать. И вот подумай, сколько пуль может быть на сцене в один момент? 30? 40? 90? А может даже больше... И каждую копирывать... А потом ещё и уничтожать несуществующие объекты... Тупо, очень! Я бы тебе в этом вопросе рекомендовал, глянуть на Game Maker, там с этим очень хорошо решено. Aikidos, ориентируйся на лидеров в этой облости!)
|
|
| |
Aikidos | Дата: Суббота, 21 Января 2012, 00:35 | Сообщение # 39 |
постоянный участник
Сейчас нет на сайте
| Quote (AGENTX001) Ну ты прик для ста разных объектов заново грузить картинку?) Нет. Можно клонировать объект.
Quote (AGENTX001) Я говорю не про копии, а про экземпляры. Вот представь, есть объект пули, в момент выстрела, его нужно создать. И вот подумай, сколько пуль может быть на сцене в один момент? 30? 40? 90? А может даже больше... И каждую копирывать... А потом ещё и уничтожать несуществующие объекты... Тупо, очень! Не совсем понимаю, что ты имеешь ввиду. А GM не копирует объекты пуль к примеру? Как тогда там реализовано то что ты говоришь?
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
AirWolF_RG | Дата: Суббота, 21 Января 2012, 12:17 | Сообщение # 40 |
почетный гость
Сейчас нет на сайте
| Aikidos, Я так понял он говорит про создание экземпляров класса. Тобишь допустим ты описываешь игровой объект "пуля", а потом во время игры создаешь сколько тебе надо экземпляров такого класса. Только не совсем понятна логика AGENTX001. Такие классы надо создавать уже в своем собственном коде, а не в движке. Просто допустим в тот же класс "пуля" просто добавить элемент Code GameObject @pBullet = ObjectManager.Create("bullet"); // Создаём зелёный квадрат pBullet.LoadImage("bullet.png"); pBullet.SetPosition(bx,by); Script.AddScriptToObject("bullet", "bullet.as"); в метод создания экземпляра.
Java(4),C(3),C++(4),PHP(3),BlitzMAX(5),Delphi(4),VB(4) Оценка знаний - от 1 до 5
|
|
| |
|