Коллизии в BlitzMax Часть 2.
Изучаем 2Д программирование: Max 2D Коллизии Часть 2
Автор: Assari 2006 Перевел: JohnK 2007 Содержание
В прошлой части мы увидели, как проверить объекты на коллизию, используя простые команды RectOverlaps и CircRectOverlaps. Так же рассмотрели пиксель-совершенные команды на проверку коллизий- ImagesCollide и ImagesCollide2. В этой части мы рассмотрим другие команды, на проверку коллизий. CollideImage Давайте попробуем решить проблему неправильного определения коллизий, путем использования этой функции. Синтаксис этой функции вводит в заблуждение. Он представлен ниже, а теперь давайте заменим код таким образом, что бы он работал, мы не будем сейчас вникать в подробности, просто будем использовать CollideImage: Код:
Function CollideImage:Object[](image:TImage,x,y,frame,collidemask%,writemask%,id:Object=Null) Заметьте, изменения выделены (серый текст это то, что осталось без изменения с прошлого раза) Код:
Graphics 640,480 Если вы скомпилируете этот код, то заметите, что коллизии все так же точно определяются, как и в прошлой части туториала. Слой Коллизии Новая система коллизий в BlitzMax основана на слоях, для того чтобы использовать ее, вы должны проделать следующие шаги:
Так же, в пример, мы прошли все 3 шага: Функция ResetCollisions() очищает все слои коллизий. Можно так же очистить только желаемый слой, например, для очищения второго слоя, мы должны написать так - ResetCollision(2) Код:
ResetCollisions() Код:
CollideImage(Alien,150,100,Frame,0,2) А это CollideImage выражение проверяет весь второй слой, а следовательно и изображение инопланетянина, с изображением Игрока. Код:
If CollideImage(Player,MouseX(),MouseY(),0,2,0) А вот что Марки Сибли говорит о новой системе коллизий: Цитата:
Код:
Function CollideImage:Object[](image:TImage,x,y,frame,collidemask%,writemask%,id:Object=Null) Чтобы приписать изображение к первому слою, мы должны записать так: Код:
CollideImage(Alien,150,100,Frame,0,1) Код:
CollideImage(Alien,150,100,Frame,0,3) Примерно также мы можем проверить слой на коллизии, манипулируя параметром collidemask%: Код:
If CollideImage(Player,MouseX(),MouseY(),0,1,0) Или же проверить два слоя сразу: Код:
If CollideImage(Player,MouseX(),MouseY(),0,3,0) Прелесть слоев коллизий в том, что мы можем проверять на коллизии только нужные нам слои. Прежде чем рассмотреть пример этого, давайте разберем еще одну важную часть этой системы: Возвращение Массивов Объектов коллизиями Как вы помните, если происходят коллизии, то функция проверки на коллизию, возвращает значение true (истина) Функция CollideImage имеет больше возможностей в плане проверки на коллизии. Давайте рассмотрим до сих пор не знакомые нам параметры в синтаксисе этой функции, а именно Object[] и id:Object. Function CollideImage:Object[](image:TImage,x,y,frame,collidemask%,writemask%,id:Object=Null) Запомните, что существует два вида функции CollideImage,
После записи, при чтении, функция вернет все объекты, вовлеченные в коллизию в виде массива объектов. Вотпростой пример, иллюстрирующий это: Код:
Strict В этом примере, при коллизии, происходит смена цвета. Мы так же можем провести проверку на коллизии между двумя кораблями, просто используя выражение CollideImage, в результате мы бы получили массив. Если для объекта AlienShip1 вы не напишете последний параметр в функции CollideImage, вы не сможете провести проверку коллизий. Попробуйте, и вы увидите: Код:
DrawImage AlienShip1, 250,100 Если вы проделаете подобное и для объекта SpaceShip то в массиве объектов, возвращаемого функцией, его не будет, это важно понять, так как при проверки на коллизии результат может быть не тем, что нужен. Так что вы можете просто написать лишний код, а желательно, избавлять себя от него. Пример слоя коллизий Ниже, пример определения коллизий между разными слоями: Код:
Strict Скомпилировав, вы увидите, что коллизия происходит только между одинаковыми слоями. Чтобы сделать проверку между двумя кораблями, вы должны присвоить переменной Collision_Layerзначение 3. Итоги В этой части мы рассмотрели способ проверки коллизий с помощью функции CollideImage. Стоит запомнить, что BlitzMax предоставляет 32 слоя коллизий. Следует повторить:
|
Re: Коллизии в BlitzMax Часть 2.
Вот нужные картинки:
|
Re: Коллизии в BlitzMax Часть 2.
При копировании текста, почему то потерялись все пробелы, так что если вы заметите отсутсвие пробела или орфографическую ошибку, то просьба указать ее здесь.
|
Re: Коллизии в BlitzMax Часть 2.
это отлично что кто-то переводит!
|
Re: Коллизии в BlitzMax Часть 2.
Присоединяйтесь! :)
|
Часовой пояс GMT +4, время: 07:17. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot