PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)


SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)

Сообщений 1 страница 8 из 8

1

Пытаюсь создать 2D игру и по ходу изучения дошёл до этой команды
SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)
У меня прямо настроение пропало...
Зная координаты 1 и 2 спрайта, путём вычисления высоты и ширины я без этой SpriteCollision могу с лёгкостью вычислить есть коллизия или нет...
А нет ли такой команды как в DarkBasic Pro:

SPRITE COLLISION()
Эта команда возвращает значение 1, если заданный спрайт перекрывается вторым спрайтом. Если номер второго спрайта не был задан, а вместо него указано нулевое значение, команда возвращает номер любого спрайта, перекрывающегося с указанным. Параметры задаются целыми числами.

СИНТАКСИС
Возвращаемое значение=SPRITE COLLISION(Номер спрайта, Номер второго спрайта)

Или как мне быть в такой ситуации, если у меня на экране 150 спрайтов, каждый проверять за такт обновления экрана?

Отредактировано Phoenix (04.07.2012 20:37:06)

0

2

Спрайт с одним и тем же идентификатором можно многократно нарисовать на экране и как быть в таком случае, если не указать его координаты расположения?
Ничто ведь не мешает создать структурированный список или массив, хранящий координаты расположения спрайтов.

0

3

По сути ответ ясень, полезность команды SpriteCollision, она берёт лишь координаты, а номер спрайта для вычисления высоты и ширины.

повторюсь сравнивая с DarkBasic
Там в начале мы создаём номер спрайта, присваиваем ему свойство (типо прозрачность и всё такое)
А потом в процессе программы этому спрайту присваиваем любую загруженную картинку, меняя эти картинки получаем анимацию или используем команду для автоматической анимации заданных спрайтов... (может из за этого Dark не такой быстрый)

Тут же придётся немного попотеть, спасибо за ответ ;)

Отредактировано Phoenix (04.07.2012 21:36:40)

0

4

То есть в DarkBasic нельзя разместить один спрайт одновременно в нескольких точках экрана?

0

5

нельзя, потому как в начале мы создаём список спрайтов и какую картинку ему присвоим, такую и покажет...
но на разовую печать можно размещать просто картинку и хранить её координаты и размеры, причём прозрачность тоже можно присвоить.
ни чем не хуже SpriteCollision получается.

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

0

6

Phoenix написал(а):

а то при мысли что я каждый спрайт буду опрашивать просто мозг закипает,

Да нет ни чего в этом сложного. Если грамотно применять структуры, списки( массивы), циклы то код короткий. Небольшой код подсказка с коллизиями из код архива:

Код:
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
  MessageRequester("Error", "DirectX 7 Fehler!", 0) 
  End 
EndIf 

Breite = 800 
Hoehe = 600 

If OpenScreen ( Breite, Hoehe,32,"Standard") = 0 
  MessageRequester("Error", "Es konnte kein Bildschirm aufgebaut werden", 0) 
  End 
EndIf 

CreateSprite(0, 50, 50, #PB_Sprite_Memory) 
StartDrawing(SpriteOutput(0)) 
  Box(0, 0, 150, 150, RGB(255, 255, 255)) 
StopDrawing() 

CreateSprite(1, 50, 50, #PB_Sprite_Memory) 
StartDrawing(SpriteOutput(1)) 
  Box(0, 0, 50, 50, RGB(0, 0, 255)) 
StopDrawing()  

Structure Sprites 
  x.f 
  y.f 
EndStructure 
Global NewList Sprite.Sprites() 

For i = 1 To 77 
  x + 60 
  y + 7 
  If x > Breite - 50 
    x - Breite + 50 
  EndIf 
  If y > Hoehe - 50 
    y - Hoehe + 50 
  EndIf 
  AddElement(Sprite()) 
  Sprite()\x = x 
  Sprite()\y = y 
Next i 

Repeat 
  ExamineMouse() 
  xPos = MouseX()-25 
  yPos = MouseY()-25 
  StartSpecialFX() 
    ClearScreen(RGB(0,0,0)) 
    ResetList(Sprite()) 
    While NextElement(Sprite()) 
      DisplayTranslucentSprite(1, Sprite()\x, Sprite()\y, 200) 
      If SpriteCollision(0, xPos, yPos, 1, Sprite()\x, Sprite()\y) 
        If text$ 
          text$ + " / " + Str(ListIndex(Sprite())) 
        Else 
          text$ = Str(ListIndex(Sprite())) 
        EndIf 
      EndIf 
    Wend 
    DisplayTranslucentSprite(0, xPos, yPos, 200) 
  StopSpecialFX() 
  If text$ 
    StartDrawing(ScreenOutput()) 
      DrawText(10, 10,text$) 
    StopDrawing() 
    text$ = "" 
  EndIf 
  FlipBuffers() 
  
  If ExamineKeyboard() 
    If KeyboardPushed(#PB_Key_Escape) 
      Quit = 1 
    EndIf 
  EndIf 
  Delay(10) 
Until Quit

0

7

Phoenix написал(а):

каждый спрайт буду опрашивать просто мозг закипает, да и код с условиями вырастает, чувствую запутаюсь

Если использовать циклы, то код будет не очень сложным для понимания.

0

8

ну, это понятное дело ;) спасибо за помощь... возьму на вооружение.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)