Учебник по Blitz3d

 
Учебник по Blitz3d
 
1. Создание строкового типа данных
2. Анимация объектов
3. Столкновение объектов
4.  Работа с файлами
 
 
 
 
 
1. Создания строкового типа данных
 
  Представьте что вам нужно создать карту 10x10 причем каждая клетка будет содержать несколько параметров. Вот тут то и помогут вам типы. Вы создаете тип с именем TMap в котором будут парматры X, Y, Name$. Теперь объявляете переменную newmap(9,9) типом TMap и чтобы получить доступ к любому из парметров клетки нужно всего лишь использовать newmap(0,0)\X = значение. В blitz типы немного расширены... Допутим вам нужно создать противника типичного которых по игре будет сотни но сколько точно вы не знаете. Вы создаете тип TPlayer с параетрами ... среди них должно быть обязательно Name$. При создании нового противника newplayer обязательно задайте Name... теперь игрок есть даже если вы удалите newplayer он содержится в TPlayer где то среди неограниченных его копий. и чтобы получить доступ к его параметрам нужно вызвать newplayer и найти нужного по Name$.
Пример объявления:

Type MyType
Field x,y
End Type
Создает тип 'MyType' с 2 парметрами - x и y.

Еще один пример:

Type MyType
Field x,y
Field description$
Field delta_x#,delta_y#
End Type

Теперь чтобы создать переменную или массив вашего типа нужно использовать символ '.' . Пример:

Global mine.MyType Dim all_mine.MyType( 100 )

До того как вы сможете использовать вашу переменную вам необходимо использовать опертор 'New'. Пример:

mine.MyType=New MyType

Оператор 'New' создает 'object' типа 'MyType', и возвращает 'pointer' новому объекту.
Для того чтобы вызвать параметры типа нужно использовать символ '\'. Пример:
 
 mine\x=100 Print mine\x
 
Уничтожение переменной типа:
Когда вы закончили работу с типом через переменную используйте комманду 'Delete'. Небойтесь вся информация записана в типе а не в переменной через которую осуществляется доступ. При следеющем вызове типа через какую нибудь переменную у вас о5 появится доступ к ранее записанным данным. Пример:
 
Delete mine

Специальное слово 'Null' используется для проверки существования объекта. Объект несуществует если ранее не был вызван опертором 'New', или уже был стерт опертором 'Delete'. Пример:

mine.MyType=New MyType
If mine<>Null
Print "exists!"
Else
Print "doesn't exist!"
EndIf
Delete mine
If mine<>Null
Print "exists!"
Else
Print "doesn't exist!"
EndIf
...на экране появится:
exists!
doesn't exist!

Список типов динамичен и может быть просканирова при помощи множества комманд таких как Each....
Слова 'First', 'Last', 'After' и 'Before' позволяют вам работать с листом типа. Опертор 'First' позволяет осуществлять доступ к первому эллементу типа. Пример:
mine.MyType=First MyType
Тоже и с остальными оперторами.
Если тип пуст то выводится 'Null'.
Еще два опертора 'After' перебирает объекты, и 'Before' перебирает объекты в обратном порядке.

Пример:

mine.MyType=First MyType ;mine=first object in the type list
mine=After( mine ) ;mine=second object
mine=After( mine ) ;mine=third object
mine=Before( mine ) ;mine=second object
mine=Before( mine ) ;mine=first again!
'After' и 'Before' возвращают 'Null' если тип пуст или объектов дальше нет. Пример:
mine.MyType=Last MyType ;mine=last object
mine=After( mine ) ;object after last does not exist!
Так же можно вставлять опретором Insert в любое место списка. Пример:
mine1.MyType=New MyType
mine2.MyType=New MyType
Insert mine2 Before mine1
Прмер как вставить новый эллемент в начало списка:
Insert mine Before First MyType
Специальная форма For...Next позволяет вам легко проверить каждый эллемент типа в листе. Пример:
For mine.MyType=Each MyType
Next
Наконец, опертор 'Delete Each' Позволит вам удалить все эеллементы из листа типа. Пример:
Delete Each MyType
 
 
 
 
2. Анимация объектов

Почти в любой игре вы встречали анимацию, например, бег героев, врагов, вращение винта вертолёта и др. И в Blitz3D существуют специальные команды, которые позволяют воспроизводить анимацию 3D объектов. Анимационные объекты имеют "кадры" или определённые фиксированные координаты отдельных частей объекта в разные моменты времени. Теперь поговорим об анимации объектов различных форматов. У объектов форматов 3DS и X анимируют компоненты, состоящие из примитивов, но не анимируют по вершинам и треугольникам. Но формат MD2 позволяет анимировать по отдельным вершинам и треугольникам, поэтому его используют для анимации персонажей и животных. Загрузка анимационного объекта в формате 3DS и X (при успешной загрузке, переменной возвращается адрес на объект):

перем=LoadAnimMesh("файл",[родитель] )

Воспроизвести анимацию для форматов 3DS и X. Допустимые значения для параметра режим: 1 - однократная анимация, 2 - зацикленная анимация, 3 - воспроизведение вперёд-назад, 0 - анимации нет. Скорость - параметр скорости анимации. Кадр - значение начального кадра. Задержка - пауза перед анимацией:
Animate перем,[режим],[скорость#],[кадр],[задержка#]

Функция, возвращающая время анимации объекта:

AnimTime#(перем)

Проверка на воспроизведение анимации. Функция возвращает 1, если объект анимирует и 0, если нет:

Animating(перем)

Загрузка анимационного объекта в формате MD2. Загружается такой же командой, как и неанимационный объект:

перем=LoadMD2("файл",[родитель] )

Воспроизвести анимацию MD2. Допустимые значения для параметра режим: 1 - однократная анимация, 2 - зацикленная анимация, 3 - воспроизведение впрёд-назад, 0 - анимации нет. Скорость - параметр скорости анимации. Начанльный кадр - значение начального кадра. Конечный кадр - значение конечного кадра. Задержка - пауза перед анимацией:

Animate перем,[режим],[скорость#],[начальный_кадр],[конечный_кадр],[задержка#]

Функция, возвращающая время анимации MD2 объекта:

MD2AnimTime#(перем)

Проверка на воспроизведение анимации MD2 объекта. Функция возвращает 1, если объект анимирует и 0, если нет:
 
MD2Animating(перем)

Чтобы воспроизводилась анимация объектов, должна присутствовать в цикле команда UpdateWorld (значение параметра скорость по-умолчанию равно 1):

UpdateWorld [скорость#]


3. Столкновение объектов


Созданные объекты при движении не будут взаимодействовать друг с другом, так как не установлены для них столкновения. Объекты будут проходить насквозь друг друга, поэтому чтобы избежать таких ситуаций, используют столкновения.
Установка режима столкновений. Используется команда Collisions, которая имеет множество параметров. Первый параметр - тип объекта (целое значение от 1 до 999), который будет сталкиваться. Второй параметр - тип объектов (целое значение от 1 до 999), об которые будут сталкиваться. Третий параметр - метод столкновения: 1 - сфера к сфере, 2 - сфера к многограннику, 3 - сфера к кубу. Четвёртый параметр - реакция сталкиваемого объекта: 1 - объект останавливается при столкновении, 2 - объект скользит при столкновении, 3 - объект скользит с трением. Общий вид команды:

Collisions тип1,тип2,метод,реакция

Чтобы объекты могли сталкиваться, нужно им применить тип (значение от 1 до 999):
EntityType перем,значение

Чтобы работала анимация, в цикле используют (та же команда для анимации объектов):

UpdateWorld

Примеры.
1 метод: метод с остановкой. Создаётся шар и конус. Тип шара - 1, а конуса - 2. В команде Collisions устанавливается первый параметр равен1, т.е. сталкивается объект с типом 1 - это шар. Второй параметр равен 2 - тип конуса, об который будет сталкиваться шар. Третий параемтр равен 2 (сфера об многогранник), лучше использовать такой метод, потому что конус - это многогранник. Последний параметр равен 1, значит, шар при столкновении остановится.

Graphics3D 640,480 ;3D графический режим
cam=CreateCamera() ;создаёт камеру
sphe=CreateSphere() ;создаёт шарик
PositionEntity sphe,4,0,8 ;позиция шарика
EntityType sphe,1 ;тип шарика
cone=CreateCone() ;создаёт конус
PositionEntity cone,-3,0,8 ;позиция конуса
EntityType cone,2 ;тип конуса
Collisions 1,2,2,1 ;устанавливает столкновения
While Not KeyHit(1)
MoveEntity sphe,-0.05,0,0
UpdateWorld ;обновляет анимацию и столкновения объектов
RenderWorld ;прорисовывает мир
Flip ;отбражает графический буфер
Wend ;конец цикла
End ;выход

2 метод: метод со скольжением. Пример ничем не отличается от первого, только последний параметр команды Collisions равен 2.

Graphics3D 640,480 ;3D графический режим
cam=CreateCamera() ;создаёт камеру
sphe=CreateSphere() ;создаёт шарик
PositionEntity sphe,4,0,8 ;позиция шарика
EntityType sphe,1 ;тип шарика
cone=CreateCone() ;создаёт конус
PositionEntity cone,-3,0,8 ;позиция конуса
EntityType cone,2 ;тип конуса
Collisions 1,2,2,2 ;устанавливает столкновения
While Not KeyHit(1)
MoveEntity sphe,-0.05,0,0
UpdateWorld ;обновляет анимацию и столкновения объектов
RenderWorld ;прорисовывает мир
Flip ;отбражает графический буфер
Wend ;конец цикла
End ;выход

3 метод: метод со скольжением и трением. Последний параметр команды Collisions равен 3.

Graphics3D 640,480 ;3D графический режим
cam=CreateCamera() ;создаёт камеру
sphe=CreateSphere() ;создаёт шарик
PositionEntity sphe,4,0,8 ;позиция шарика
EntityType sphe,1 ;тип шарика
cone=CreateCone() ;создаёт конус
PositionEntity cone,-3,0,8 ;позиция конуса
EntityType cone,2 ;тип конуса
Collisions 1,2,2,3 ;устанавливает столкновения
While Not KeyHit(1)
MoveEntity sphe,-0.05,0,0
UpdateWorld ;обновляет анимацию и столкновения объектов
RenderWorld ;прорисовывает мир
Flip ;отбражает графический буфер
Wend ;конец цикла
End ;выход

Дополнительные команды:
Отменить все столкновения:

ClearCollisions

Сбросить столкновение для определённого объекта:

ResetEntity(перем)

Установить радиус столкновения для объекта (вещественное значение) с методом столкновения сфера к сфере. Если значение меньше 1, то объект будет частично проходить другой, больше - не доходить до его поверхности.:

EntityRadius перем,знач#

Установить границу столкновения для объекта с методом столкновения сфера к кубу: x,y,z - координаты относительно объекта, а ширина, длина, высота - размер границы:

EntityBox перем,x#,y#,z#,ширина#,высота#,длина#

Функция, проверяющая произошло ли столкновение. Возвращает 1, если объекты столкнулись и 0, если нет. переменная - сталкиваемый объект, а тип - тип всех объектов, с которыми сталкивается объект:

EntityCollided(перем,тип)

Функция, возваращающая тип объекта:

GetEntityType(перем)

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

CountCollisions(перем)

Пример на проверку столкновений. Если первый куб столкнулся со вторым, то выходит сообщение:

Graphics3D 800,600
SetBuffer BackBuffer()
cam=CreateCamera()
cub1=CreateCube()
PositionEntity cub1,-4,0,8
EntityType cub1,125
cub2=CreateCube()
PositionEntity cub2,4,0,8
EntityType cub2,347
Collisions 347,125,1,1
Repeat
MoveEntity cub2,-0.1,0,0
UpdateWorld
RenderWorld
Flip
Until EntityCollided(cub2,125)
RuntimeError "Кубики столкнулись"
End
источник главы:blitz3d.hutz2.ru
 
 
 

3. Работа с файлами

В этой главе вы узнаете, как записывать и считывать данные из файлов. В Blitz3D существует три режима работы с файлами: режим записи, режим чтения и режим записи-чтения. Режим записи позволять открыть и занести значения в файл, а режим чтения считать значения из файла. При работе с файлом присваивается переменная-идентификатор, которая характеризует его. Чтение и запись происходит последовательно, путём перемещения указателя(аналогично в банках). В режиме записи файл создаётся автоматически, если он не существует на диске. Если перед записью в файле присутствовали значения, то они перезаписываются на новые. Внимание! Если прекращается работа с файлом в одном из режимов, то надо его закрыть, а затем можно его открыть в новом режиме.

Файл для записи открывают с помощью команды WriteFile и в скобках указывают путь в кавычках:
идентификатор_файла=WriteFile("путь")

Файл для чтения открывают с помощью команды ReadFile:
идентификатор_файла=ReadFile("путь")

Файл для записи/чтения открывают с помощью команды OpenFile:
идентификатор_файла=OpenFile("путь")

Закрыть файл:
CloseFile идентификатор_файла

Запись значений разных типов в файл (только в режиме для записи и записи/чтения).
Занести значение типа Byte:
WriteByte(идентификатор_файла,значение)

Занести значение типа Short:
WriteShort(идентификатор_файла,значение)

Занести значение типа Integer:
WriteInt(идентификатор_файла,значение)

Занести значение типа Float:
WriteFloat(идентификатор_файла,значение)

Занести значение типа String:
WriteString(идентификатор_файла,"значение")

Занести строку текста (запись текста строками, т.е. после каждой записи переход вниз) :
WriteLine(идентификатор_файла, "строка")

Занести некоторое число байт из банка в файл с некоторой позиции:
WriteBytes имя_банка,идентификатор_файла,позиция,число_байт

Чтение из файла значений разных типов (только в режиме для записи и записи/чтения).
Считать значение типа Byte:
имя_перем=ReadByte(идентификатор_файла)

Считать значение типа Short:
имя_перем=ReadShort(идентификатор_файла)

Считать значение типа Integer:
имя_перем=ReadInt(идентификатор_файла)

Считать значение типа Float:
имя_перем=ReadFloat(идентификатор_файла)

Считать значение типа String:
имя_перем=ReadString(идентификатор_файла)

Считать строку текста из файла:
имя_перем=ReadLine(идентификатор_файла)

Считать некоторое число байт из файла в банк с некоторой позицией начального байта:
ReadBytes имя_банка,имя_файла,позиция,число_байт

Работа с указателем файла. Значение начальной позиции указателя файла равно 0.
Проверка конца файла (функция возвращает 1, если конец файла и 0, если не конец файла):
Eof(идентификатор_файла)

Текущая позиция указателя файла (функция возвращает значение номера байта в данной позиции):
FilePos(идентификатор_файла)

Перенос указателя файла в нужную позицию:
SeekFile(идентификатор_файла,значение)

Пример программы на запись/чтение данных:
f=WriteFile("1.txt") ;открытие файла для записи
WriteByte(f,255) ;запись байтового значения
WriteInt(f,6500) ;запись целого значения
WriteFloat(f,0.1) ;запись вещественного значения
WriteString(f,"file") ;запись строкового значения
CloseFile(f) ;закрытие файла
f=OpenFile("1.txt") ;открытие файла для чтения
Print ReadByte( f ) ;печать байтового значения
Print ReadInt( f ) ;печать целого значения
Print ReadFloat( f ) ;печать вещественного значения
Print ReadString( f ) ;печать строкового значения
CloseFile(f) ;закрытие файла

Работа с файлами и папками.
Размер файла (функция возвращает размер файла в байтах):
FileSize(идентификатор_файла)

Проверка на существование файла (функция возвращает 0, если файл не существует; 1, если он существует и 2, если это папка):
FileType(идентификатор_файла)

Копирование файла:
CopyFile "путь1","путь2"

Удаление файла:
DeleteFile("путь")

Открытие папки для чтения:
идентификатор_папки=ReadDir("путь")

Закрытие папки для чтения:
CloseDir(идентификатор_папки)

Считать имя файла из текущей открытой папки (считывание имен файлов идет по алфавиту):
NextFile$(идентификатор_папки)

Текущий рабочий путь папки по умолчанию:
CurrentDir$()

Изменить рабочий путь папки по умолчанию:
ChangeDir$()

Удаление папки:
DeleteDir("путь")


 Ссылки по теме:


Свежий учебник с примерами
 
 


Форма входа

Наш опрос
Какие Вы пробовали новые средства разработок?
Всего ответов: 147
Календарь
«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Архив записей
Поиск
Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0
Друзья сайта
  • Все об умных часах и фитнес-браслетах
  • Все о поездах и железных дорогах!
  • Aндроид-клуб
  • Автоистория СССР
  • Блог о wordpress
  • Ноты для фортепиано

  • WIFI DIRECT

    все для wordpress



    умные часы Swatch
    умные очки Sony
    умные часы Fitbit Surge