Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.08.2012, 21:30
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию Помогите сделать движок квеста (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  
Старый 12.08.2012, 22:38
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от smart_man
Ниже привожу первую версию ТЗ (писал сам, специфика Delphi скорей всего не соблюдена):
На вид выглядит относительно просто, но достаточно начать и "привет бессонные ночи"...
Ответить с цитированием
  #3  
Старый 13.08.2012, 00:05
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
На вид выглядит относительно просто, но достаточно начать и "привет бессонные ночи"...

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

Можно собрать с миру по нитке - кто-то знает как со звуком работать, кто-то с графикой и т.д. Я не против если несколько человек сделают по фрагменту. Главное чтобы код потом получилось собрать воедино

Если в процессе нужно будет что-то додумать (детализировать) по ТЗ - алгоритм какой-нибудь продумать и т.д., то я это сделаю. Но это уже будет возможно только в процессе разработки, когда будет общение.

У меня есть ощущение, что трудности могут возникнуть при работе со слоями графики (деление на передний и задний план). Надеюсь я ошибаюсь, просто с графикой в делфи я никогда не работал.

Количество типов объектов можно сократить (объединив некоторые из них в единый). Это я просто для наглядности так все разбил.
Ответить с цитированием
  #4  
Старый 13.08.2012, 00:32
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от smart_man
Тут все упирается в опыт и знание специфики среды разработки. То есть, если раньше не приходилось работать со звуком, то поиск решения действительно может обеспечить бессонные ночи
Со звуком немного работал, правда давно. И насколько я знаю сейчас в играх часто используют библиотеку bass, правда я незнаю как это у них получается, ведь bass вроде для коммерческих игр вовсе не бесплатна. Покупают лицензию чтоли...

Цитата:
Сообщение от smart_man
У меня есть ощущение, что трудности могут возникнуть при работе со слоями графики (деление на передний и задний план). Надеюсь я ошибаюсь, просто с графикой в делфи я никогда не работал.
А графика в чём? Обычное GDI или OpenGL/DirectX? Потому что если второе, то там проблем со слоями просто быть не может - каждый кадр там рисуется заново и те спрайты которые были нарисованы первыми окажутся как бы на нижнем слое, накрытые спрайтами нарисованными последними. Т.е. просто достаточно в правильном порядке выводить спрайты.
Ответить с цитированием
  #5  
Старый 13.08.2012, 00:35
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от smart_man
У меня есть ощущение, что трудности могут возникнуть при работе со слоями графики (деление на передний и задний план). Надеюсь я ошибаюсь, просто с графикой в делфи я никогда не работал.

Если бы я делал квест, то использовал следующую схему с графикой, взаимодействие с предметами, переход между локациями):

К каждой картинке, которая выводилась бы на экран, у меня хранилась маска к этой картинке. каждый цвет - это индекс на некое действие, или на некоторую локацию. Т.е. грубо говоря, считываешь цвет маски изображения и в зависимости от изображения выполняешь действие в соответствии с сценарием.
Конечно же не обязательно делать маску именно цветовую, т.к. это будет слишком ресурсоемко, но тем не менее надеюсь мысль дойдет..
Ответить с цитированием
  #6  
Старый 13.08.2012, 00:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Pilot_Red
...К каждой картинке, которая выводилась бы на экран, у меня хранилась маска к этой картинке...
"Попахивает" 90-ми годами.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 13.08.2012, 00:41
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от angvelem
"Попахивает" 90-ми годами.
Нусс, это первая технология, которая мне пришла в голову, с радостью послушаю твою точку зрения
Ответить с цитированием
  #8  
Старый 13.08.2012, 00:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Для GDI достаточно иметь "прозрачный" цвет, выбираем любой. Для OpenGl - чёрный. С DirectX не работал.

OpenGL
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 13.08.2012 в 00:56.
Ответить с цитированием
  #9  
Старый 13.08.2012, 08:50
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Код:
ТИПЫ ДАННЫХ И ФУНКЦИИ К НИМ
  |
  |__ 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()
местами похоже на ооп, но тогда взять предмет скорее должно быть Character.take(item)

вообще такой формат дерева выглядит удобно, чем оно генерировалось?
__________________
>woweook<
Ответить с цитированием
  #10  
