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