DiNGS – программирование игр в домашних условиях. Часть 3.
АрхивПрограммазм (архив)Практика и примеры.
Для начала определимся, что за игру мы хотим написать. С одной стороны, если есть желание создать игру, в которой бита будет отбивать шарик – это конечно здорово, но вряд ли кто усидит за ней более 5 минут. Поэтому немаловажное значение имеет изюминка. Это может быть потрясающий научно-фантастический сюжет или расширенные возможности, множество призов, красочные уровни, нелинейность прохождения. Возможно, вы сразу захотите создать платформенный шедевр в духе Super Mario или Sonic – ничего в этом невероятного нет. Сложность создания данных игр примерно одинакова. Все зависит от задумки. Единственное, что хотелось бы сказать – начинать нужно с малого, постепенно добавляя навороты. Пересмотрев не одну тысячу игр с различных игровых систем я сделал вывод, что всегда вторая часть превосходит первую в плане графики и возможностей, что и не удивительно – программист-художник имея опыт создания всегда желает улучшить свое творение. Поэтому даже если первая версия вашей игры не внушит вам восторга – это значит только что все еще впереди.
После некоторых размышлений я пришел к выводу, что начать учится программированию можно даже, казалось бы, с такой простой игры, как Пинг Понг. Она понятна для объяснения начинающим и содержит многие нюансы и тонкости программирования игр. Кому этого может показаться мало, я всегда могу продолжить данную статью с описанием программирования платформенных или бет’ем’ар игр в духе «Golden Axe», «Street of Rage» или «Donkey Kong Country».
Итак, Пинг Понг.
Две биты с разных сторон экрана отбивают мяч, летящий по некоей траектории. Бита пропустившая мяч проигрывает (теряет жизнь, очки и тд). Казалось бы, банальность, но все можно преобразить! Подключим воображение! Игра против человека или компьютера, разнообразные уровни и графика. Ужасные босы. Призовые уровни дающие возможность заработать немного виртуальных денег. Призы. Различная сила отбива ракеткой-битой (вплоть до разрушения вражеской , если та не защищена … например защитным полем (!). Магазины с покупкой в них различных приспособлений (усилителей удара, ускорителей перемещения, защитных полей, жизней, обманных траекторий мяча и т.д.) Уникальные музыкальные темы. Высокое разрешение, графические эффекты – прозрачность, вращение, скалинг!!! Вот здесь уже высока вероятность оставить непередаваемое ощущение у играющего и желание возвращаться снова и снова к пройденным уровням. Такова и есть написанная мной Ping Pong Deluxe (Gold), которая к моменту, когда вы дочитаете статью и напишите свой первый игровой шедевр будет доступна для закачивания с sourceforge.net и мы сможем сравнить результаты.
Игра состоит у нас пока из 2-х бит и шарика, который мы будем отбивать. Следовательно, наш путь лежит в любой графический редактор имеющий достаточно функций для наших целей (GIMP, Photoshop и т.д).
Нарисовать биту я думаю, не составит труда у большинства читающих – но как не трудно заметить – вокруг биты осталось свободное фоновое пространство. Нам необходимо сделать его прозрачным для DiNGS. Для этого залейте его цветом R:255, G:0; B:128.
Немаловажно 2 фактора – картинка должна остаться в RGB (иметь не менее 65000 цветов), а не в индексированной палитре и иметь формат bmp. А также стороны должны быть кратны, и делится друг на друга. Например, соотношение сторон картинки 32х96 правильно (делится без остатка) и будет корректно отражено (это все из-за тонкостей использования OpenGL спрятанного под командами DiNGS). А вот 80х60 будет отображен неправильно (иметь мусор на картинке), т.к. стороны не делятся без остатка.
Итак, мы нарисовали 2 биты и шарик. Что же, пора заняться программированием. Запустим редактор DiNGS- editor. Перед нами синее окно, в верхней части которого расположились пункты – открыть файл, сохранить файл, компилировать файл и запустить исходник на выполнение. Тонкость заключается в том, что прежде чем запустить исходник – его необходимо превратить в exe-файл, т.е. скомпилировать. Начинаем программировать. Зайдем в меню редактора Dings – file->new или щелкнем на иконке с изображением чистого листа. Перед нами лист, в который мы будет набивать исходник программы.
ЗАДАЧА 1.
Вывести спрайт (картинку) ракетки-биты на экран. Теоретически можно бы было дать команду считывающую изображение с диска и отображающую ее на экран монитора. Но если наш объект двигается, то команда все время будет считывать объект с диска, чтобы отобразить его в новых координатах , что приведет просто к фатальному падению производительности. Поэтому так уже давно никто не пишет. Самый стандартный метод – загрузить спрайт(ы) в память , а потом уже молниеносно выводить его из памяти на экран. В DiNGS для этого предусмотрены 2 команды.
LOADSPRITE "картинка", num
Где «картинка» - это спрайт в формате bmp (например «bita.bmp»), а num – номер по которому спрайт будет хранится в памяти. По этому номеру мы сможем получить доступ к спрайту для вывода его на экран. Нумерация осуществляется от 0 и так далее.
Пример использования команды (загрузим спрайт bita.bmp в память под номером 0, загрузим спрайт шар – ball.bmp в память под номером 1 и тд):
LOADSPRITE "bita.bmp", 0 LOADSPRITE "ball.bmp", 1
Итак, мы загрузили спрайты в память, но чтобы увидеть их необходимо вывести спрайты на экран. Для этого используется команда DiNGS:
SPRITE num, x, y, a
Где num – номер по которому мы помещали спрайт в память (у нас 0 – это бита (см. выше, а 1 - шар)).
X – координата спрайта на экране по оси Х.
Y – координата спрайта на экране по оси Y.
A – степень прозрачности (!!!) спрайта. Может быть от -100 до +100!
Например, разрешение нашей игры будет 640х480, а мы хотим вывести спрайт шара в центр экрана, тогда соответственно половина от ширины 640 будет 320 , а половина от высоты 240.
Пример использования команды SPRITE (вывод спрайта на экран):
SPRITE 0, 200,350,0 SPRITE 1, 320,240,-50Первая команда выводит спрайт №0 , а это у нас бита на экран в координаты 200 по Х и 350 по Y с прозрачностью 0 (то есть отсутствующей).
Вторая команда выводит спрайт №1 , а это у нас шар в середину экрана в координаты 320 по Х и 240 по Y с прозрачностью - 50 (то есть шар полупрозрачен!).
Остался последний штрих. Даже если вы все написали как было описано выше – вы ничего не увидите! Для этого необходимо дать команду SHOWSCREEN – что значит «показать».
Вот текст первой нашей программы:
LOADSPRITE "bita.bmp", 0 LOADSPRITE "ball.bmp", 1 SPRITE 0, 200,350,0 SPRITE 1, 320,240,-50 SHOWSCREEN MOUSEWAIT END
Сохраним ее на диске, зайдя в пункт меню File -> Save As и в открывшемся окошке дав нашей программе имя, например – game. Файл автоматически получит расширение SRC – game.src - что является стандартным расширением для программ на языке Dings, как programm.cpp – для Cи++ или programm.pas для Pascal. Теперь зайдем в пункт меню Project -> Options и выберем разрешение для игры (в нашем случае 640х480) и поставим галку Full Screen – отображение игры во весь экран.
Нажмем F8 чтобы скомпилировать программу (превратить в машинные коды).
Нажмем F5 чтобы выполнить скомпилированную программу.
Если вы сделали все в точности, как описано выше вы увидите на экране биту и шарик.
Щелкните кнопкой мышки чтобы завершить программу. Еще раз приведем текст нашей будущей игры с комментариями:
LOADSPRITE "bita.bmp", 0 // загрузить картинку биты в ячейку № 0 LOADSPRITE "ball.bmp", 1 // загрузить спрайт шара в ячейку № 1 SPRITE 0, 200,350,0 // вывести спрайт биты в координаты 200,350 SPRITE 1, 320,240,-50 // вывести шар в координаты 320,240 полупрозрачным SHOWSCREEN // Показать все на экране монитора MOUSEWAIT // Ждать щелчка мыши END // Конец программы
Если не указать команду MOUSEWAIT , то программа выведет картинки на экран и завершится, причем все произойдет с такой скоростью, что вы ничего не увидите. Здесь же мы загружаем спрайты в память командой LOADSPRITE, выводим их в нужные координаты командой SPRITE и показываем на экране командой SHOWSCREEN после чего ждем нажатия мыши MOUSEWAIT.
Подсказка: часто чтобы вывести какой-то объект в центр экрана создают 2 переменных max_X и maxY и присваивают им максимальные значения экрана – 640 и 480. Вывод же спрайта в середину экрана будет иметь вид SPRITE 1, max_X/2, max_Y/2,-50 , что избавляет программиста от необходимости высчитывать сколько будет 640/2. Это конечно примитивный случай, но в игре могут использоваться очень серьезные вычисления, и такой подход существенно облегчит ваш труд.
Первый результат получен, но впереди самое интересное. Давайте заставим двигаться игровые объекты!
(продолжение следует)