PureBasic

SpritePixelCollision()

Синтаксис

Result = SpritePixelCollision(#Sprite1 , x1 , y1 , #Sprite2 , x2 , y2)

Описание


Проверяет, перекрываются ли два указанных спрайта. Чтобы эта команда работала, при создании спрайта должен быть указан флаг #PB_Sprite_PixelCollision.

Параметры

#Sprite1 Номер идентифицирующий первый Спрайт, который требуется проверить на столкновение.
x1, y1 Координаты левого верхнего угла первого спрайта, в пикселях.
#Sprite2 Номер идентифицирующий второй Спрайт, который требуется проверить на столкновение.
x2, y2 Координаты левого верхнего угла второго спрайта, в пикселях.

Возвращаемое значение

Ненулевое значение, если два спрайта перекрываются, в противном случае - 0.

Комментарии

Эта функция выполняет попиксельное сравнение двух спрайтов с учётом прозрачных пикселей, что делает процедуру очень точной, но и относительно медленной. Чтобы оптимизировать сравнение, желательно максимально удалить прозрачную зону вокруг спрайта, чтобы сохранить только ее реальный размер. Масштабированные спрайты также поддерживаются.

Для более быстрой проверки столкновений, основанной только на прямоугольных границах, используйте SpriteCollision().

Внимание, эта функция не работает со спрайтами, которые были повернуты или преобразованы.

Пример (фран.)

InitSprite()
OpenScreen(800,600,32,"Пример OpenScreen")

 ;Спрайт мяч
CreateSprite(0,30,30,#PB_Sprite_PixelCollision)
StartDrawing(SpriteOutput(0))
Circle(15,15,13,RGB(255,255,255))
Circle(15,15,10,RGB(128,128,128))
StopDrawing()

 ;Спрайт цель
CreateSprite(1,100,100,#PB_Sprite_PixelCollision)
StartDrawing(SpriteOutput(1))
Circle(50,50,49,RGB(255,255,0))
Circle(50,50,40,RGB(0,255,0))
Circle(50,50,30,RGB(0,255,255))
Circle(50,50,20,RGB(0,0,255))
Circle(50,50,10,RGB(255,0,0))
StopDrawing()

 ;Спрайт Boom
CreateSprite(2,100,100,#PB_Sprite_PixelCollision)
StartDrawing(SpriteOutput(2))
Circle(50,50,50,RGB(255,0,0))
DrawText(50-TextWidth("BOOM")/2,50-TextHeight("BOOM")/2,"BOOM",RGB(255,255,0),RGB(255,0,0))
StopDrawing()

 ;Начальная координата х стрелки
x=0

 ;Цикл 
While x < 800  ; Если мяч не попадает в цель, программа заканчивается, когда х = 800
  
  ;Мяч переместится на 4 пикселя вправо
  x=x+4
  
  ;Очистить экран полностью и отобразить черный фон
  ClearScreen(RGB(0,0,0))
  
  ;Отображение стрелки
  DisplaySprite(0, x, 240)
  ;Отображение цели
  DisplaySprite(1, 500, 200)
  
  ;Обнаружение столкновения между мячом и целью
  If SpritePixelCollision(0, x, 240, 1, 500, 200) <> 0
    ;Если происходит столкновение, мы стираем экран и отображаем BOOM
    ClearScreen(RGB(0,0,0))
    DisplaySprite(2, 500, 200)
    ;Мы инвертируем буферы, чтобы сделать сцену видимой на экране.
    FlipBuffers()
    Delay(2000)
    ClearScreen(RGB(0,0,0))
    End ; а затем мы закрываем программу
  EndIf 
  
  ;Теперь, когда все рассчитывается и отображается в невидимом буфере,
  ;Мы инвертируем буферы, чтобы сделать сцену видимой на экране.
  FlipBuffers()
  
  Delay(10)
  
Wend

См. также

SpriteCollision()

Поддерживаемые OS

Все

<- SpriteOutput() - Оглавление Sprite - SpriteQuality() ->