Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > BlitzMax > FAQ и уроки

Ответ
 
Опции темы
Старый 22.06.2007, 11:54   #1
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Радость Коллизии в 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.

(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Про дробную часть -=SCiP=- 2D-программирование 14 02.10.2007 22:59
S.E.T. Клиентская часть impersonalis Проекты C++ 21 17.08.2007 12:48
Коллизии в BlitzMax Часть 2. johnk FAQ и уроки 4 14.06.2007 22:00
Коллизии в BlitzMax. johnk FAQ и уроки 2 22.03.2007 22:21


Часовой пояс GMT +1, время: 15:45.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com