|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите сделать движок квеста (2D, со звуком)
Привет всем.
Я делаю свой юморной квест и уже подошел к моменту написания движка. Сам я программировал пару приложений на делфи, но это было очень давно. Короче уже почти все забыл. Поэтому и нужна помощь практикующего программиста. Игру никто не финансирует, делаю для себя и на удачу - вдруг стрельнет, поэтому много денег дать не могу (2000-4000 руб.). Хотелось бы найти программиста готового в основном делать на энтузиазме. В качестве бонуса, в игре созданной на данном движке будет написано, что программировал такой-то (можно e-mail указать). Также можем договориться о дополнительной выплате, в случае если от игры каким-либо образом в будущем будет получена прибыль. Если у вас есть свои соображения и предложения - напишите. Поправьте меня если что :-) Ниже привожу первую версию ТЗ (писал сам, специфика Delphi скорей всего не соблюдена): Код:
ТРЕБОВАНИЯ К ДВИЖКУ 2D-КВЕСТА (редакция 1.0 от 12 августа 2012) СРЕДА РАЗРАБОТКИ |__ Delphi (желательно Lazarus) |__ Желательно кроссплатформенная (Windows, Mac, и др.) |__ На выходе исполняемое в ОС приложение (типа exe) СИСТЕМНЫЕ ТРЕБОВАНИЯ |__ Мышь |__ Звуковая плата |__ ОС (Windows обязательно, желательно Mac и др.) ТИПЫ ДАННЫХ И ФУНКЦИИ К НИМ | |__ Location - локации (id, name, imagefile, walking_area, fg_start, алгоритм отображения локации) | |__ Location_change() - вызов смены локации | |__ Location_show() - включение отображения локации | |__ Location_hide() - выключение отображения локации | |__ Area - фрагмент локации (id, id_location, name, hint, imagefile, x, y, cursor=default|arrow_left|right|top|bottom) | |__ Area_show() - включение отображения фрагмента локации | |__ Area_hide() - выключение отображения фрагмента локации | |__ Area_click() - обработчик нажатия на фрагмент локации | |__ Area_hint_show() - включение отображения всплывающей при наведении подсказки | |__ Area_hint_hide() | |__ Item - предметы в игре (id, name, hint, imagefile, imagefile_icon, imagefile_face, x, y) | |__ Item_show() - включение отображения предмета | |__ Item_hide() - выключение отображения предмета | |__ Item_take() - взять предмет | |__ Item_talk() - вывод окна с лицом говорящего и текста сообщения (текст появляется буква за буквой, при нажатии текст сразу полностью рисуется) | |__ Item_click() - обработчик нажатия на предмет | |__ Item_hint_show() - включение отображения всплывающей при наведении подсказки | |__ Item_hint_hide() | |__ Character - персонажи в игре (id, name, hint, imagefile, imagefile_face, id_location, x, y, view=left|right|top|bottom|...) | |__ Character_show() - включение отображения персонажа | |__ Character_hide() - выключение отображения персонажа | |__ Character_talk() - вывод окна с лицом говорящего и текста сообщения (текст появляется буква за буквой, при нажатии текст сразу полностью рисуется) | |__ Character_move() - определние конечной точки пути перемещения, расчета траектории движения к ней и запуск анимации движения персонажа | |__ Character_click() - обработчик нажатия на персонажа | |__ Character_hint_show() - включение отображения всплывающей при наведении подсказки | |__ Character_hint_hide() | |__ Pocket - карман для предметов, взятых главным персонажем (id) | |__ Pocket_show() - включение отображения панели кармана | |__ Pocket_hide() - выключение отображения панели кармана | |__ Pocket_item_add() - добавление предмета в конец списка взятых предметов (со скрытием предмета на локации и показом иконки предмета) | |__ Pocket_item_delete() - удаление предмета из списка взятых предемтов (со скрытием иконки) | |__ Pocket_item_click() - обработчик нажатия на предмет из списка (при повторном нажатии выбор снимается) | |__ Pocket_item_select() - выбор предмета (иконка предмета заменяет указатель мыши) | |__ Pocket_item_unselect() - снятие выбора предмета (указатель мыши становится стандартным) | |__ Pocket_button_prev_click() - перемотка предметов в кармане | |__ Pocket_button_next_click() - перемотка предметов в кармане | |__ Pocket_item_hint_show() - включение отображения всплывающей при наведении подсказки | |__ Pocket_item_hint_hide() | |__ Organizer - памятка для текущей игры (id_text, type) | |__ Organizer_button_show() - включение отображения кнопки открытия памятки в модальном окне | |__ Organizer_button_hide() - выключение отображения кнопки открытия памятки в модальном окне | |__ Organizer_add() - добавление текстовой записи в конец списка памятки | |__ Organizer_delete() - удаление текстовой записи из списка памятки | |__ Organizer_type_set() - пометка записи как 1) запись-памятка 2) цель 3) выполненная цель (напротив каждой записи соответствующая иконка) | |__ Text - тексты (id, text) | |__ Text_get() - получение строки текста | |__ Music - музыка (id, musicfile) | |__ Music_change() - вызов смены музыки (секундное снижение громкости текущей композиции и смена на новую композицию) | |__ Music_play() - включение проигрывания музыкальной композиции (одновременно может играть только одна композиция) | |__ Music_stop() - выключение проигрывания музыкальной композиции | |__ Sound - звуки (id, soundfile) | |__ Sound_play() - включение проигрывания звука | |__ Sound_stop() - выключение проигрывания звука | |__ Savegame - сохраненная игра (бинарные или текстовые файлы с уникальными именами) | |__ Savegame_save() - сохранить игру | |__ Savegame_load() - загрузить игру | |__ Savegame_list_get() - получить список всех сохраненных игр | |__ Animation - алгоритмы анимации (id) | |__ Animation_play() - включение проигрывания алгоритма "ролика" анимации (указатель мыши становится в виде значка перемотки >>) | |__ Animation_stop() - выключение проигрывания алгоритма "ролика" анимации | |__ Animation_rewind() - перемотка к концу алгоритма "ролика" анимации | |__ Animation_background_play() - включение проигрывания алгоритма "фоновой" анимации (указатель мыши не меняется) | |__ Animation_background_stop() - выключение проигрывания алгоритма "фоновой" анимации | |__ Image - изображение (id, imagefile, id_location, x, y) | |__ Image_show() - включение отображения изображения | |__ Image_hide() - выключение отображения изображения | |__ Файлы изображений локаций (png, gif, jpg, bmp) |__ Файлы изображений фрагменты локаций (png, gif, jpg, bmp) |__ Файлы изображений предметов (png, gif, jpg, bmp) |__ Файлы изображений персонажей в разных ракурсах и движении (png, gif, jpg, bmp) |__ Файлы иконок и других изображений (png, gif, jpg, bmp) | |__ Иконка success | |__ Иконка denied | |__ Иконка information |__ Файлы музыки (mp3, wav) |__ Файлы звуков (mp3, wav) ГРАФИЧЕСКИЙ ИНТЕРФЕЙС | |__ Стартовое окно | |__ Отображение заставочного изображения на фоне | |__ Отображение графических кнопок (при наведении подсветка): Начать, Загрузить, Выйти | |__ Проигрывание музыкальной композиции (с повторением) | |__ Основное окно | |__ Отображение изображения локации на фоне | |__ Отображение изображений (фрагментов локации, персонажей, предметов) | |__ Проигрывание музыкальной композиции (с повторением) | |__ Отображение главной панели управления | |__ Отображение панели кармана предметов (рамка, контейнеры для предметов, иконки предметов, кнопки перемотки: Предыдущий, Следующий) | |__ Отображение графических кнопок (при наведении подсветка): Сохранить, Загрузить, Настройки, Выйти, О программе, Памятка | |__ Отображение счетчика набранных очков в игре (трехзначный) | |__ Отображение текстового индикатора времени суток (День, Ночь) | |__ Модальные окна | |__ Сохранение игры (список, поле имени, кнопки Сохранить, Отменить) | |__ Загрузка игры (список, кнопки Загрузить, Отменить) | |__ Настройки игры (громкость музыки, громкость звука, скорость анимации, кнопки Сохранить, Отменить) | |__ Памятка (список с иконками, кнопка Закрыть) | |__ О программе (версия программы, копирайты, лицензионное соглашение) | |__ При подведении указателя мыши к областям экрана, имеющим текстовое описание (hint), выводить всплывающую подсказку | |__ По нажатию правой кнопки мыши при выбранном предмете, выбор сбрасывается ПРИМЕЧАНИЕ: - в требованиях пока никак не отражено что графика должна поддерживать слои (задний, передний план) и исходя из этого отображаться - все файлы изображений должны быть недоступны для прямого просмотра из файловой системы (чтобы нельзя было увидеть все ролики не пройдя игру) Последний раз редактировалось smart_man, 13.08.2012 в 17:04. |
#2
|
||||
|
||||
Цитата:
|
#3
|
|||
|
|||
Цитата:
Тут все упирается в опыт и знание специфики среды разработки. То есть, если раньше не приходилось работать со звуком, то поиск решения действительно может обеспечить бессонные ночи Можно собрать с миру по нитке - кто-то знает как со звуком работать, кто-то с графикой и т.д. Я не против если несколько человек сделают по фрагменту. Главное чтобы код потом получилось собрать воедино Если в процессе нужно будет что-то додумать (детализировать) по ТЗ - алгоритм какой-нибудь продумать и т.д., то я это сделаю. Но это уже будет возможно только в процессе разработки, когда будет общение. У меня есть ощущение, что трудности могут возникнуть при работе со слоями графики (деление на передний и задний план). Надеюсь я ошибаюсь, просто с графикой в делфи я никогда не работал. Количество типов объектов можно сократить (объединив некоторые из них в единый). Это я просто для наглядности так все разбил. |
#4
|
||||
|
||||
Цитата:
Цитата:
|
#5
|
||||
|
||||
Цитата:
Если бы я делал квест, то использовал следующую схему с графикой, взаимодействие с предметами, переход между локациями): К каждой картинке, которая выводилась бы на экран, у меня хранилась маска к этой картинке. каждый цвет - это индекс на некое действие, или на некоторую локацию. Т.е. грубо говоря, считываешь цвет маски изображения и в зависимости от изображения выполняешь действие в соответствии с сценарием. Конечно же не обязательно делать маску именно цветовую, т.к. это будет слишком ресурсоемко, но тем не менее надеюсь мысль дойдет.. |
#6
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
||||
|
||||
Цитата:
|
#8
|
||||
|
||||
Для GDI достаточно иметь "прозрачный" цвет, выбираем любой. Для OpenGl - чёрный. С DirectX не работал.
OpenGL Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 13.08.2012 в 00:56. |
#9
|
|||
|
|||
Код:
ТИПЫ ДАННЫХ И ФУНКЦИИ К НИМ | |__ Location - локации (id, name, imagefile, walking_area, fg_start, алгоритм отображения локации) | |__ Location_change() - вызов смены локации | |__ Location_show() - включение отображения локации | |__ Location_hide() - выключение отображения локации ... |__ Item - предметы в игре (id, name, hint, imagefile, imagefile_icon, imagefile_face, x, y) | |__ Item_show() - включение отображения предмета | |__ Item_hide() - выключение отображения предмета | |__ Item_take() - взять предмет | |__ Item_talk() - вывод окна с лицом говорящего и текста сообщения (текст появляется буква за буквой, при нажатии текст сразу полностью рисуется) | |__ Item_click() - обработчик нажатия на предмет | |__ Item_hint_show() - включение отображения всплывающей при наведении подсказки | |__ Item_hint_hide() вообще такой формат дерева выглядит удобно, чем оно генерировалось? >woweook< |
#10
|
|||
|
|||
Цитата:
Хотелось бы сделать попроще в реализации. OpenGL и прочее связанное с 3D я даже не рассматривал. Под слоями я понимаю просто картинки (png и т.д.) кадров анимации, которые перемещаются по экрану, то скрываются, то показываются, и при этом какие-то отображаются поверх, а другие под другими. Вот и все слои. Надеюсь так возможно сделать. А то придется действительно попиксельно сканировать экран и перерисовывать области (но это не вариант конечно). Цитата:
Это объектное программирование, но только на логическом уровне =) Это имена функций (процедур) - вот и все. То есть мне НЕ надо чтобы в программе была реализация на классах. Просто есть данные которые хранятся в массивах и функции для работы с этими массивами. Нужно чтобы реализация была очень простая и под конкретную задачу. С Character.take(item) вы может и правы, если делать более универсально. Просто главный герой вроде как один, и карман для предметов один, поэтому не было необходимости так делать. Данное дерево генерировалось руками - собственный выработанный подход быстрого и внятного описания программы в целом Последний раз редактировалось smart_man, 13.08.2012 в 12:29. |
#11
|
|||
|
|||
то, что почти все они имеют аттрибут id, это 100% признак того, что это объект, +скорее всего в базе данных
чего не хватает, это правильного разделения полномочий между объектами, и надо убрать всё, что касается пользовательского интерфейса ~ show, hide, click итд, что бы засунуть их в бд, обычно достаточно определить отношения между объектами: has_one, has_many, belongs_to Цитата:
>woweook< |
#12
|
|||
|
|||
Цитата:
Не надо усложнения =) Все данные в игре заранее известны! Это не какая-то база, в которую пишутся данные на лету и т.д. Например, так можно описать предмет: data[item][1][name] = "apple"; data[item][1][hint] = "Это яблоко"; data[item][1][imagefile] = "apple.png"; data[item][1][imagefile_icon] = "apple_ico.png"; data[item][1][imagefile_face] = ""; data[item][1][x] = "25"; data[item][1][y] = "73"; (первая мерность обозначает тип данных, вторая ID, третья сами данные) |
#13
|
||||
|
||||
Цитата:
Код:
Data.Item[1].Name := 'apple'; Data.Item[1].Hint := 'Это яблоко'; ... |
#14
|
||||
|
||||
Судя по всех топиках выше, ТС и сам мог бы сделать движок, просто лень. Или я ошибаюсь? Просто, как на меня, все продумано вдоль и впоперек, на каждый элемент тз есть свой вариант решения. Но я бы не взялся (пугает кроссплатформенность (Я даже MacOS в глаза не видел ) (а где Линукс?), и отсутствие ООП, само собой - при таких условиях в коде погрузнешь на месяца два, не меньше).
|
#15
|
|||
|
|||
возможно даже так
Код:
Item[id]['name'] := 'apple'; Item[id, 'name'] := 'apple'; >woweook< Последний раз редактировалось Pyro, 13.08.2012 в 16:43. |