Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2008, 18:35   #141
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 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/.
Вложения
Тип файла: rar Бл-схема4.rar (118.3 Кб, 14 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 27.08.2008, 18:37   #142
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 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), но здесь
разобран детально почти каждый шаг процедуры анализа состояния уровня после каждого хода. Эео основная процедура программы, именно на ней основана вся Игра.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 27.08.2008, 18:43   #143
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию добавление...

Чего-то таблица блоков не получилась - исчезли пробелы и все непонятно.См. таблицу во вложении.
Вложения
Тип файла: rar Табл..rar (3.1 Кб, 14 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 28.08.2008, 17:54   #144
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию И еще о движении персонажей

Еще один принцип простого движения героя.На этот раз без математики. Персонаж, в принципе "шагает" на месте, а движется фон, здесь, загруженный из .bmp.По мере сдвига фона за пределы экрана
подзагружается следующий фрагмент фона (или повторяется).Так что "шагать " можно бесконечно. "Стрелка вниз" - останавливает движение, "вверх" - вознобновляет.
Вложения
Тип файла: rar Puh_move.rar (140.9 Кб, 23 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 28.08.2008, 19:47   #145
GreenDan
Никто
Пользователь
 
Аватар для GreenDan
 
Регистрация: 25.08.2008
Сообщений: 28
По умолчанию

Можете объяснить что за код написан в проекте если можно подробно.
Я тот же самый Манжосов Денис.
GreenDan вне форума Ответить с цитированием
Старый 29.08.2008, 01:01   #146
CyberOrcX
Заблокирован
Форумчанин
 
Регистрация: 27.04.2008
Сообщений: 103
Сообщение

можете изучать по-другому?
т.е. начать игру с каркаса - показать исходник проекта до добавления иных объектов.
исходник проекта может быть таким:
Код:
unit Igra;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;  //необходимое для проекта

type
  TGame = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

//тут объекты игры

var
  Form1: TForm1;
  //тут нужные переменные

implementation

{$R *.dfm}

//тут создание объектов

end.
или можно сделать отдельный unit без формы, где будет написано создание всех окружающих объектов.

а то я смотрю, ниче не понимаю в этих бл.схемах, таблах, и др.
подумайте над этим.
извините. если что не так. это мое ИМХО.
CyberOrcX вне форума Ответить с цитированием
Старый 29.08.2008, 09:25   #147
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 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 клавишами"стрелка вниз" , "стрелка вверх" мы
останавливаем \ запускаем таймер, тем самым останавливая или включая
движение.
Здесь на простом примере показан принцип построения движения.Он
подходит для разных аркад, гонок и т.п.
Если принцип сдвига фона сочетать с масштабированием перспективы, то получается очень реалистичное движение.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 29.08.2008, 09:44   #148
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

To KyberOrcX
Цитата:
а то я смотрю, ниче не понимаю в этих бл.схемах, таблах, и др.
Умение использовать блок-схемы - это очень важно для программиста.
Правильно сотавленная блок-схема - это половина успеха проекта.Вы
уже ясно видите перед собой алгоритм программы, цели и задачи.Это и есть основное исскуство программирования.А уж реализация алгоритма
возможна любыми методами с применением любого языка.Язык - это всего лишь инструмент программирования.Ведь не напрасно же профи
применяют наряду с высокоуровневыми языками и assembler и API,GDI.
Т.е. используют различные инструменты для решения задач программирования.
По вопросу постепенного создания проекта - хорошая идея.Думаю, следует открыть новую тему для этого и попробовать создать коолективный проект.Для этого надо бы сначала определиться :
1. Жанр игры.
2. Сценарий.
3. Персонажи.
4. Место действия.
5. Атрибуты.
ну и еще много чего.
Так что давайте, если есть желающие попробуем.Особенно полезно будет для начинающих.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 29.08.2008, 12:39   #149
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 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.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 29.08.2008, 12:50   #150
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 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 возвращаются на
прежнюю позицию.
Вот в принципе и ВСЕ.
Если внимательно прочитать весь материал, то можно понять принцип
построения конкретной программы довольно детально.
Полная версия игры существует, если есть спрос - выложу.Есть также
все выше приведенные пояснения в виде файла.Кого интересует - спрашивайте.
Напоследок: я тут в программку с Винни-Пухом пчел добавил.Кому интересно- посмотрите во вложении.
Вложения
Тип файла: rar Puh+_move.rar (147.6 Кб, 21 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Калькулятор в 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