|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.08.2008, 18:35 | #141 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Едем дальше по Куртану...
Между прочим, все рассуждения здесь, простые примеры с тригонометрией - это и есть начальные основы строения игр.
Теперь даллее разбираем игру Куртан. После команды «Загрузить» мы переходим в блок-схему 2 : если Игра еще не была сохранена (файлы Index или Data отсутствуют) - переход к NewGame с исходными параметрами переменных или же при сохраненной Игре переход к GameSklad c сохраненными параметрами переменных. И опять после прохождения программы по блок-схеме 2 программа оказывается в procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Далее два варианта: 1. Нажимаем клавиши клавиатуры – задействовано 6 клавиш в процедуре KeyDown : -- PgUp (код 33) - переход к следующему уровню - процедура NextSklad ; -- PgDown (код 34) - переход к предыдущему уровню - процедура PrevierSklad ; -- стрелка «Влево»(код 37); -- стрелка «Вверх» (код 38); -- стрелка «Вправо» (код 39); -- стрелка «Вниз» (код 40); последние четыре клавиши - управление движением Грузчика. 2. Нажимаем кнопки МЕНЮ формы ( или же соответствующие горячие клавиши) : ___________________________________ ___________________________________ ______________________ МЕНЮ Подменю Горячие Действие Процедура клавиши программы ___________________________________ ___________________________________ ______________________ ИГРА -- Новая Игра Сtrl + N Начало Игры с 1-го уровня NewGameClick -- Загрузить Ctrl + L Загрузить сохраненную Игру LoadClick -- Сохранить Ctrl + S Сохранить Игру Save Click -- Выход F 9 Закрыть приложение ExitClick Управление -- Уровень сначала F 5 Игра сначала на текущ. уровне ReStartClick -- Перейти к следующ. PgUp Переход на след. уровень NextClick -- Перейти к предыдущ. PgDown Переход на пред. уровень PrevierClick -- Отмена хода Delete Отмена последнего хода DelClick Показать (не работает – в перспективе ввести показ прохождения уровня) N5Click Помощь -- Правила F 1 (не работает – в перспективе HELP) InfoClick -- О Программе -- Краткие сведения о программе AboutClick Пункт 2 рассмотрим позже. Пункт 1 - событие по нажатию клавиши procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); case Key of 33 34 - переходы на следующий / предыдущий уровни по соответствующим процедурам NextSklad / PrevierSklad. Аналогично все происходит и при нажатии кнопок меню Form 4 –«Перейти к следующему» -- NextClick NextSklad и «Перейти к предыдущему» -- PrevierClick / PrevierSklad/.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
27.08.2008, 18:37 | #142 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
продолжение...
Следующие четыре клавиши ( 37, 38, 39, 40) непосредственное управление движением Грузчика.
Здесь присваиваем значения параметрам следующим переменным : -- flag_G - номер вида Грузчика. Всего по четыре на каждое направление – два без сундука и два с сундуком. -- ax, ay - приращение координат ( - 50, 0, 50) при совершении хода ; -- bx, by - приращение координат ( - 10, 0, 10) при движении Грузчика ; -- cx, cy - приращение к индексу блоков при анализе возможностей хода ; После нажатия клавиши эти параметры передаются в процедуру Dvig. Процедура Dvig , по сути, это примитивный ‘движок’ , чисто на базе Pascal . Обеспечивает основную работу программы. Перед разбором процедуры Dvig уточним некоторые нюансы: - при выводе окна игры последним у нас выводится Gruz, поэтому он привязан к основным координатам X и Y. - напомню, что все глобальные переменные по умолчанию имеют значение = 0, если только им не присвоено другое значение при объявлении. Локально же объявленные переменные неопределенны и поэтому их, по необходимости, следует инициализировать в начале методов ( а то компилятор частенько ‘ругается’). - каждый блок (или сегмент) игрового поля имеет свой «индекс» : Kirp - 1; Pust - 2; Sund - 3; SundM - 4; Mesto - 5 ; Resh - 6; Door - 7; Все индексы блоков находятся в текущем массиве mas . Считываем соответствующие элементы массива (читай индексы) ,соседние с Gruz в выбранном направлении и сравниваем их. - индексы самого массива для элементов массива ( надеюсь я не сильно запутал вас?Индексы блоков это одно , а индексы массива - другое) вычисляем по координатам блоков mas[((y+80) div 50)-1,(x div 50)-4] при x:=200; y:= -30; mas [(( -30 + 80) div 50) -1,(200 div 50)-1] соответвтвует mas [0, 0] , т. е. первый (нулевой) элемент массива . И если mas [0, 0] = 1 , то это значит, что левый верхний блок Kirp. - и последнее, в начале процедуры Dvig видим метку Label OutPD ( выход из процедуры движение) – это значит, что будет применяться оператор GOTO.По поводу данного оператора: почти все учебники считают применение его признаком дурного тона. Но анализ состояния здесь состоит из сложной цепи условных операторов IF THEN и выход в нужный момент из процедуры организовать по другому не представляется возможным. Чем и определено применение GOTO. После нажатия клавиши выбора направления очередного шага, блок , где находится Gruz назовем предыдущим. Он может принимать два значения Pust или Mesto . Блок, куда перейдем - следующий. Может быть любым из семи значений. Если следующий Sund или SundM, т. е. мы их будем передвигать, то необходимо рассмотреть значение следующего за Sund / SundM блока. Назовем его последующий. Предыдущий Следующий Последующий блок блок блок ---------------- -------------------- | Pusto |-------------------| Kirp | | Mesto |-------------------| Pusto | ------------------ ----------------- | Sund |-------------| Kirp | | SundM |-------------| Pusto | | Mesto | | Sund | | Resh | | SundM | | Door | | Mesto | -------------------- | Resh | | Door | ------------------- Работу программы в этой процедуре Dvig можно разбить на две части : а) -- реализация события KeyDown – один шаг движения ; б) -- обработка результатов шагов ; Смотрим блок-схему 4 (4.1 … 4.4) - первая часть а). Тем, кто хочет досконально разобраться в принципе построения Игры, советую детально разобрать блок-схему 4.Она хоть и получилась длинновата ( т.к. пришлось вырисовывать ее в формате А4), но здесь разобран детально почти каждый шаг процедуры анализа состояния уровня после каждого хода. Эео основная процедура программы, именно на ней основана вся Игра.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
27.08.2008, 18:43 | #143 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
добавление...
Чего-то таблица блоков не получилась - исчезли пробелы и все непонятно.См. таблицу во вложении.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
28.08.2008, 17:54 | #144 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
И еще о движении персонажей
Еще один принцип простого движения героя.На этот раз без математики. Персонаж, в принципе "шагает" на месте, а движется фон, здесь, загруженный из .bmp.По мере сдвига фона за пределы экрана
подзагружается следующий фрагмент фона (или повторяется).Так что "шагать " можно бесконечно. "Стрелка вниз" - останавливает движение, "вверх" - вознобновляет.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
28.08.2008, 19:47 | #145 |
Никто
Пользователь
Регистрация: 25.08.2008
Сообщений: 28
|
Можете объяснить что за код написан в проекте если можно подробно.
Я тот же самый Манжосов Денис. |
29.08.2008, 01:01 | #146 |
Заблокирован
Форумчанин
Регистрация: 27.04.2008
Сообщений: 103
|
можете изучать по-другому?
т.е. начать игру с каркаса - показать исходник проекта до добавления иных объектов. исходник проекта может быть таким: Код:
а то я смотрю, ниче не понимаю в этих бл.схемах, таблах, и др. подумайте над этим. извините. если что не так. это мое ИМХО. |
29.08.2008, 09:25 | #147 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Объясню программу Puh_move подробней.
Объявляем буферы Fon1,Fon2,Puh,Tree,Tree1,Kust - для загрузок рисунков соответственно -фон1,фон2,Винни-Пух, два дерева и куст. X и Y -координаты экрана, i и j - вспомогательные переменные. В процедуре PuhH(n: byte); строим буфер для рисунка, загружаем сам рисунок (верней один их 4-х рисунков последовательно на каждом такте срабатывания таймера для сщздания иллюзии движения). Делаем рисунок прозрачным (свойство Transparent - true) и выводим на форму (на экран).Освобождаем буфер для следующего рис. В процедуре FormActivate все то же самое для фона и дополнительных рисунков фона. В обработчике таймера сначала загружаем Фон1 с левого верх. угла экрана ( коорд. - 0,0).Ширина рисунков Фон1 и Фон2 950 pixels.Поэтому Фон2 выводим в координаты 950, 0.Выводим первый рис. Винни, а затем дополнительные кусты и деревья.Т.о. они у нас будут на переднем плане и при движении Винни будет проходить ЗА деревьями. Далее сдвигаем координату Х на еденицу влево (за экран) и увеличиваем переменную i на 1. i входит в аргумент процедуры PuhH и поэтому при каждом следующем срабатывании таймера выводится снова сдвинутые Фон1,Фон2 и дополн. деревья и следующий рис. Винни, но на одном и том же месте. Когда Фон1 и Фон2 сдвинутся влево на 949 пикселей , координате Х присваиваем значение 0 и меняем значение j .Перед этим Фон2 оказался уже в координатах 0,0 и поэтому следующий раз выводится сначала Фон2 в точке 0,0 а затем Фон1 в координатах 950,0 . И так далее . В обработчике KeyDown клавишами"стрелка вниз" , "стрелка вверх" мы останавливаем \ запускаем таймер, тем самым останавливая или включая движение. Здесь на простом примере показан принцип построения движения.Он подходит для разных аркад, гонок и т.п. Если принцип сдвига фона сочетать с масштабированием перспективы, то получается очень реалистичное движение.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
29.08.2008, 09:44 | #148 | |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
To KyberOrcX
Цитата:
Правильно сотавленная блок-схема - это половина успеха проекта.Вы уже ясно видите перед собой алгоритм программы, цели и задачи.Это и есть основное исскуство программирования.А уж реализация алгоритма возможна любыми методами с применением любого языка.Язык - это всего лишь инструмент программирования.Ведь не напрасно же профи применяют наряду с высокоуровневыми языками и assembler и API,GDI. Т.е. используют различные инструменты для решения задач программирования. По вопросу постепенного создания проекта - хорошая идея.Думаю, следует открыть новую тему для этого и попробовать создать коолективный проект.Для этого надо бы сначала определиться : 1. Жанр игры. 2. Сценарий. 3. Персонажи. 4. Место действия. 5. Атрибуты. ну и еще много чего. Так что давайте, если есть желающие попробуем.Особенно полезно будет для начинающих.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
|
29.08.2008, 12:39 | #149 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Продолжаем разбор игры Куртан
Вторая часть б) содержит процесс обработки результатов после каждого шага.
Здесь мы встретим две новые процедуры : KeyANDPit - процедура выводящая через определенное значение шагов ( находятся в процедуре KoordSklad) ключей (stepK) и питания (stepP). Ключи и питание доступно в течении 30 шагов после появления , а затем исчезают. Процедура NewGo применяется при переходах между уровнями и при операции Undo в процедуре MDelClick. В NewGo обнуляются некоторые флаги и переменные подсчета, а затем программа переводится опять к процессу загрузки через процедуру GameSklad (см. блок-схему 2). Обработка результатов: 1. Inc(step) - увеличиваем на 1 количество шагов и выводим их на индикатор. 2. Через каждые 10 шагов увеличиваем «уровень жизни» на 1 Inc(live_level) и отнимаем от максимального значения 100. Т.о. через 1000 шагов индикатор «уровня жизни» опустится до 0. Пока это ничего не значит, а в перспективе хотелось к чему то это привязать. Например - Game over ! При подборе питания индикатор восстанавливается до максимального значения. 3. Процедура вывода ключей и питания KeyANDPit - я уже говорил о ней. 4. Ключи. Когда появляется ключ ( Данные по каждому уровню - через какое кол-во шагов stepK и координаты вывода xK , yK беруться из KoordSklad) и координаты Gruz совпадают с координатами ключа, то количество ключей key_count увеличивается на 1. 5. Питание. Аналогично ключам, только при совпадении координат воостанавлтвается индикатор « уровня жизни». 6. Условия для открытия дверей Door. На четырех уровнях есть двери, которые открываются при определенном количестве установленных сундуков sundM. При достижении переменной sundM заданного значения устанавливается флаг flag_door = 1. 7. Склад собран. Когда на уровне все сундуки установлены на свои места sundM = sund, вызывается процедура SkladSobran и на карте уровней этот уровень выделяется зеленым фоном. В массив индексов карт вместо 0 записывается номер склада. 8. Переходы. С каждого уровня есть переходы на соседние. Данный участок кода обеспечи- вает корректные переходы между складами. Case sklad of // используем оператор выбора по № текущего склада 1: begin if x = 200 then // мы в переходе на 2 склад begin sklad := 2; // новое соответствующее значение переменной № склада xGG := 850; yGG := 470; // координаты Gruz, где он появится на складе №2 flag_load := 2; // по значению этого флага при построении нового // 2 -го склада координаты вывода Gruz будут браться не // из KoordSklad или с сохраненных данных (data.txt), и из // значений xGG и yGG. NewGo; // процедура перехода к процедуре построения нового уровня // GameSklad end; Все. Конец части б) процедуры Dvig и конец самой процедуры Dvig.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
29.08.2008, 12:50 | #150 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
продолжение
Теперь осталось только рассмотреть работу программы по событиям после нажатия кнопок
Меню Form 4. ___________________________________ ___________________________________ ______________________ МЕНЮ Подменю Горячие Действие Процедура клавиши программы ___________________________________ ___________________________________ ______________________ ИГРА -- Новая Игра Сtrl + N Начало Игры с 1-го уровня NewGameClick -- Загрузить Ctrl + L Загрузить сохраненную Игру LoadClick -- Сохранить Ctrl + S Сохранить Игру Save Click -- Выход F 9 Закрыть приложение ExitClick Управление -- Уровень сначала F 5 Игра сначала на текущ. уровне ReStartClick -- Перейти к следующ. PgUp Переход на след. уровень NextClick -- Перейти к предыдущ. PgDown Переход на пред. уровень PrevierClick -- Отмена хода Delete Отмена последнего хода DelClick 1. ИГРА - Новая Игра Обнуляются некоторые флаги и переменные подсчета, а затем программа переводится опять к процессу загрузки новой Игры через процедуру NewGame (см. блок-схему 2). 2. ИГРА - Загрузить - мы уже рассмотрели выше. 3. ИГРА - Сохранить Последовательно вызываются через процедуру SaveGame процедуры WriteIndex и WriteData. Первая записывает в текстовом файле mem_ index.txt ИндБ всех уровней в виде матриц, а вторая - значения переменных и массив индексов сегментов карты уровней в файл mem_data.txt. Файлы index и data создаются автоматически в папке с проектом и обновляются при каждом новом сохранении. 4. ИГРА - Выход Нажатие клавиши F 9 (Выход) - процедура ExitClick - закрывает все приложение. 5. Управление - Уровень сначала Процедура ReStartClick - начинает игру сначала на текущем уровне - > NewGo -> GameSklad. 6. Управление - Перейти к следующему и Перейти к предыдущему (PgUp и PgDown) мы уже разбирали. 7. Управление - Отмена хода В процессе игры клавишей Delete можно отменить только один , последний, ход. Процедура DelClick. Данные об ИндБ хранятся в массиве undo_mas и при отмене хода переписываются в массив текущих значений mas , а координаты Gruz возвращаются на прежнюю позицию. Вот в принципе и ВСЕ. Если внимательно прочитать весь материал, то можно понять принцип построения конкретной программы довольно детально. Полная версия игры существует, если есть спрос - выложу.Есть также все выше приведенные пояснения в виде файла.Кого интересует - спрашивайте. Напоследок: я тут в программку с Винни-Пухом пчел добавил.Кому интересно- посмотрите во вложении.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
"Калькулятор в Delphi" в теоретические аспекты??? | jenja | Общие вопросы Delphi | 1 | 25.05.2008 23:23 |
основные цели и задачи студенческого форума? | ALEXBAZ | Свободное общение | 1 | 14.05.2008 22:24 |
комп. для программирования | фамил | Компьютерное железо | 4 | 09.05.2008 12:11 |
Неделя программирования | Stiker | Свободное общение | 2 | 10.02.2008 21:15 |