Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.10.2018, 19:15
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 21  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Цитата:
Да, очень круто! То есть если в процессе игры гоблину прилетело от мага, то его life в списке будет отминусован, о чём список ещё и уведомит всех желающих.
Для каждого гоблина лучше создавать свою модель данных, которые будут изменяться в рантайме. При иниализации такого гоблина, ему можно передать нужную дату, например так:

Код AS3:
gobln.init(data:DUnit);
А уже в теле init создаем модель и заносим туда данные из даты.

Код AS3:
public function init(data:DUnit):void
{
  var m_goblin:MEnemy = new MEnemy(data);
}
Изменения хп, маны, урона и прочие модификации с переменными воспроизводятся внутри MEnemy.

Код AS3:
private var data:DUnit;
 
private var hp:int;
private var mp:int;
public class MEnemy(data:DUnit)
{
 this.data = data;
 
hp = data.hp;
mp= data.mp;
}
 
public function damage(dmg:int):void
{
   hp -=dmg;
}

Старый 20.10.2018, 20:18
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 22  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Godwarlock,
Я пропагандирую немного другой подход. В нём все данные не собираются в одну модель/объект, а разносятся по составляющим на отдельные списки/таблицы, связи между которыми реализованы по принципу реляционной модели данных.

Дело в том, что объектная модель, на определённых масштабах проекта начинает сильно мешать/усложнять жизнь. В реляционной модели всё просто и масштабируется без проблем. Ей не нужны сериализаторы, она не обрастает комом запутанных связей через наследование или интерфейсы. В ней код не содержит данные, а только обрабатывает их. И ещё, сколько памяти будет занимать твой объектный гоблин? Помимо его собственных данных, это будет ещё и EventDispatcher и вся цепочка наследования. Мой гоблин - это всего несколько байт. 2 UInt и 1 Float.
__________________
Дети не должны знать о своих родителях

Старый 20.10.2018, 20:46
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 23  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Tails понял твою задумку. В общем у тебя просто используется json в котором забиты все рантаймовые состояния противника. Этот объект можно передавать куда угодно и совершать какие-либо действия над ним. А что если информация из json-а не будет соответствовать логике? Например подставили другой json в обработчик, который изменяет hp, но hp у данной даты нету? Или придется проводить проверки на все состояния?

Я о том, например

Код AS3:
private function damage(data:Object = {id:1,mp:56}):void
{
cur_damage = 4;
data.hp -= cur_damage;
 
}
Или я не совсем вкурил, как используется такой подход

Старый 20.10.2018, 20:55
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 24  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
При чём тут json? Это просто формат для передачи данных. Вся структура данных описана в самом приложений, json только заполняет их. Что будет, если подсунуть некорректный json? Тоже, что и если вставить флешку в разьём видеокарты. Я не пробовал

Json вообще никак не используется в рантайме. Он нужен только для того, чтобы передать данные игры с жёсткого диска/сети в наше приложение.
Если какой-то юнит в принципе может дамажиться, значит, все они имеют это поведение, так-как класс Unit абстрагирован и представляет вообще любой возможный юнит в игре. Если при этом, какие-то юниты дамажиться не должны (неуязвимы), значит мы добавляем такой признак в их описание: UnitData.invulnerable, который будет проверяться при попытке нанести юниту урон.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 20.10.2018 в 21:08.
Старый 20.10.2018, 21:17
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 25  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Tails
Вместо объектной типизированной модели для каждого айтема списка, ты просто всё закидываешь в объектный массив и по геттеру получаешь нужный айтем со всеми его свойствами из данного массива. Но придется где-то записывать, какие свойства хранит данный итем или придется постоянно чекать сам json и искать итем по нему, чтобы узнать о свойствах, чтобы где-то их применить. В целом суть понял. Подход неплохой, учитывая что сам объект можно еще будет и зашифровать по необходимости и расшифровывать когда это нужно.

Старый 20.10.2018, 21:21
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 26  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Посмотри пример во вложении:
http://www.flasher.ru/forum/showpost...1&postcount=16
__________________
Дети не должны знать о своих родителях

Старый 20.10.2018, 21:32
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 27  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Tails посмотрел. Просто я не понял ты написал
Цитата:
Я пропагандирую немного другой подход. В нём все данные не собираются в одну модель/объект, а разносятся по составляющим на отдельные списки/таблицы, связи между которыми реализованы по принципу реляционной модели данных.
У меня все данные и не собираются в одну модель. В модели только информация для реализации этой модели, с которой в дальнейшем можно проводить изменения в рантайме. Мы вытащили айтем(дату) из списка и передали в модель. Модель записала нужные из даты данные хп и мп и реализовалась. То есть создана структура определенного гоблина со своими хп и жизнями. Я могу создать 1000 таких гоблинов и каждый имеет параметры жизней и маны, полученные из одного единственного айтема.

Добавлено через 9 минут
Приведи пример, как ты создашь со свой структурой 50 гоблинов и функцию, в которой описана логика по вычитанию у рандомного гоблина 5хп. Так будет яснее.


Последний раз редактировалось Godwarlock; 20.10.2018 в 21:47.
Старый 20.10.2018, 22:06
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 28  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Суть даты не только в инициализации начальных значений переменных, она шире, она описывает тип юнита. Каждый отдельный UnitData - это отдельный вид юнита. Каждый Unit - должен содержать ссылку (в ввиде unitID) на свой тип, к которому он принадлежит.

Самый простой пример:
Код AS3:
// Интерфейс класса World
// Создание юнита:
function unitCreate(id:uint):Unit {
    var data:UnitData = _gameData.units.getElementByID(id);
    var unit:Unit = new Unit(++_autoID);
 
    unit.unitID = id;
    unit.life = data.life;
 
    _units.add(unit);
 
    return unit;
}
 
// Нанесение урона юниту:
function unitDamage(id:uint, value:Number):void{
    var unit:Unit = _units.getElementByID(id);
 
    unit.life -= value;
}
Пользовательский класс:
Код AS3:
var unit:Unit = world.unitCreate(2); // Создали гоблина
world.unitDamage(unit.id, 40); // Нанесли ему 40 урона
__________________
Дети не должны знать о своих родителях

Старый 20.10.2018, 22:35
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 29  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Tails всё понятно. Вопросов нет. Я думал ты создаешь объект var enemy:Object = new Object(); enemy = {id:UnitData.id,hp:UnitData.hp}; и изменения проводишь именно в нем, а ты создаешь такую же класс-модель, как и у меня. Это и ввело меня в заблуждение.


Последний раз редактировалось Godwarlock; 20.10.2018 в 22:45.
Старый 21.10.2018, 22:13
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 30  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Всем пардон, я удалил исходный вопрос, пока Tails писал на него ответ.

Я спрашивал о том, что используя реляционную модель хранения данных, в классе Модели должны оставаться только методы без полей.

Цитата:
Сообщение от Tails Посмотреть сообщение
Какие методы? Обычно нет, обычно всё взаимодействие с миром происходит через апи объекта World.
А если например, метод расчёта урона, который наносит гоблин (т.е. не значения дамага из справочника, а что-то типа вероятности попадания или какие-то ещё модификаторы), отличается от аналогичного для мага? Как тогда обойтись без наследования классов юнитов в Модели?
__________________
Не сломано - не чини!

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.