forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ и уроки (http://forum.boolean.name/forumdisplay.php?f=110)
-   -   Коллизии в BlitzMax Часть 3. (http://forum.boolean.name/showthread.php?t=3722)

johnk 22.06.2007 15:54

Коллизии в 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
 
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.



Часовой пояс GMT +4, время: 23:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot