Игры на c builder 6. Создание двумерных игр при помощи Game API. Использование спрайтов для анимации персонажа

Для того, чтобы объединить объекты в один с помощью 3ds max, нужно для начала определиться, для какой цели это необходимо. Потому что есть несколько способов объединения и каждый из них имеет свои плюсы и свои минусы. 2 самых популярных способа:

  • Объединение в группу;
  • Объединение на полигональном уровне.

Группирование

Чтобы объединить 3d-объекты в группу, их необходимо выделить. Например, у нас есть столешница и 4 ножки (см.рис.ниже). Выделяем все эти объекты (1), получается 5 выделенных объектов. Затем переходим в Group (2), кликаем на команду группировать Group (3). Теперь нам осталось только дать имя нашей группе (4) и нажать OK. Напоминаем, что имя(название) группы лучше писать английскими буквами.

Открытие группы

Чтобы открыть группу на время, поработать с объектами внутри ее, нам достаточно выделить нашу группу Stol, кликнув по любому объекту группы. Например, по ножке или столешнице. Выделится вся группа. Теперь переходим вверху в Group и выбираем Open — открыть группу (3). Розовый контейнер вокруг группы показывает нам, что группа открыта.

Теперь можно редактировать любой объект внутри группы, а как закончим, то группу следует закрыть.

Закрытие группы

Для закрытия группы достаточно выделить любой объект группы, в том числе и розовый контейнер, и нажать Group — Close.

Уничтожение группы

Чтобы уничтожить группу, нужно выделить ее и нажать Group — Explode. Тогда группа разрушится и связи между объектами больше не будет. При необходимости объединения придется снова их группировать, как описано вначале.

Присоединение к группе нового объекта

Чтобы присоединить к группе новый объект, например, чайник, нужно выделить сам чайник, затем нажать Group — Attach. Потом кликнуть по закрытой группе Stol, либо, если группа открыта, то кликнуть по контейнеру группы. Все, готово! Чайник теперь присоединен к группе Stol и группа содержит уже 6 объектов.

Исключение объекта из группы

Чтобы исключить объект из группы, нужно открыть группу Group — Open, затем выделить объект, который хотим исключить, потом кликаем Group — Detach. Всё, объект исключен. Не забываем закрыть основную группу Group — Close .

Теперь рассмотрим объединение объектов на полигональном уровне.

Объединение на полигональном уровне

Этот метод применяется, если у нас есть 2 объекта, которые имеют цельную сетку и не сгруппированы. Цельная сетка — это значит, что при выделении этого объекта кликом и перемещении его, он не распадается на отдельные части, а перемещается весь. Пример: объект box . Этот объект - полигональная сетка, состоящая их 6 граней(полигонов), соединенных между собой 12-ю ребрами и 8-ю вершинами. Т.е. все грани относятся к одному объекту, и, если вы выделите одну грань, то выделится весь объект box. Но любую грань (полигон) можно отсоединить от основного объекта.

Для начала научимся отсоединять.

Отсоединение на полигональном уровне

Для этого нужно перейти в редактирование объекта на полигональном уровне (редактирование полигональной сетки). Сейчас наш box имеет только основные параметры (длина, ширина, высота, сегменты).

Чтобы получить возможность редактировать объект на полигональном уровне, нам необходимо преобразовать его в редактируемую полигональную сетку. Для этого на выделенном объекте нажимаем правую кнопку мыши и в контекстном меню выбираем внизу Convert to — Convert to Editable Poly.

Как мы видим, параметры нашего объекта справа поменялись. Теперь мы не видим там высоты, ширины, длины. Есть вершины, ребра, границы, полигоны, элементы. Это и есть наши подобъекты, с которыми теперь можно работать. Т.е. теперь мы можем выделить вершину(группу вершин) и перемещать их в любом направлении. Аналогично с ребрами и полигонами.

Но нам сейчас не это важно, а мы попробуем отсоединить полигон от основного объекта. Для этого переходим (см.рис.ниже) в режим редактирования полигонов (1) и выделяем полигон слева у нашего объекта box (2).

Теперь переместим панель прокруткой немного вниз до раздела Edit Geometry (см.рис.ниже). Затем нажимаем кнопку Detach (отсоединить). В появившемся окошке при необходимости даем имя отсоединяемому полигону(объекту), нажимаем OK. Готово! Теперь наш полигон стал независимым.

ВАЖНО! Не забываем выключить режим редактирования полигонов, иначе вы не сможете выделять другие объекты.

Сейчас мы можем перемещать отсоединенный полигон (кстати, он теперь уже отдельный объект) в любом направлении. К объекту box он не имеет никакого отношения.

Единственный момент: у него точка опоры (Pivot) смещена к центру box, что не очень хорошо. Как редактировать точку опоры Pivot, мы рассмотрим в другой статье.

А сейчас главное.

Присоединение нового объекта на полигональном уровне

Чтобы присоединить к одной полигональной сетке другую, нужно выделить первую, нажать в ее параметрах кнопку Attach и кликнуть по второй сетке(объекту). Все достаточно просто. Объекты теперь объединены в одну полигональную сетку. Напомним, что чайник является обычным стандартным объектом, пока вы не преобразуете его в редактируемую полигональную сетку (Editable Poly). Как это делается, мы рассматривали выше.

Вывод

Чаще используются, естественно, группы. Но помните, что группы внутри редактировать гораздо легче, чем полигональную сетку. Поэтому используйте первый способ, а со временем, когда набьете руку и станете профессионалами в своем деле, вы сами придете ко второму способу.

ОСТОРОЖНО! Концентрированная ностальгия! Описанное здесь морально устарело много-много лет назад. Более того, оно устарело до того, как было реализовано. Из статьи вы не узнаете ничего нового.
В давние-давние времена, когда Embarcadero CodeGear Borland Delphi RAD Studio C++ Builder был версии 4, когда Autodesk 3ds Max Discreet 3dsmax 3D Studio Max был версии 3, когда 80 Гб и 200 МГц были не в холодильниках, а в компьютерах, когда Интернет был неведомым и таинственным существом, каждое прикосновение к которому было магическим… я учился в старших классах школы и учился программировать. А также моделировать. И ещё всякое-разное по мелочи.
Подозрительный скриншот:

Папа был ментом-программистом (сейчас просто мент коп). И купил он комп - теоретически для подработок, но вертолётный завод как-то слишком резко усох, и комп использовался (по назначению) редко. Несколько раз наблюдал картину: всякие кнопочки, формочки, всякое-разное нажимается, а потом оно работает (был это C++ Builder). Глаза загорелись: это же круто - рисуешь кнопочки, а потом оно само что-то делает! Меня пустили формочки порисовать.
Однако возникла проблема: кнопочки рисуются, но вот что-то работать не хотят! Внезапно выяснилось, что в чудо-программе одним рисованием кнопки не задвигаются, нужно писать какой-то странный непонятный код. Мне сунули книжку по Билдеру. Внезавно выяснилось, что перед её прочтением весьма полезно хоть немного знать Си… Мне сунули книжку по Си.
Получилось странное: книжка по Си с программами, которые в Билдере нифига не работают (понятно, что запустить при умении можно, однако такого рода шаманствам я был необучен), и книжка по Билдеру, которая требует познаний в Плюсах (вот здесь класс, вот здесь метод, вот здесь заголовочный файл...). Но что-то начинало шевелиться. Перепечатывание кода из книжки - занятие не для слабонервных (это потом я уже узнал, что к книжке ещё диск полагался...), но жажда познания тащила. И самое интересное: в самом конце книжки по Билдеру была программа, работающая с графикой. Выводились спрайты! Цветные картинки, фигурно обрезанные, с анимацией! (Все, наверное, уже поняли, что за книжка у меня была - в те времена её кривой скан прилагался к каждому пиратскому диску с Билдером.)
Суть метода: берём картинку, будущую прозрачную область заполняем чёрным цветом, рядом располагаем маску: объект - чёрным, фон - белым. Выводим на канву сначала маску в режиме SrcAnd, потом картинку в режиме SrcPaint. Чтобы это всё не умерцалось, сначала рисуем всё в картинку в памяти, потом выводим на канву на форме. Был раскрыт секрет магии! И понеслось…

Battlecruiser

Краткая сводка:
Жанр: side-scroller
Графика: спёрта из StarCraft (юниты), спёрта из Motoracer (экран победы)
Звуки: спёрты шут знает откуда (у меня валялась куча звуков, выковырянных из игр)
Музыка: спёрта шут знает откуда (кто-нибудь знает, откуда мог взяться hitgm.mid?)
Используемый софт: C++ Builder, Sound Recorder, MS Paint


Скрин из игры:


