Всем привет! В данный момент я делаю редактор в котором можно что то построить что то из различных объектов. Сделано уже много и сейчас мне потребовалось сделать Undo Redo. У меня были небольшие догадки по этому поводу, но к окончательному решению как это сделать я всё же не пришел. Постоянно "строитель" инстансит и удаляет блоки, копирует большими группами и вставляет, импортирует огромные здания, изменяет размеры, вращает, один объект и сразу много. Всё это как то нужно сделать с Undo и Redo. Если бы в .net можно было сделать массив в массиве то это было бы очень просто Например массив, который типа класса в котором другой массив.. Так бы мы легко создали группы которые занесли в массив.. Но давайте не будем говорить о нереальном, а лучше поговорим о том как всё же это лучше сделать. То что это нужно делать с массивом это понятно. Но как сделать так что допустим занесём туда 100 объектов (например было вставлено 100 объектов) и если нажмем undo то именно 100 и удалится (и ещё занесется в массив Redo что бы можно было опять объекты заспавнить).
Очень жду помощи всех, хотелось бы эту проблему уладить как можно скорее. Если не знаете как это сделать, просто давайте свои маленькие догадки, может у меня появится своя идея.
Не совсем понятен вопрос, это и есть способ, записывать все действия и объекты и все, в чем суть вопроса? Если ты о том, что это большая нагрузка на оперативку, то можно выгружать объекты во внешний файл и загружать при востребовании. https://www.artstation.com/artist/jessystorm
Сообщение отредактировал JessyStorm - Среда, 04 Декабря 2013, 02:14
Если бы в .net можно было сделать массив в массиве то это было бы очень просто Например массив, который типа класса в котором другой массив.. Так бы мы легко создали группы которые занесли в массив.. Но давайте не будем говорить о нереальном
нереальное но я бы на твоем месте сделал отдельный класс, назвал бы как нибудь СashWork. прописал бы ему статические методы по регистрации действий, по редо и андо в нем. там была бы ТОЛЬКО ОДНА переменная которая хранит цепочку последних действий (в заранее заданном количестве), и переменная, которая указывает на текущую позицию в нем. если у тебя создается 100 элементов в качестве ОДНОГО действия - то это сложнее, но лучше сделать так - все действия должны записываться в виде отдельной структуры с вложенным массивом (на случай 100 элементов напр.). структура "СashWorkElement" должна содержать все важные тебе параметры: ссылку на прототип созданного объекта*, позицию объекта, поворот, цвет, размер и тп. Чтобы потом можно было бы восстановить. * ссылка должна быть на прототип только чтобы сделать возможность отмены УДАЛЕНИЯ объекта без больших накладок с хранением их в невидимой форме после удаления. поэтому все объекты должны быть префабнутыми или примитивами. в классе был бы автоматический метод удаления "хвоста" - т.е. старых позиций, когда становится невозможно отменить действие. ну как то так. Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Среда, 04 Декабря 2013, 09:25
Если бы в .net можно было сделать массив в массиве то это было бы очень просто
это задача такая? или я не понимаю юмора? пример на шарпе Unity3d разработчик на С#. Лучшее спасибо + в репу. "Безумие: делать одно и то же снова и снова, и ждать при этом разных результатов". "Человек, который никогда не ошибался никогда не пробовал ничего нового". "Если человек может спокойно управлять автомобилем во время поцелуя красивой девушки, значит он уделяет поцелую недостаточно внимания”. Альберт Эйнштейн
во во.. Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Не совсем понятен вопрос, это и есть способ, записывать все действия и объекты и все, в чем суть вопроса?
Суть вопроса? Как сделать Undo и Redo. Это и есть вопрос.
ЦитатаKamiRonin ()
но я бы на твоем месте сделал отдельный класс, назвал бы как нибудь СashWork. прописал бы ему статические методы по регистрации действий, по редо и андо в нем. там была бы ТОЛЬКО ОДНА переменная которая хранит цепочку последних действий (в заранее заданном количестве), и переменная, которая указывает на текущую позицию в нем. если у тебя создается 100 элементов в качестве ОДНОГО действия - то это сложнее, но лучше сделать так - все действия должны записываться в виде отдельной структуры с вложенным массивом (на случай 100 элементов напр.). структура "СashWorkElement" должна содержать все важные тебе параметры: ссылку на прототип созданного объекта*, позицию объекта, поворот, цвет, размер и тп. Чтобы потом можно было бы восстановить. * ссылка должна быть на прототип только чтобы сделать возможность отмены УДАЛЕНИЯ объекта без больших накладок с хранением их в невидимой форме после удаления. поэтому все объекты должны быть префабнутыми или примитивами. в классе был бы автоматический метод удаления "хвоста" - т.е. старых позиций, когда становится невозможно отменить действие. ну как то так.
Дело в том что некоторое мне ещё не понятно, некоторое я ещё не знаю. С классами я мало работал. Я умею создавать классы и часто использую их для массивов, что бы было несколько параметров разных. Но понятия не имею что такое структуры , ovveride, abstract (читайте ниже). Может кто объяснит человеческим языком? Почитал я на msdn, на dotnetpearls.com.. Непонял.. Раньше когда я о классах почти ничего не знал и нужно было хранить несколько значений то я просто делал несколько массивов и при прокрутке всего массива через for я проверял item по индексу в каждом массиве)
ЦитатаKira ()
пример на шарпе
Читал это уже вчера. И не раз . Вчера полностью прочитал, и сегодня. Впринципе понятно но всё таки и не понятно.. Как я написал выше я не знаю что такое abstract и как это использовать понятия не имею.
Поэтому как сделать хотя бы Undo у меня нормальной идеи нету. Да, на хабре есть уже код готовый, но я предпочитаю делать свой код и не использовать чужое. Так я обучаюсь. Но как сделать ундо не знаю. KamiRonin вроде писал что все объекты должны быть префабами. Отвечаю, да, это префабы. Объекты поделены на ID и каждый объект имеет название 0,1,2 (Clone) и т.д.
Жду ваших ответов и мнений по этой теме!
Добавлено (04.12.2013, 18:08) --------------------------------------------- Хотя в целом статья "пример на шарпе" понятная, но только я не понимаю что такое Document document в методах и зачем
Код
public abstract class HistoryItem { public abstract void Undo(Document document); public abstract void Redo(Document document); }
?
Сообщение отредактировал robertono - Среда, 04 Декабря 2013, 18:08
Пиши все массивом. То есть массив из каких то элементов(например Dictionary - Словарь). Каждый элемент массива это словарь каких-то параметров. Например
Код
Dictionary d = new Dictionary();
d.Add("PosX",123); d.Add("PosY",123); //и так далее
Что то в этом роде. Оперативной памяти на все это немного уйдет. Ну а если хочешь, можешь вообще типа макросов сделать (Записывать их в файл в виде XML). Также можно сделать Undo Redo.
Добавлено (04.12.2013, 18:34) --------------------------------------------- Блин, жалко у меня времени мало. Я бы тебе помог. Интересная задача ))
Aevien, оптимизировать можно и потом.. 8 гб оперативки на это всё хватит)
Всё равно спасибо Вам, теперь я узнал что существует какой то Dictionary. Пойду читать про него
Добавлено (04.12.2013, 18:44) --------------------------------------------- Aevien, Вы предлагаете создать словарь, занести в него действия (неважно что) и затем добавить в массив Undo ?
это из ссылки от Киры просто используется офис. там все в документах. Document это имя типа, а document эт переменная.
тут было две или три темы "ООП на пальцах" - почитай их обязательно или что-то про Объектно Ориентированное Программирование.
abstract означает что класс или метод пишется как болванка (абстракция типа) для конкретизации в дальнейшем - в его ПОТОМКАХ. абстрактные методы не могут вызываться из твоей программы!! они же болванка а не продукт. когда ты сделаешь свой класс от абстрактного - тогда их можно будет применить.... ГРУБО ГОВОРЯ! Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
robertono, ну или можете так object = new List<Object>();
objects = new List<List<Object>>();
естественно приведение типов поможет сохранять любые объекты. Unity3d разработчик на С#. Лучшее спасибо + в репу. "Безумие: делать одно и то же снова и снова, и ждать при этом разных результатов". "Человек, который никогда не ошибался никогда не пробовал ничего нового". "Если человек может спокойно управлять автомобилем во время поцелуя красивой девушки, значит он уделяет поцелую недостаточно внимания”. Альберт Эйнштейн
abstract означает что класс или метод пишется как болванка (абстракция типа) для конкретизации в дальнейшем - в его ПОТОМКАХ. абстрактные методы не могут вызываться из твоей программы!! они же болванка а не продукт. когда ты сделаешь свой класс от абстрактного - тогда их можно будет применить.... ГРУБО ГОВОРЯ!
нет нет, как раз-таки через абстрактный класс, мы обращаемся к потомкам. Ведь для каждого случая может быть своя реализация undo/redo. Как и автомобиль, руль есть у всех, но внутренний механизм разный. Это все из области интерфейсов. Unity3d разработчик на С#. Лучшее спасибо + в репу. "Безумие: делать одно и то же снова и снова, и ждать при этом разных результатов". "Человек, который никогда не ошибался никогда не пробовал ничего нового". "Если человек может спокойно управлять автомобилем во время поцелуя красивой девушки, значит он уделяет поцелую недостаточно внимания”. Альберт Эйнштейн
Сообщение отредактировал Kira - Среда, 04 Декабря 2013, 19:06
нет нет, как раз-таки через абстрактный класс, мы обращаемся к потомкам.
я же писал, что это грубо говоря.. Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Как вариант, чтобы лучше всё это дело освоить, можно выполнить такое упражнение:
Внимание этот метод для тех кто хочет стать хорошим программистом и связать с этим жизнь, т.к. он долгий и не самый простой, но позволяет проникнуться в устройство электроники и поможет начать мыслить подругому.
Создать импорт и экспорт различных данных в свой (!) формат (придумать описание различных данных (числа, картинки, объекты, система частиц и т.д.) и сохранять это в текстовый или битовый файл), не используя json, xml и т.д. Почитать про устройство базы данных и модели данных (реляцционная и т.д.). Сделать свой экспорт популярного формата хранения данных: xml, json, также можно к примеру разобрать и сделать экспорт *.obj формата. Так можно будет понять как хранить различную информацию. Тогда задача с undo/redo стать Вам если не тривиальной, то покрайней мере понятной и лишних вопросов уже не возникнет.
P.S. все это не обязательно для ознакомления если программирование, как профессиональная деятельность, не есть Ваша главная цель. Без этого вполне можно жить и даже сделать какую - нибудь "штуку", но с этим всё станет легче и понятнее. И если в будущем Вы с этим столкнётесь, то это сильно облегчит Вам жизнь.
Делать игры - это ловить кайф от трудной и порою нудной работы, изучать то, на что у Вас уходят годы, жертвовать как временем, так и в какой-то мере здоровьем, работать куда больше чем другие. Порою сталкиваться с непониманием и большими трудностями, всё это дело преодалевать и в конце быть готовым к полному краху, но конечно грезить о комьюнити и игроках, которым Ваши игры понравятся и которые Вам за это возможно скажут спасибо, а кто-то даже поддержит рублем
Сообщение отредактировал Valter - Четверг, 05 Декабря 2013, 15:44
Не этого эффекта я ждал от сообщения ), буду скромнее... Просто хотелось подчеркнуть, что чтобы делать игры, нужно этим болеть, ведь это не простоя задача и не всё так радужну как это малюют.
И в тоже самое время, при сильном желании, игры может делать любой. Взять в пример Конрода, который Томашкевич, закончил медицинский, затем стал младшим тестером в CD Project, в итоге дорос до Гейм Директора игры Ведьмак 3. Человек просто реально болел играми, вот у него и получилось и без профильного образования, без огромного опыта и без нереальных навыков.
Сообщение отредактировал Valter - Четверг, 05 Декабря 2013, 15:58
Valter, мне кажется вы слишком много хотите от 14 летнего школьника... Хорошо кодить, писать свои расширения и форматы это конечно хорошо.. но ведь не всё сразу. Я обучаюсь по мере продвижения разработки моей игры. И пока мне этого достаточно. Зачем мне писать новый формат и убивать кучу времени? Да, это полезно знать, это будет работать быстрее чем xml, но надо ли это мне сейчас? Мне достаточно того что этот редактор сохраняет более 4000 объектов (зависит от здания, думаю на нормальное здание уйдёт около 20 000 объектов). Но в игре xml не используется. Люди построят что то, экспортируют постройку в xml и я её импортирую в редактор юнити который я написал. И всё. Так что вот моё мнение по Вашему посту