Старый 13.08.2012, 12:20
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
А графика в чём? Обычное GDI или OpenGL/DirectX? Потому что если второе, то там проблем со слоями просто быть не может - каждый кадр там рисуется заново и те спрайты которые были нарисованы первыми окажутся как бы на нижнем слое, накрытые спрайтами нарисованными последними. Т.е. просто достаточно в правильном порядке выводить спрайты.

Хотелось бы сделать попроще в реализации. OpenGL и прочее связанное с 3D я даже не рассматривал. Под слоями я понимаю просто картинки (png и т.д.) кадров анимации, которые перемещаются по экрану, то скрываются, то показываются, и при этом какие-то отображаются поверх, а другие под другими. Вот и все слои. Надеюсь так возможно сделать. А то придется действительно попиксельно сканировать экран и перерисовывать области (но это не вариант конечно).

Цитата:
Сообщение от Pyro
местами похоже на ооп, но тогда взять предмет скорее должно быть Character.take(item)

вообще такой формат дерева выглядит удобно, чем оно генерировалось?

Это объектное программирование, но только на логическом уровне =) Это имена функций (процедур) - вот и все. То есть мне НЕ надо чтобы в программе была реализация на классах. Просто есть данные которые хранятся в массивах и функции для работы с этими массивами. Нужно чтобы реализация была очень простая и под конкретную задачу.

С Character.take(item) вы может и правы, если делать более универсально. Просто главный герой вроде как один, и карман для предметов один, поэтому не было необходимости так делать.

Данное дерево генерировалось руками - собственный выработанный подход быстрого и внятного описания программы в целом

Последний раз редактировалось smart_man, 13.08.2012 в 12:29.
Ответить с цитированием
  #11  
Старый 13.08.2012, 15:02
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

то, что почти все они имеют аттрибут id, это 100% признак того, что это объект, +скорее всего в базе данных

чего не хватает, это правильного разделения полномочий между объектами, и надо убрать всё, что касается пользовательского интерфейса ~ show, hide, click итд,

что бы засунуть их в бд, обычно достаточно определить отношения между объектами: has_one, has_many, belongs_to

Цитата:
Просто главный герой вроде как один, и карман для предметов один
A good architecture maximizes the number of decisions *not* made (с)
__________________
>woweook<
Ответить с цитированием
  #12  
Старый 13.08.2012, 15:27
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
то, что почти все они имеют аттрибут id, это 100% признак того, что это объект, +скорее всего в базе данных

чего не хватает, это правильного разделения полномочий между объектами, и надо убрать всё, что касается пользовательского интерфейса ~ show, hide, click итд,

что бы засунуть их в бд, обычно достаточно определить отношения между объектами: has_one, has_many, belongs_to


A good architecture maximizes the number of decisions *not* made (с)

Не надо усложнения =) Все данные в игре заранее известны! Это не какая-то база, в которую пишутся данные на лету и т.д.

Например, так можно описать предмет:

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  
Старый 13.08.2012, 16:13
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от smart_man
Не надо усложнения =) Все данные в игре заранее известны! Это не какая-то база, в которую пишутся данные на лету и т.д.

Например, так можно описать предмет:

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, третья сами данные)
Это же типичные объекты
Код:
Data.Item[1].Name := 'apple';
Data.Item[1].Hint := 'Это яблоко';
...
Ответить с цитированием
  #14  
Старый 13.08.2012, 16:19
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Судя по всех топиках выше, ТС и сам мог бы сделать движок, просто лень. Или я ошибаюсь? Просто, как на меня, все продумано вдоль и впоперек, на каждый элемент тз есть свой вариант решения. Но я бы не взялся (пугает кроссплатформенность (Я даже MacOS в глаза не видел ) (а где Линукс?), и отсутствие ООП, само собой - при таких условиях в коде погрузнешь на месяца два, не меньше).
Ответить с цитированием
  #15  
Старый 13.08.2012, 16:23
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

возможно даже так
Код:
Item[id]['name'] := 'apple';
Item[id, 'name'] := 'apple';
__________________
>woweook<

Последний раз редактировалось Pyro, 13.08.2012 в 16:43.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter