- Урри! Урри! Где у него кнопка?
(«Приключения Электроника»)
Напомним, что в прошлом номере мы начали наш новый проект - «Игра своими руками». Начиная с июньского выпуска, на компакт-диске «Лучших компьютерных игр» публикуются свежие версии пакета для создания игр, написанного специально для нашего журнала - ЛКИ-Creator, работающего с Delphi 5-7 версий.
В прошлом номере мы с вами убедились, что при помощи этого пакета за одно занятие вполне реально научиться делать несложные игры-аркады. Однако внимательные читатели, приславшие нам немало писем, обратили внимание на нехватку некоторых весьма полезных механизмов: например, поддержки мыши, реализованных через DirectX кнопок и так далее. Второе занятие мы посвятим как раз работе с этими механизмами.
Ну, а материалы нашего прошлого занятия вы можете найти на нашем компакт-диске, в специально созданном для этой цели разделе «Игра своими руками».
Подготовка к работе
Перед началом работы нам потребуется переустановить пакет ЛКИ-Creator. Дело в том, что по сравнению с прошлым разом в него внесено немало изменений и дополнений.
(Надеюсь, что Delphi у вас уже установлен; если нет, то рекомендации на эту тему читайте в нашей предыдущей статье - в июньском номере журнала или на CD этого номера или на сайте.)
Возьмите с нашего компакт-диска (раздел «Игра своими руками») файл с текстами программ и картинками и распакуйте его в каталог проектов.
Теперь вы можете скачать нужные файлы отсюда.
У нас должно получиться три подкаталога. В одном - Units - хранятся библиотеки DirectX и модули пакета ЛКИ-Creator. В другом - Project - мы будем работать; туда заблаговременно положены картинки, которые нам понадобятся, и предыдущая версия нашей аркады. В третьем - Escort - готовая программа, которая должна у нас получиться.
Теперь установим (переустановим) ЛКИ-Creator. В меню Delphi откройте пункт Component, в нем выберите Install Component. Если у вас уже был установлен этот пакет, оставайтесь на закладке Into existing package, иначе перейдите на закладку Into new package и заполните пустые строчки, как показано на рисунке (в верхней строчке проще всего выбрать файл LKI2dEngine.pas с помощью кнопки Browse, а в нижней просто запишите LKI). После чего нажмите OK и выберите Install. В верхней панели Delphi у вас должна появиться закладка LKI.
Теперь осталось только загрузить наш проект. В меню File выбираем Open, открываем файл Project\StarEscort.dpr…
Кнопки, значки, текстовые строки
Тем, кому уже приходилось работать в Delphi или, скажем, в Visual Basic, наверняка недостает возможности одним щелчком мыши, как обычно, поставить на наш игровой экран кнопки и другие визуальные элементы. Конечно, никто не запрещает поместить кнопки сбоку от DirectX-ового окна (пока мы работаем в оконном режиме), но это - не самое красивое решение, и к тому же непонятно, как оно будет работать, когда мы перейдем в full screen (я уж не говорю - в 3D).
Это важно: расставляя визуальные элементы по экрану, ставьте их так, чтобы их координаты не были равны 0.
Наш пакет, конечно, не может похвастаться таким разнообразием визуальных элементов управления, зато они все работают и в двумерном, и в трехмерном (который будет представлен вашему вниманию вскорости) движках.
Итак…
Значок - TLKIStatic
Помнится, мы хотели в прошлый раз дать нашему кораблику несколько жизней, и отображать, сколько их осталось, в виде значков-корабликов (как это было принято в старинных аркадах и до сих пор популярно в играх для мобильных телефонов). Для этого нам пригодится визуальный компонент TLKIStatic: он просто отображает на экране в заданном месте (в отличие от спрайтов) некую картинку, и все, что с ним можно делать во время работы игры - это убирать или возвращать обратно. Зато при подготовке его можно настроить - выбрать положение, размеры, картинку, прозрачность.
Это интересно: большинство других управляющих элементов - кнопки, тексты - потомки этого класса (что такое "потомок" - смотрите в микроучебнике Delphi на нашем диске). Поэтому все то, что вы научитесь делать с TLKIStatic, пригодится вам и в работе с остальными классами, описанными в этой главе.
Покрасьте панель движка в доминирующий цвет вашей игры - и сможете еще при проектировании оценить, как будет выглядеть интерфейс. |
Итак, открываем наш проект, на котором уже стоит экземпляр класса TLKI2dEngine - DirectX'овое двумерное окно. В закладке LKI у нас теперь есть, помимо самого движка, элементы TLKIStatic, TLKIButton, TLKIEdit и TLKIText. Поставим на панель DirectX три экземпляра TLKIStatic (в предположении, что мы собираемся дать нашему кораблику три запасных "жизни") и, отредактировав у каждого из них свойство Picture, загрузим туда кораблик из ShipMini.bmp. Включим свойство AutoSize, чтобы объект занял правильные размеры.
Мы можем работать с этими элементами так же, как и обычно в Delphi работают с визуальными компонентами: двигать их как угодно (но не вздумайте поставить их за пределами панели TLKI2dEngine), менять размеры, ставить произвольную картинку. Другими словами, все средства визуального проектирования, привычные тем, кто работал в Delphi или, скажем, Visual Basic - при нас.
Это важно: самое ценное, что все эти возможности остаются при нас, даже если мы проектируем полноэкранное приложение. Главное, чтобы размер окна TLKI2dEngine соответствовал тому разрешению экрана, которое мы намерены установить.
В длинном списке свойств объекта мы найдем три важных для нас пункта: IsVisible. Это свойство определяет, показывать ли в данный момент рисунок или же нет. Его можно переключать непосредственно при работе программы.
Это важно: у объекта есть также унаследованное от его предков свойство Visible, но им пользоваться нельзя. Дело в том, что оно определяет, надо ли рисовать объект средствами WinAPI, а не DirectX, и потому наш движок автоматически отключит его. Нам не нужен конфликт между разными типами рисования в одном и том же окне! Transparent. Это свойство определяет, есть ли у нашего объекта прозрачная часть. Мы хотим, чтобы отображался только значок кораблика, но не фон - поэтому мы включаем его. TransColor. Если Transparent включен, то это свойство определяет, какой именно цвет считать прозрачным. Если же выключен - то это свойство не задействуется.
Это интересно: если вы внимательно читали предыдущую нашу статью, то помните, что у обычных спрайтов прозрачный цвет определяется как цвет верхней левой точки. У интерфейсных элементов делать так оказалось неудобным - они часто окружены цветной рамкой.
Итак, включааем прозрачность, ставим прозрачным черный цвет, запускаем программу и убеждаемся, что все работает…
Обратите внимание, что положение значков на экране не зависит от сдвига экранных координат: куда бы мы не летали, значки застынут в тех же точках, в которые мы их поместили.
Это интересно: менять картинку в процессе работы приложения можно, но только при посредстве специальной процедуры ChangePic (ее параметр - имя файла либо объект типа TBitmap). Однако использовать это для анимации не следует из-за низкого быстродействия. Если же вы хотите изредка менять изображение - эта процедура будет вам в самый раз. Кроме того, учтите, что размеры новой картинки должны строго совпадать со старыми.
Добавляем несколько жизней
Чтобы эти значки не просто рисовались на экране, а имели какой-то смысл, нам осталось сделать совсем немного.
Во-первых, создадим целочисленную глобальную переменную Lives и в самом начале, при создании формы, приравняем ее 3. Далее, всякий раз, когда у нашего кораблика кончаются хиты, снимем одну жизнь, сделаем проверку на наличие оставшихся жизней, и, если у нас их осталось меньше 0 (все запасные кончились, и свою последнюю мы потеряли) - переходим к имевшейся ранее процедуре завершения игры. А если нет - возвращаем хиты на максимум и убираем один из значков запасных жизней. Как это делается, показано на врезке «Запасные жизни».
Запасные жизни
// Убит наш корабль
if Objects.ID = 1 then
begin
Dec(Lives);
// Проверяем, есть ли запасные жизни
if Lives