Изучаем 2Д
программирование: Max 2D Коллизии Часть 3
Автор: Assari
2006 Перевел: JohnK 2007
Содержание
- Вступление
- CollideRect
- AutoMidHandle
- Выбор щелчком мыши, с помощью CollideRect
- Итоги
Вступление
В предыдущей части мы
узнали, как проверять коллизии с помощью функции CollideImage. При использовании CollideImage проверка
пиксель - совершенная. Это можно проверить путем медленного движения игрока на
корабль.
Но, к сожалению, пиксель-совершенные коллизии тратят много ресурсов компьютера,
что, естественно, приведет к падению FPS.
BlitzMax предоставляет
еще одну функцию, похожую на CollideImage
- 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.
Самое классное в функции 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.
|