Четверг, 25.04.2024, 01:12
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Категории каталога
BlitzMax [14]
Blitz3D [9]
BlitzPlus [0]
Xna [1]
DarkBasic [0]
Общее [3]
Наш опрос
Играете ли вы в Spacer?
1. Да
2. Нет
3. Собираюсь
Всего ответов: 36
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Статьи
Главная » Статьи » BlitzMax

Коллизии в BlitzMax Часть 3.

Изучаем 2Д программирование: Max 2D Коллизии Часть 3
Автор: Assari 2006 Перевел: JohnK 2007

Содержание

  1. Вступление
  2. CollideRect
  3. AutoMidHandle
  4. Выбор щелчком мыши, с помощью CollideRect
  5. Итоги

Вступление

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

Но, к сожалению, пиксель-совершенные коллизии тратят много ресурсов компьютера, что, естественно, приведет к падению
FPS.


BlitzMax предоставляет еще одну функцию, похожую на CollideImage - CollideRect. Давайте рассмотрим принцип ее работы.

CollideRect

Синтаксис CollideRect схож с синтаксисом функции CollideImage

 

Function CollideRect:Object[](x,y,w,h,collidemask%,writemask%,id:Object=Null)

 


Давайте перепишем код, с использованием функции
CollideRect.

   

Strict
Graphics 640,480
AutoMidHandle True

Local SpaceShip:TImage=LoadImage("blobship_1-1.png")
Local AlienShip1:TImage=LoadImage("cartoonufo_1-1.png")
Local AlienShip2:TImage=LoadImage("cartoonufo_1-1.png")

Local w:int=ImageWidth(SpaceShip)
Local h:int=ImageHeight(SpaceShip)

Repeat
 Cls
 Local R:Int=0
 Local G:Int=0
 Local B:Int=255
 ResetCollisions()
 SetColor 255,255,255
 DrawImage AlienShip1, 250,100
 CollideImage(AlienShip1,250,100,0,0,1,AlienShip1)

 DrawImage AlienShip2, 400,100
 CollideImage(AlienShip2,400,100,0,0,1,AlienShip2)
 
Local p:Object[]=CollideRect(MouseX()-w,MouseY()-h,100,100,1,0)
 For Local i:TImage=EachIn p
    Select i
    Case AlienShip1
        R=255
    Case AlienShip2
        G=255
    End Select
 Next
 SetColor R,G,B
 
DrawRect  MouseX()-w,MouseY()-h,100,100
 DrawImage SpaceShip,MouseX(),MouseY()
 Flip

Until KeyDown(KEY_ESCAPE) Or AppTerminate()

 


Обратите внимание, что коллизия происходит тогда, когда прямоугольник соприкасается с кораблем. Попробуйте запустить эту программу, без использования выражения
drawrect, и вы увидите, что коллизия ведет себя, так же как и раньше, при использовании функции CollideRect.

13.png







Самое классное в функции
CollideRect – это то, что она возвращает массив объектов, которые “накрыл” прямоугольник. Используя этот массив, вы можете провести пиксель - совершенную проверку на коллизию, между объектами в этом массиве. Вот демонстрация этого:

   

Local p:Object[]=CollideRect(MouseX()-w,MouseY()-h,100,100,1,0)
 
For Local i:TImage=EachIn p
 
 If ImagesCollide(i,150,200,0,SpaceShip,MouseX(),MouseY(),0)
        SetClsColor
255,0,0
    Else
        SetClsColor
0,0,0
    EndIf

 
Next

 

 

AutoMidHandle

Обратите внимание, что локальное начало координат рисуемого изображения является очень важным аспектом, при проверке на коллизии. Не забывайте, что функции CollideImage/CollideRect и DrawImage используют x и y координаты изображения, а так же midhandle-фактор, то есть, для точного определения коллизий вы должны использовать одинаковые данные.

Выбор щелчком мыши, с помощью CollideRect

Вот не большой пример, как можно использовать CollideRect для определения выбора. Не забывайте 'записывать' в слой коллизии, изображения, которые будут выбраны.

   

If CollideRect(MouseX(),MouseY(),2,2,1,0) And MouseDown(1)
   <
Ваш Код>
EndIf

 


Вот версия для искушенных: возвращенный объект вы можете использовать для дальнейших действий.

   

Local p:Object[]=CollideRect(MouseX(),MouseY(),2,2,1,0) And MouseDown(1)
 
For Local i:TImage=EachIn p
 
 Select i
    Case
Alien
       
<Ваш Код>
    Case
Player
        <Ваш Код>
    EndSelect

 
Next

 

 

Итоги

Третья часть этого туториала, продемонстрировала вам, как можно провести проверку на коллизии, быстрым и простым путем: используя функцию CollideRect. Вы вольны экспериментировать, и именно вы должны определить, где использование этой функции, для вас оптимально. А если вам непонятно, как использовать ее, воспользуйтесь функцией CollideImage.

Вот и всё. Надеюсь, вы поняли, как делать проверку на коллизии в
Blitz Max.

 

Категория: BlitzMax | Добавил: JohnK (22.06.2007) | Автор: Владимир
Просмотров: 1513 | Комментарии: 1
Всего комментариев: 1
1 JohnK  
0
Нужные изображения:

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright JohnK© 2024