Попробовал C++ Builder 6 - эта программа завелась! Правда в режиме совместимости со хрюшкой (старый TMediaPlayer накрывается медным тазом без режима совместимости). Несмотря на наличие подробной инструкции к каждому уровню, пройти толком не удалось… сложно.
Скачать игру Battlecruiser (770 KB, сорцы и исполняемый файл прилагаются, запускать в режиме совместимости)
Однако моим любимым жанром был RTS, поэтому довольно скоро я сел писать свою версию угадайте чего…

DeathCraft

Краткая сводка:
Жанр: real-time strategy
Графика: спёрта из StarCraft, нарисована самостоятельно
Звуки: спёрты шут знает откуда
Речь: записана своя
Музыка: спёрта шут знает откуда
Используемый софт: C++ Builder, 3D Studio Max, MS Paint, Sound Forge
В процессе написания игры я учился 3D-моделированию.
Знакомый скриншот?


Вы когда-нибудь пробовали пользоваться 3D Studio Max на Pentium 200 MHz, 32 MB RAM? Скажу я вам, процесс хорошо тренирует нервы. Студия только грузится минут 10-15… рендеринг самых простых моделек по минуте… рендеринг одного кадра космического полёта из прилагаемого примера минут по десять… некоторые вещи типа кисточки весов модификатора кожи просто подвешивали компьютер… Но! Можно рисовать крутые вещи!
Изначально к игрушке прилагался ролик-заставка с двумя роботами, идущими с дулами друг на друга. Перед тем, как показать почтенной публике, решил перерендерить видео, но его не нашёл. Нашёл сцену с другим роботом, примерно той же эпохи. Теперь на заставке этот робот.
Последний кадр анимации, пора жать Start.


Вы когда-нибудь пробовали пользоваться C++ Builder на Pentium 200 MHz, 32 MB RAM? Это, конечно, не 3D Studio Max, но компиляция элементарного проекта типа моего (хотя он тогда для меня казался совсем не элементарным) могла занимать под минуту.
C++ Builder 6 со старым проектом:


Вы когда-нибудь… а хотя не, Sound Forge на древних компах работал вполне себе шустро. Теперь к эффектам эха, ускорения, замедления, разворота из стандартной Sound Recorder добавились эффекты с непонятными названиями типа Flanger и Wah-wah. Звуки можно было нормально увязывать друг за дружкой. Звучало круто. Даже динозавр говорит моим голосом.
Давайте запустим:

Некоторые юниты выдернуты из StarCraft. Тогда я не знал, что графику можно выдёргивать кошерными способами, и пользовался старым-добрым Print Screen. И редактировал в MS Paint. Старался принтскринить в зимних локациях, чтобы пиксели было легче отковыривать. Вы спросите: MS Paint и 3D Studio Max - не странный ли наборчик? Странный. Однако откуда мне было знать про другие редакторы - про эти ваши интернеты я тогда и не слыхивал. Я ж ни одно решение загуглить не мог - или сам, или никак. Папа со своими базами данных в моих игрушках тоже ни в зуб ногой…
Некоторые юниты нарисованы в 3D Studio Max. Как и весь софт, брался он на «чеховском рынке» (казанская версия «горбушки»). Книжку мне родители купили. Туториал к программе страшный, ужасный, на английском и без исходников прилагался (или это уже в следующей версии было?..). Что-то наковырялось. В основном роботы.
В игре есть AI. Противник строит здания (по списку, располагает по кругу относительно командного центра), строит собирающие юниты (до лимита), строит атакующие юниты (до лимита), атакует игрока (при наборе минимума атакующих юнитов). AI никакой, в общем-то, но своё дело знает, и игрока выносит весьма эффективно.
Противник строит бараки всей охапкой SCV и тренирует подкрепление:


Алгоритм поиска пути отсутствует, юниты упираются в первое же препятствие, так что их лучше отправлять по диагонали - если все препятствия прямоугольные, то их можно будет обойти. Юниты имеют неприятную особенность слипаться в одну точку. Для юнитов игрока задаётся разброс, а вот комп иногда ходит одной неубиваемой стопкой (привет Civilization).
Роботы на защите родной базы:


Иногда эффекты рисовались на совесть, иногда было лень, и лепились графические примитивы.
Яичница:


Код… код ужасный. Если обычно программист видит свой код после пары лет и ужасается, то представьте, каково мне…
for(i=0;iCells.x/16+x].y/16+y]="0"; Boom[j].type=0; Boom[j].npic = (boomcount==1)?(0):(random(11)-10); } Building[i].alive=false; } if(Building[i].type==3){ int bx = (Building[i].x+Building[i].sqleft*16+Building[i].sqwidth*8)/16, by = (Building[i].y+Building[i].sqtop*16+Building[i].sqheight*8)/16, ux, uy; if(Building[i].atkunt==-1){ Building[i].atkpos=0; Building[i].npic=0; for(j=0;jBuilding[i].atkr|| Unit[j].player!=0||!Unit[j].alive||!Unit[j].visible){ Unit.atkunt].atked=false; Building[i].atkunt=-1; Building[i].atking=false; Building[i].atkpos=0; Building[i].npic=0; } } if(Building[i].atkunt!=-1){ Building[i].turn=-1; j=Building[i].atkunt; float x=Unit[j].x+Unit[j].centerx-Building[i].x-Building[i].sqleft*16- Building[i].sqwidth*8, y=Unit[j].y+Unit[j].centery-Building[i].y-Building[i].sqtop*16- Building[i].sqheight*8; int sval=41, lval=241, A=(y==0)?(99999999):(x/y*100); if(y==0)y=0.1; if(A>=-sval && A<=sval && y<=0) Building[i].turn=0.1; if(A>=-lval && A<=-sval && x>=0 && y<=0) Building[i].turn=1.1; if(abs(A)>=lval && x>=0) Building[i].turn=2.1; if(A>=sval && A<=lval && x>=0 && y>=0) Building[i].turn=3.1; if(A>=-sval && A<=sval && y>=0) Building[i].turn=4.1; if(A>=-lval && A<=-sval && x<=0 && y>=0) Building[i].turn=5.1; if(abs(A)>=lval && x<=0) Building[i].turn=6.1; if(A>=sval && A<=lval && x<=0 && y<=0) Building[i].turn=7.1; if(Building[i].turn<=-0.9&&Building[i].turn>=-1.1)Building[i].turn=0.1; } else{ Building[i].turn+=0.25; if((int)Building[i].turn>=8)Building[i].turn=0.1; Building[i].turn = int(Building[i].turn/0.25)*0.25; } if(Building[i].atking){ Building[i].atkpos++; if(Building[i].atkpos>=10) Building[i].atkpos=0; if(Building[i].atkpos==1||Building[i].atkpos==3||Building[i].atkpos==5){ sndPlaySound("Sound\\Special\\Atk1",SND_ASYNC+SND_NODEFAULT); j=Building[i].atkunt; Building[i].npic=1; Unit[j].hits-=Building[i].atkfrc; if(Unit[j].hits<=0){ Unit[j].hits=0; Unit[j].dying=true; } } else Building[i].npic=0; } } ...

И вот такая простыня - на две с лишним тысячи строк.

DeathCraft: инструкция

Юниты:

  • 0 SCV: собирает ресурсы, строит здания, производится в Command Center. И минералы, и газы добываются в Refinery.
  • 1 Vulture: боевой юнит противника, стреляет лазером, скоростной, производится в Barracks.
  • 2 Wraith: летающий юнит игрока, не атакует, летает, скоростной, производит высадку Dinosaur, производится в Barracks.
  • 3 Car: ничего не делающий юнит игрока.
  • 5 Robot: боевой юнит игрока, стрелят яичницей, медленный, производится в Barracks.
  • 6 Dinosaur: боевой юнит игрока, не атакует, мало жизней, при взрыве сносит к чертям все юниты в радиусе взрыва.

Здания:

  • 0 Command Center: производит SCV, сюда они носят добытые ресурсы.
  • 1 Refinery: место добычи ресурсов с помощью SCV.
  • 2 Barracks: место постройки боевых юнитов.
  • 3 Gun: боевое здание противника.

Управление мышью: выделение юнитов и зданий левым кликом, команда идти и атаковать правым кликом. Выделения области нет, но есть выделение всех юнитов выбранного типа на экране с помощью Ctrl.
Управление клавиатурой:

  • Стрелки: перемещение по карте
  • H: следование за выбранным юнитом
  • P: пауза
  • Delete: удаление юнита
  • C+U+F12: чит-код для создания юнита. Потом нужно ввести на нумпаде две цифры - код юнита и (опционально) две цифры - номер игрока. Например, C+U+F12, 0500 переключит в режим создания роботов игроку с помощью мыши. Чтобы отключить, снова нажать C+U+F12.

Подсказки:

  • Защищайте Refinery! В первую очередь противник будет сносить это здание.
  • Если не успели построить армию, а противник уже напал, то сброшенные с самолёта динозавры вас спасут.
  • Стройте много, стройте быстро.