Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 15.1. Секция определений WarEdit.
#define walls START 64 #define NUM_WALLS 24 #define DOORS START 128 #define NUM_DOORS 4 #define SCROLLS_START 144 #define NUM_SCROLLS 4 #define potions_START 160 #define NUM_POTIONS 4 #define foods_start 176 #define num_foods 2 #define MONSTERS_START 192 #define num_monsters 2 #define wall_STONE_1 (WALLS_START+0) // Пока только 6 #define WALL_STONE_2 (WALLS_START+1) #define WALL_STONE_3 (WALLS_START+2) #define WALL_STONE_4 (WALLS_START+3) #define WALL_STONE_5 (WALLS_START+4) #define WALL_STONE_6. (WALLS_START+5) #define NUM_STONE_WALLS 6 #define WALL_MELT_1 (WALLS_START+6) // Пока только 6 #define WALL_MELT_2 (WALL3_START+7) #define WALL_MELT_3 (WALLS_START+8) #define WALL_MELT_4 (WALLS_START+9) #define WALL_MELT__5 (WALLS_START+10) #define WALL_MELT_6 (WALLS__START+11) #define NUM_MELT_WALLS 6 #define WALL_OOZ_1 (WALLS_START+12) // Пока только 6 #define WALL_OOZ_2 (WALLS_START+13) #define WALL_OOZ_3 (WALLS_START+14) #define WALL_OOZ_4 (WALLS_START+15) #define WALL_OOZ_5 (WALLS_START+16) #define WALL_OOZ_6 (WALLS_START+17) #define NUM_OOZ_WALLS 6 #define WALL_ICE_1 (WALLS_START+18) // Пока только 6 #define WALL_ICE_2 (WALLS_START+19) #define WALL_ICE_3 (WALLS_START+20) #define WALL_ICE_4 (WALLS_START+21) #define WALL_ICE_5 (WALLS_START+22) #define WALL_ICE_6 (WALLS_START+23) #define NUM_ICE_WALLS б #define DOORS_1 (DOORS_START+0) // Пока только 4 #define DOORS_2 (DOORS_START+1) #define DOORS_3 (DOORS_START+2) #define DOORS_4 (DOORS_START+3) #define SCROLLS_1 (SCROLLS_START+0) // Пока только 4 #define SCROLLS_2 (SCROLLS_START+1) #define SCROLLS_3 (SCROLLS_START+2) #define SCROLLS_4 (SCROLLS_START+3) #define РОТIONS_1 (POTIONS_START+0) // Пока только 4 #define POTIONS_2 (POTIONS_START+1) #define POTIONS_3 (POTIONS_START+2) #define POTIONS_4 (POTIONS_START+3) #define FOODS_1 (FOODS_START+0) // Пока только 2 #define FOODS_2 (FOODS_START+1) #define MONSTERS_1 (MONSTERS_START+0) // Пока только 2 #define MONSTERS_2 (MONSTERS_START+1) #define GAME_START 255 // точка, из которой игрок Как можно видеть из Листинга 15.1, для каждой текстуры или объекта игрового пространства выделен некоторый диапазон значений. К примеру, все стены будут кодироваться числами от 64 до 127. В данный момент существует только 64 стены, но я оставил в программе место еще для 64 стен. Такой же подход применен и для определения всех остальных игровых объектов, так что структуру данных можно улучшить без особого труда. Когда вы рисуете карту игрового поля, то в действительности заполняете базу данных. Она представляет собой длинный массив, по способу доступа напоминающий двухмерную матрицу. Когда массив построен и уровень закончен, мы должны как-то сохранить данные. Для этого предусмотрены кнопки LOAD и SAVE. При нажатии одной из них, появляется диалоговое окно, запрашивающее подтверждение команды. Если вы выбрали YES, с помощью стандартной функции fopen() открывается файл, после чего данные сохраняются в файле или загружаются из файла. Но предварительно нужно ввести имя файла, используя строчный редактор. Этот редактор мне пришлось сделать самостоятельно. Он очень прост и понимает только алфавитно-цифровые клавиши. Примечание Мне пришлось написать такой редактор самостоятельно, поскольку единственный способ ввода строки, предлагаемый языком Си - это функция scanf (). Однако использование этой функции чревато неприятностями: при наборе возможны ошибки, текст может выйти за границы диалогового окна и т. д.
Давайте поговорим о диалоговом окне, о котором я только что упоминал. Оно представляет собой PCX-файл с двумя нарисованными кнопками. Хотя кнопки, конечно же, являются обычными картинками, я точно знаю их расположение относительно левого верхнего угла. Все, что мне нужно сделать, это доверить, находится ли мышь над кнопкой и щелкнули ли вы мышью. Для осуществления этого теста я создал универсальную функцию, которой нужно передать следующие параметры: § Размер каждой кнопки; § Количество кнопок в столбце и строке; § Местоположение первой кнопки; § Расстояние между кнопками. Эта функция будет определять, какая из кнопок нажата. (Вспомните, не существует легкого пути для получения подобных вещей. Мы все должны сделать собственноручно. У нас нет приличного менеджера окон и механизма посылающего нам сообщения при нажатии кнопок. Хотя вы можете попробовать написать его сами, поскольку в мои планы это не входит.) В Листинге 15.2 показана функция, которая обнаруживает нажатие кнопок.
|