|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.03.2010, 22:10 | #441 |
Форумчанин
Регистрация: 20.04.2009
Сообщений: 136
|
Да, тема довольно интересная, правда, местами сложная для понимания.
Но, у меня возникло небольшое разногласие: простите, если я ошибаюсь, но мне кажется что Банк текстур не нужная трата ресурсов. Что бы избавиться от непониманий в дальнейшем, привожу код своего Банка: Код:
Скажите, неужели толк от Банка текстур настолько выше и значительней, чем простое создание 1-го битмапа, загрузки в него текстур и очистки этого битмапа, после окончания работы с ним??? P.S. Тему читал всю, но заметил лишь два пункта превосходства Банка текстур, хотелось бы больше. |
14.03.2010, 22:48 | #442 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Зачем же обязательно 256, когда можно использовать ровно столько, сколько надо? Используйте динамический массив строго необходимого размера, и будет вам оптимальное использование ресурсов. (Хотя уже в упор не помню, есть ли в Паскале динамические массивы, но в Delphi точно должно быть что-то подходящее!)
Можно, конечно, хранить все текстуры в виде одного сложного битмапа - это вопрос удобства, но все равно где-то должна храниться разнообразная информация о картинке (размеры, количество кадров в анимации, прозрачность и т.д. и т.п.) Или вы имеете в виду каждый раз грузить из файла одну текстуру, рисовать ее, выгружать из памяти, грузить следующую, рисовать, выгружать, и так далее множество раз в секунду? Вот тогда это уж настоящая пустая трата ресурсов!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
14.03.2010, 23:42 | #443 | ||
Форумчанин
Регистрация: 20.04.2009
Сообщений: 136
|
Уважаемый Гром, я не профессионал и все что пишу, основано на моих собственных умозаключениях и на том, что видел своими глазами. Вот вы в своем сообщение говорите, что происходит при использовании буфера:
Цитата:
Цитата:
Последний раз редактировалось Alexan-Dwer; 14.03.2010 в 23:56. Причина: Пояснение |
||
15.03.2010, 00:14 | #444 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Не отличающиеся внешне текстуры - это просто грубая ошибка художника/дизайнера. Тому, кто их делал - руки оторвать и пришить в более правильное место.
Так что, исходя из того, что разные текстуры выглядят достаточно отлично друг от друга, получаем, что либо текстур гораздо меньше, либо толк от них всех все равно есть. Потом, при работе с банком текстур есть однократная загрузка с диска, а потом идет работа с оперативной памятью, что гораздо быстрее! А каждый раз читать с диска одну маленькую картинку, потом читать с диска еще 399 маленьких картинок, и так, скажем, 25 раз в секунду... Очень снижается быстродействие. С банком текстур мы не имеем такой проблемы, расплачиваясь за существенное быстродействие сравнительно небольшим расходом оперативки, а если текстуры часто повторяются - то и совсем небольшим. В общем, при увеличении числа текстур в варианте с банком - объем использования оперативной памяти растет линейно, в варианте без него - линейно же падает быстродействие. Вот только коэффициенты пропорциональности не в пользу варианта без банка.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
15.03.2010, 00:58 | #445 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Гром говорит умные вещи, стоит поверить на слово, ...если только код написан был автоматически по примерам, и нет желания все же разобраться самому.
Попробую более доступным языком выразить все, что было уже сказано и показано в примерах. Вот у нас некий шаблон карты. Он закодирован, и на каждую текстуру клетки карты приходится свой код. В структуре есть матрица индексов текстур (это слой карты), есть динамический массив банка текстур, например Array of TGBank. Идет загрузка данных, при этом натыкаясь на первый байт кода текстуры банку задается размер 1, в ячейку помещается текстура и все сопутствующие данные по типу (размеры, смещения и пр.) в матрицу слоя записывается по координатам (x,y) индекс ячейки банка. Далее, переход на следующий код клетки, ...массив банка проверяется на наличие уже загруженной такой текстуры от 1 до размера массива, если такой нет, то идет увеличение размера массива на 1 и заполнение последней ячейки текстурой и данными к ней, также в матрицу слоя идет индекс ячейки банка. На очередном шаге встречается очередной код карты, при проверке банка оказалось, что такая текстура уже загружена, ...загрузка пропускается, вместо нее в матрицу пойдет индекс найденного совпадения кода на карте и в проверяемой ячейке банка. И так далее, пока не будет считана вся карта. Банк текстур никогда не очищается, если эта карта, или ее участок является активным в игре. Если нужна другая карта, тогда банк освобождается и заполняется заново, но уже текстурами к новой карте. Алгоритм построения кадра игры всегда пользуется индексами матрицы карты и берет текстуры непосредственно из банка, ...никакого другого хранения текстур в игре, кроме как в банке, быть не должно. Что в итоге? ...если текстурщик все продумал и создал набор оптимальных текстур, с помощью которых можно построить поверхность любой нужной сложности, то в памяти никогда не будет количества текстур, равных количеству клеток на карте, ...в том и заключается оптимизация. Вот у нас слой поверхности: трава, земля, дорога. Если прикинуть, то по 5 вариантов достаточно для неоднообразности. В сочетании со случайным наполнением и точным расположением нужных типов текстур карты 20х20, благодаря банку в памяти будет всего 15 текстур, ...иначе 400 (!) ...а если текстуры 25х25, то в размерах соотносится как 27 Кбайт к 720 Кбайт (!) ...есть разница? То же самое касается и слоя объектов, где текстуры уже будут поболее (вплоть до 400х500 пкс), понятно, что нет смысла держать в памяти копии текстуры одного и того же типа дерева, здания, части горы, ...да чего еще угодно. Вот в этом суть банка текстур, при правильном его создании и использовании. Что касается редактора карт. В любой момент может понадобиться любая из имеющихся текстур, ...у вас есть выбор, сразу загрузить все, или делать это по мере обращения к новым типам текстур, причем не выгружая прежних (если использование таковых не предвидится, то и загружать не нужно).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 15.03.2010 в 01:02. |
16.03.2010, 21:18 | #446 | ||
Форумчанин
Регистрация: 20.04.2009
Сообщений: 136
|
Цитата:
Цитата:
Пока что основные составляющие это: игрок и карта. Теперь сама реализация: Тип игрока: Код:
Код:
Управление персонажем: при нажатии на кнопку W вначале происходит проверка на проходимость и не занятость каким-либо НПС клетки выше персонажа. Если эта клетка свободна, то y координата игрока уменьшается на одну единицу, дальше отрисовывается анимация перемещения модели игрока вверх. Я сейчас все это только начинаю реализовать, и кое-что пока не совсем понятно. Поэтому прошу объяснить с простыми примерами о том, как значения из FullMap перевести в ScreenMap в зависимости от координат игрока. И прошу, если у меня в коде или в рассуждениях есть ошибки или не рациональные подходы, пожалуйста, напиши об этом. Последний раз редактировалось Alexan-Dwer; 16.03.2010 в 23:33. Причина: Ошибка |
||
16.03.2010, 23:29 | #447 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Вот тут ошибка:
Код:
Код:
По идее ScreenMap не нужен в принципе. Достаточно иметь 4 переменные, которые хранят диапазон выборки клеток карты. Две отвечают за сдвиг от начата карты по-X и по-Y, остальные две размер области экрана, т.е. ширину и высоту в клетках (у вас обе по 20). Я так понимаю речь идет о классическом расположении персонажа в центре экрана?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
16.03.2010, 23:46 | #448 | |||
Форумчанин
Регистрация: 20.04.2009
Сообщений: 136
|
Цитата:
Цитата:
Цитата:
|
|||
17.03.2010, 15:07 | #449 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Очень просто.
Вот персонаж в начальной клетке K(0,0), если он центрируется на экране, то мы четко знаем сколько клеток карты нужно, чтобы положение персонажа было в центре. Экран 20х20 - уже ошибка, числа должны быть нечетными. Пусть 19х19, тогда диапазон выборки будет от 0 до (19-1)/2. Теперь для координаты X, ближе к коду. Если сдвиг это DispX, а количество клеток в экране ScreenW, то цикл выборки организуется так: Код:
Код:
Код:
По поводу отображения. Оно теперь не привязано к координатам начала 0,0, а будет плавающим: Код:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
04.05.2010, 18:51 | #450 |
Участник клуба
Регистрация: 29.01.2008
Сообщений: 1,039
|
Помогите с редактором
Объясню суть вкратце: есть редактор, на мой взгляд, с не совсем удобным интерфейсом, но лучше придумать не могу. Что меня смущает: если я хочу, чтобы выбранный объект создавался как препятствие, я щёлкаю на галочку "Препятствие". К примеру, добавляю квадрат как препятствие, второй квадрат как не препятствие(снимаю галочку), третий как препятствие и т.д. Хочется придумать для этой операции вариант получше. Далее...Далее нет смысла объяснять, это очень долго. Во вложении exe редактора. Мне важно ваше мнение, как сделать программу удобней.
Небольшая инструкция: - Чтобы добавить объект, нажмите на + рядом с пустым полем и выберите любое изображение на вашем компьютере - Чтобы прекратить расстановку объектов по карте, нажмите "Сброс" - Чтобы выделить объект, нажмите на него. Вы можете перемещать объект по карте, с помощью стрелок. Чтобы сбросить выделение, нажмите на пустую область карты или на "Сброс" - Чтобы удалить объект, выберите объект и нажмите Delete - Чтобы ставить объекты как препятствия, щёлкните на галочке "Препятствие" - Чтобы создать новую зону, нажмите + рядом с надписью "Зона" - Чтобы удалить текущую зону, нажмите - - Чтобы перемещаться по зонам, используйте << и >> Надеюсь, что вы поможете мне. Спасибо P.S. Просьба не пользоваться меню - оно не до конца сделано и могут возникнуть проблемы. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Хорошие уроки | Render | Общие вопросы Delphi | 9 | 15.09.2012 07:13 |
Акцесс вопросы новичков | Yaga | Помощь студентам | 4 | 02.06.2008 00:16 |
Учебники для новичков в програмировании | Рар | Общие вопросы Delphi | 6 | 08.01.2007 08:07 |