Как сделать игру на blitz3d

games maker Все о создании игр и не только

15 февраля 2010 в 19:55

Итак, мы уже достаточно вооружены, чтобы сделать простенькую игру, так что хватит абстрактных примеров, а начнём уже делать игры, а то, что мы ещё не изучили, узнаем в самом процессе, по мере надобности…

Что это будет за игра? Сделаем такой вариант игры, которую делали в основах по BlitzBasic`у, только трёхмерный. Там у нас будет шарик, который будет ездить по плоскости, собирать, допустим, жёлтые кубики, и умирать от столкновения с красными… короче, сюжет стандартный…

Начнём с того, что создадим шарик игрока и его управление… (ну и камеру со светом):

Итак, всё просто – есть шарик, который ездит где-то внизу и поворачивается… вот только одно меня здесь смущает – не понятно, куда этот шарик повёрнут – он везде круглый, не видно, где перед, где … гм… это… зад. У меня вот такое решение этого вопроса – что если сделать у него такой мини хвост – как у капли или метеора? Т.е. здесь просто бы подошёл конус. Можно, конечно, сделать ещё один объект – как раз конус и просто сделать привязку к шару, но привязки полезны, когда нам нужно обязательно 2 различных объекта, а не один, или, например, если привязка через некоторое время должна пропасть… здесь же нам желателен объект, представляющий из себя цельный меш. Можно сделать модельку в 3ДМаксе, конечно, а потом её сюда загрузить, вот только зачем забивать лишнее дисковое пространство на модельки… которые мы сами можем сделать в самом Блитце! Как? Очень просто – присоединив к мешу шара меш конуса!

Вот как мы поступим (после создания шара):

Здесь мы создаём конус по имени Plac, вертим его там и по всякому подгоняем. Так как после создания шар будет стоять в точке 0,0,0 – конус будет ровно подогнан к нему – можете запустить и посмотреть… Вот только если вы будете этот шар двигать, конус останется на месте (естественно ). Итак, как я уже говорил, можно этот конус привязать (особой разницы не будет), но всё таки основываясь на программерскую этику, сделаем из них один объект (у нас есть возможность, да и зачем нам 2 объекта вместо одного).

Эта команда добавляет один меш к другому… то есть в данном случае мы добавляем меш конуса к мешу шара. НО! При этом сам объект конуса не исчезает (то есть мы этот конус как бы добавляем копированием). Короче, теперь у нас 2 меша – шар присоединённый к конусу, и сам конус, который нам сейчас не нужен. Поэтому (опять новая команда) мы его уберём:

Эта команда убирает заданный объект (в данном случае конус) и (самое главное) очищает от него память. Когда будете делать большие игры, где будет много уровней, при выходе из одного из них, не забывайте очищать ненужные объекты, иначе они будут копиться и занимать память, которая (L) не резиновая, в результате всё будет тормозить после определённого времени «играния»…

Дальше… не будет же этот шарик просто так ездить по полю! Надо создать ему определенные препятствия. Создадим-ка мы кубики, и разбросаем их по нашему будущему полю:

Здесь мы, как вы видите, создаём массив на 30 элементов, и затем расставляем в них кубики. А сами кубики раскидываем в случайном порядке по полю.

Так… кубики есть… столкновения нету… вывод: надо вставить сюда наш коллизион детекшн, который мы так старательно изучали в прошлой главе!

Сначала мы должны определить 2 константы для наших объектов – для шарика и для кубиков:

Вставьте эту строчку после инициализации графики – т.е. в начало… так типы есть, осталось только указать что шар и кубики к ним принадлежат:

Эту строчку поставьте после создания самого объекта шарика- т.е. после присоединения к нему конуса…

А эту вставьте в конец цикла создания кубиков (После команды PositionEntity Walls(i)…)

Так, типы задали, конечно, но сталкиваться они всё равно не будут – пока мы прямо не укажем, что они, мол, сталкиваться должны.

Здесь мы задали, что TypePlayer – который у нас является шаром должен сталкиваться с TypeWalls – т.е. с кубиками, соприкасаясь методом сфера к полигону, полностью скользя по нему. Можно последнюю цифру заменить на 1 – тогда шарик будет как бы «прилипать» к кубикам. Эту строчку поставьте после создания всех кубиков…

Хочу сразу заметить: (из своего опыта) команды Collisions нужно ставить одной из последних – т.е. сначала нужно инициализировать все предметы, затем их все расставить по местам, и только ПОТОМ обозначать коллизии между ними… можно, конечно сразу задать константы, и все столкновения между этими константами, но потом, когда вы будете создавать объекты, помните, что создаются-то они все в одной точке – 0,0,0 и получается, что находятся друг в друге, и затем, когда мы будем их расставлять, могут появиться баги – т.е. мы скажем объекту, типа, «Поставься в точку 0,10,100», а он окажется в точке 0,8,70 (или типа того), и можно долго ругаться, вспоминая его материнские отношения … либо в таком случае нужно делать так: создавать объекты, и тут же их переставлять в новые места… но, по-моему то как я предложил – лучше. (Scaven никогда не обманывает!)

Но уже что-то вырисовывается!

По традиции – полный код всего этого безобразия:

Источник

Создать игру, Конструкторы игр, Игровые движки, Разработка игр, Игровые ресурсы

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3dКак сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

10 Лучших пользователей

/—>

Партнеры сайта
.

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3dКак сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

Примеры ЛОЖНЫХ условий:
10 = 11, 51 = 20, 0 <> 0, = ”Стоп!”, = <> (*)

Синтаксис условия IF-THEN:
IF условие THEN
….
эти операторы выполняются, когда условие ИСТИННО
….
ELSE
….
эти операторы выполняются, когда условие ЛОЖНО
….
END IF

Примеры:
Принцип действия этих примеров стоит разъяснить дословно.
IF Power > 10 THEN (*)
PRINT «Перегрузка!”
ELSE
PRINT «Все в порядке!”
END IF

Можно записать и так:
IF Power > 10 THEN PRINT «Перегрузка!” ELSE PRINT «Все в порядке!” (*)

ELSE можно и не включать:
IF Points >= 5 THEN PRINT «Великолепно!” (*)

Программа, проверяющая пароль (10 мин)
Password$ = INPUT$(«Введите пароль:”)
IF Password$ = THEN
PRINT «Пароль правильный!”
PRINT «Добро пожаловать в систему!”
ELSE
PRINT «Пароль неправильный. Вход воспрещен.”
END IF
WAITKEY

Программа, проверяющая, больше ли пятидесяти введенное число (10 мин)
A = INPUT$(«Введите число:”)
IF A > 50 THEN
PRINT «Число больше ELSE
PRINT «Число не больше END IF
WAITKEY

Бесконечные циклы (5 мин)
Цикл, выполняющийся бесконечно много раз легко организовать с помощью команд REPEAT-FOREVER:
REPEAT
PRINT «Это будет повторяться бесконечно!”
FOREVER

Циклы этого типа понадобятся в дальнейшем для осуществления бесконечного повторения опроса клавиатуры и визуализации трехмерной сцены в соответствии с изменениями параметров трехмерных объектов.
Остановка программы
Как же теперь остановить программу? Для этого нужно нажать на кнопку с крестом в правом верхнем углу окна.
Команда EXIT (10 мин)
Выходом из этого цикла (и из других тоже) служит команда EXIT:
Данная команда в дальнейшем будет использоваться для осуществления выхода из бесконечного цикла и завершения программы при нажатии клавиши «Esc».
Пример:
A = 1
REPEAT
A = A * 2
PRINT A
IF A > 500 THEN
PRINT «Слишком много!”
EXIT
END IF
FOREVER
WAITKEY

Управление камерой с клавиатуры (25 мин)
Следующее условие ИСТИННО в том случае, если в данный момент нажата определенная клавиша и ЛОЖНО, если она не нажата.
IF KEYGET (scancode) THEN

на следующие:
Задаем начальные значения углов:
xa = 0
ya = 0

Устанавливаем углы поворота камеры:
ROTATEENTITY cam, xa, ya, 0

Визуализируем трехмерный мир:
RENDERWORLD
FLIP
FOREVER

Примеры использования функций:
B = INT (A#), X = X + RAND(-1, 1) (*)
X = R * Cos (Ang#), R = SQR (X * X + Y * Y) (*)

Игра «Угадай число» (25 мин)
Эта программа использует большинство структур, изученных ранее и будет хорошим закрепляющим материалом.
Эта строка для того, чтобы каждый раз не загадывалось одно и то же число:
SEEDRND MILLISECS()

Компьютер загадывает число:
N = RAND (1, 100)

Бесконечный цикл, чтобы игрок мог пытаться угадывать число несколько раз:
REPEAT
Играющий вводит число:
I = INPUT$(«Угадай число:”)
IF I = N THEN

Играющий угадал число, поздравляем его с победой и выходим:
PRINT «Поздравляю! Вы выиграли!”
EXIT
END IF
IF I > N THEN

Число больше задуманного:
PRINT «Это число слишком велико”
ELSE

Число меньше задуманного:
PRINT «Это число слишком мало”
END IF
FOREVER
WAITKEY

Задание: изменить программу так, чтобы у играющего было только 8 попыток, количество попыток выводилось на экран и при их исчерпании выводилось сообщение о проигрыше (10 мин)
Задание может вызвать трудности у некоторых учащихся, поэтому стоит помочь им наводящими вопросами. Ученики, имеющие опыт в программировании, скорее всего, смогут справиться с заданием самостоятельно.
Введем следующие строки программы после REPEAT:
Увеличиваем счетчик попыток:
Tries = Tries + 1
If Tries > 8 THEN

Если попыток больше восьми, то выходим с сообщением о проигрыше:
PRINT исчерпали количество попыток. Вы проиграли.”
PRINT число было + N
EXIT
END IF

Выводим количество попыток на экран:
PRINT «Попытка номер + Tries

Группирование объектов (10 мин)
Настало время поговорить о дополнительном параметре «род». Этот параметр задает «родительский» объект для данного. Когда «родительский» объект трансформируется (поворачивается, перемещается, масштабируется), с ним также трансформируются и все его «дети». Для группировки объектов, удобно сначала создать «пустой» объект с помощью следующей команды:
piv = CREATEPIVOT()

Этот объект не отображается на экране, но имеет все параметры трехмерного объекта (координаты, углы поворота, масштаб). Затем, «привяжем» все части объекта к пустому, указав при их создании параметр «род» = piv.
Этот прием, в сущности, позволяет оперировать объектами, которые являются частями более масштабного объекта, как одним целым, используя один адрес. Манипулирование всеми этими объектами по отдельности было бы крайне затруднительно и объем программы заметно увеличился бы.
Есть еще одна полезная команда, копирующая объект:
новый_объект = COPYENTITY(копируемый_объект)

А эта команда позволяет создать массу объектов, идентичных созданному. Причем, при изменении исходного объекта, меняются и все его копии.
Программа, выводящая на экран лес из уже созданных елок (25 мин)
Эта программа наглядно демонстрирует копирование и группирование объектов
Загрузим файл с елкой «fir.bb» и создадим пустой объект (после камеры и света):
fir = CREATEPIVOT()

Добавим в каждый оператор создания объекта созданный «родительский» объект, заменим, например
c1 = CREATECONE(20, 1)

на
c1 = CREATECONE(20, 1, fir)

Затем, создадим цикл (перед командой RENDERWORLD):
FOR x = 1 TO 50
fir2 = COPYENTITY(fir)
POSITIONENTITY fir2, RND(-120, 120), 0, RND(-120, 120)
NEXT

Итак, программа:
GRAPHICS3D 640,480

fir = CREATEPIVOT()
c1 = CREATECONE(20, 1, fir)
SCALEENTITY c1, 5, 5, 5
Rnd(-120, 120), 0, Rnd(1, 240)
NEXT

Также, текстуру можно масштабировать командой:
SCALETEXTURE текстура, SX, SY

Программа «Лес на траве» (10 мин)
Воспользуемся старой программой и добавим строки создания плоскости перед командой CREATEPIVOT):
Cоздаем плоскость:
ground = CREATEPLANE()

Загружаем текстуру:
grass = LOADTEXTURE(«C:\media\grass.jpg»)

Увеличиваем текстуру в 50 раз:
SCALETEXTURE grass, 50, 50

Но на зеркало нельзя наложить текстуру, поэтому для создания зеркальной поверхности мы должны применить такой прием: установить прозрачность затекстурированной плоскости и создать на ее месте зеркало.
Программа «Зеркальная земля»
Добавьте следующие строки после недавно введенных команд:
Делаем плоскость земли полупрозрачной:
ENTITYALPHA ground, 0.5

Создаем зеркало:
mirror = CREATEMIRROR()

ENTITYTEXTURE cyl, wood
Трехмерные модели (2.5 мин)
Blitz3D позволяет загружать трехмерные модели, сделанные в 3D-редакторах. Поддерживаются форматы «X», «3DS», «B3D». Модель загружается командой:
a = LOADMESH(файл)

Затем можно работать с ней, как с обычным трехмерным объектом. Часто модели уже оттекстурированы и имеют ссылки на файлы текстур, применять к таким моделям команду ENTITYTEXTURE не стоит.
Наведение камеры на объект (2.5 мин)
Навести камеру на объект можно так:
POINTENTITY камера, объект

В принципе, можно навести любой объект на любой другой.
Управление объектом с клавиатуры (17.5 мин)
Загрузим модель робота с помощью команды:
robot = LOADMESH(«C:\MEDIA\running.3ds»)

Изменим размеры модели:
SCALEENTITY robot, 0.4, 0.4, 0.4

Создадим бесконечный цикл, команды для изменения положения робота и условия, изменяющие координаты при нажатии соответствующих клавиш:
REPEAT

Наводим камеру на робота:
POINTENTITY cam, robot

Если нажата клавиша «вверх», перемещаем робота на вектор с длиной 0.5 под углом ang:
IF KEYDOWN(200) THEN
rx# = rx# + COS(ang) * 0.5
rz# = rz# + SIN(ang) * 0.5
END IF

Выходим, если нажата клавиша ESC:
IF KEYDOWN (1) THEN EXIT

RENDERWORLD
FLIP
FOREVER
Анимация (7.5 мин)
Этот и следующий разделы довольно сложны для восприятия и главным образом направлены на демонстрацию возможностей языка.
Также, можно загрузить анимированную модель:
a = LOADANIMMESH(файл)

Каждый такой файл содержит одну последовательность фаз движения (скажем, бег или прыжок). Можно наложить на этот же объект еще одну последовательность фаз с помощью команды:
a = LOADANIMSEQ(объект, файл)

Чтобы анимировать модель, нужно задать параметры анимации с помощью команды:
ANIMATE объект [,режим] [,скорость] [,последовательность] [,количество промежуточных фаз]

rx# = 10
rz# = 0
ang = 90

Прибавляем к переменной ry# приращение:
ry# = ry# + dy#

Источник

Как сделать игру на blitz3d

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

Пара слов о функциях
Функциями в языке программирования называют слова, которые выполняют какое-либо действие. Зачастую, чтобы упростить структуру программы в Blitz3D, программисты пишут собственные функции. Вам тоже придется этим заниматься.

AppTitle «MY FIRST GAME»
Graphics3D 800,600,32,2

AppTitle «MY FIRST GAME»
Graphics3D 800,600,32,2

UpdateWorld
RenderWorld
Flip
Until Keydown(1)

А после установки графического режима допишите строчку:

UpdateWorld
RenderWorld
Flip
Until KeyDown(1)
End

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

Волшебные функции
Теперь добавим в текст программы три функции: (если кто не понял, то, что написано черным, в Blitz3D писать не надо, это мои комментарии. Если вы додумаетесь написать мои комментарии в программе, то она не запустится).

AppTitle «MY FIRST GAME»
Graphics3D 800,600,32,2
SetBuffer BackBuffer()

UpdateWorld
RenderWorld
Flip
Until KeyDown(1)
End

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

Функция PositionEntity перемещает объект относительно мировой системы координат.

Теперь это будет выглядеть так:

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

Collision Detection
Теперь самое сложное, но самое необходимое… Коллизии!
Для начала необходимо создать два переменные коллизий: коллизионный тип игрока и коллизионный тип мира (в нашей упрощенной до невозможности игре только одно взаимодействие – разницы между стеной, полом и потолком не будет).
Для этого в главном файле перед функциями создания игрока и мира объявим две глобальные переменные (надеюсь, вы знаете, что такое переменные?)
Global playerT=1
Global wallT=2
Глобальные переменные значат то, что их можно использовать во всей программе. Есть еще и локальные переменные (Local), которые можно использовать лишь в пределах одного цикла или одной функции.

Теперь надо присвоить эти коллизионные типы нашим объектам. Сразу после строчки создания сферы пишем:
EntityType player,playerT
Аналогично для плоскости:
EntityType plane,wallT
Теперь остается только объявить коллизии.
В конце функции Create_player() пишем строчку:
Collisions playerT,wallT,2,3
Это означает, что объект с типом коллизии PlayerT будет взаимодействовать с объектом с типом коллизии WallT по принципу sphere-to-polygon (за это отвечает двойка) с дальнейшим скольжением первого обьекта относительно второго (за это отвечает тройка). Это сложно, надо просто понять и запомнить.

Теперь наша сфера не сможет пройти сквозь плоскость, в чем мы сейчас и убедимся – пора писать функцию Update(), отвечающую за обновление игрового мира. Для начала надо сделать глобальными обьекты камеры и игрока.

Для этого в начале главного файла (где объявляли типы коллизий) пишем:
Global player,camera
Также нам нужно объявить глобальными переменные, отвечающие за перемещение игрока:
Global x_speed#,y_speed#,z_speed#
Эти три переменные – значения скорости игрока по всем трем осям. Решетка после них означает, что они – переменные с плавающей точкой (Float), короче говоря, дробные.
Теперь настало время написать функцию Update()
Она и будет отвечать за перемещение нашего героя по плоскости.

y_speed#=y_speed#-0.01 – эта строчка отвечает за гравитацию. Переменная скорости объекта по оси У будет немного уменьшаться при каждом выполнении функции.
If y_speed#750 then MoveMouse 400,300
If MouseX()550 then MoveMouse 400,300
If MouseY()80 Then crot#=80
If crot#

Тут должно быть все понятно. Функция RotateEntity – тоже самое, что и PositionEntity, только с вращением вместо передвижения.

Посмотрите вниз. Не знаю, как у вас, но у меня видно сферу-игрока. Нам нужно убрать ее, при этом не убрав коллизии. Есть функция HideEntity, но она не подойдет (попробуйте, сами поймете почему). Остается сделать ее прозрачной. Для этого сразу после создания сферы вставьте строку:

Теперь сферу не видно. Эта функция задает прозрачность объекта (от 0 до 1). Попробуйте сделать прозрачность 0.5 и посмотрите, что будет.
Для полного счастья осталось сделать только прыжок.
Для начала обьявите глобальной логическую переменную nojump:

Смысл: если nojump – истина, то игрок может совершить прыжок, если ложь – то не может. Нетрудно догадаться, что ложью эта переменная будет тогда, когда игрок не касается пола – чтобы он не смог улететь при прыжке.
Затем добавьте в функцию Update() следующий кусок кода:

If KeyHit(57) – если щелкнута (одиночное нажатие) клавиша пробел
If nojump=True – и если прыжок возможен
y_speed#=0.2 – скорость игрока по Y равна 0.2
EndIf
EndIf

Вот и все, основа игрового движка закончена. Теперь я обещал показать, как экспортировать архитектуру из 3D MAX’a.

Для начала посмотрим, какие текстуры вы будете использовать в вашем домике. Я выбрал две стандартные текстуры из 3D MAX’a. Эти текстуры надо поместить в папку Media. Туда же мы будем экспортировать домик. Учить основам 3D MAX’a я вас не буду, поэтому смотрите сразу, что у меня получилось:

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

Потом экспортируем модель дома в формате *.3ds (файл-экспорт). Самое важное – не снимайте галочку с пункта Preserve Max Texture Coordinates. Теперь в функции Create_world() пишем строчки:

house=LoadMesh(«media\house.3ds»)
PositionEntity house,10,-19,0
ScaleEntity house,1,1,1
EntityType house,wallT

Строчки Positionentity и ScaleEntity здесь подходит только для моего случая – так как у вас могли получится дома других размеров. Позиционируйте и масштабируйте дом так, чтобы он находился на земле и был приличных размеров.
Вот что получится:

Как сделать игру на blitz3d. Смотреть фото Как сделать игру на blitz3d. Смотреть картинку Как сделать игру на blitz3d. Картинка про Как сделать игру на blitz3d. Фото Как сделать игру на blitz3d

Отныне в дом можно войти, побегать в нем и выйти наружу. Вот почему я говорил, что текстуры и модели должны храниться в одном месте – текстуры автоматически «натянутся» на объект.
Кстати, добавьте в функцию создания игрока строку:
EntityRaduis player,1.5
И посмотрите, что изменилось – теперь вы не будете видеть сквозь стены, если упретесь в них. Попробуйте в этом же файле с моделью дома сделать еще домов, небольшую улицу…
Вот вы и создали свою первую эээ… игру. Конечно, это еще не игра, но уже первый шаг к созданию своей первой игры.

Вот вы и получили первые сведения о Blitz3D и научились создавать в нем простую бродилку. Если буду жив, то напишу следующую часть этой статьи, где мы продолжим создавать эту игру – сделаем небольшую улицу, врагов и примитивный сценарий.

Автор: SecondKosta
Журнал: TOF

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *