forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   объект сменяющий свою глубину(задний/передний фон) (http://forum.boolean.name/showthread.php?t=15102)

xmarat 11.07.2011 18:26

объект сменяющий свою глубину(задний/передний фон)
 
Изучаю BlitzMax. Возник вопрос: как можно сделать чтоб объект мог во время игры менять свою глубину? Т.е. в один момент один спрайт рисуется над вторым, в другой момент второй спрайт рисуется над первым. На BlitzMax пересел с GameMaker и там был параметр depth, чем больше число depth тем выше рисуется спрайт. Как такое можно реализовать, или может в BlitzMax уже есть что то для этого? Заранее благодарен...

moka 11.07.2011 18:32

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Рисуй с другой поочерёдностью. Позже рисованные - перекрывают те что раньше нарисованы.

xmarat 11.07.2011 18:38

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Это понятно. Но мне нужно чтоб глубину можно было поменять во время игры, динамически так сказать...

moka 11.07.2011 19:04

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Дык, ты можешь это сделать сам, рисуй иначе - простая логика.

xmarat 11.07.2011 19:09

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Буду признателен если приведете небольшой пример

Randomize 11.07.2011 19:22

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
PHP код:

Type sprite
    Field order
:Int
    
    Method Compare
:Int(otherObject:Object)
        
s:sprite sprite(otherObject)
        If 
Not s Then Return 1
        
Return order s.order
    End Method
End Type



' ----------------------------
SeedRnd(MilliSecs())
Local sprite_list:TList = New TList


For Local i:Int=1 To 100
    s:sprite = New sprite
    s.order = Rand(100)
    ListAddLast sprite_list, s
Next



SortList(sprite_list)

For Local s:Int = EachIn sprite_list
    Print s.order
Next 


Жека 11.07.2011 19:29

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Если количество слоёв невелико и количество объектов тоже, то можно ввести параметр "слой" для объектов, и потом в цикле пробегать по слоям:
(Для трёх слоёв - задний, средний, передний - можно взять -1, 0, 1, просто для понятности)

Псевдокод:
Код:

Global depthStart% = -1
Global depthEnd% = 1
For local k%= depthStart To depthEnd
 for local sprite:TSprite = eachin listSprites
  if(sprite.layer <> k) continue 'пропускаем слой

  //тут логику и рисуем
 next
Next


xmarat 11.07.2011 19:57

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Randomize, слегка поправил Ваш вариант:
Код:

Type sprite
    Field order:Int
   
    Method Compare:Int(otherObject:Object)
        s:sprite = sprite(otherObject)
        If Not s Then Return 1
        Return order - s.order
    End Method
End Type

' ----------------------------
SeedRnd(MilliSecs())
Local sprite_list:TList = New TList


For Local i:Int=1 To 100
    s:sprite = New sprite
    s.order = Rand(100)
    ListAddLast sprite_list, s
Next

Local d:sprite

SortList(sprite_list)

For d = EachIn sprite_list
    Print d.order
Next

Однако не подходит если есть несколько типов объектов, но все равно спасибо!

Жека, Огромное спасибо, это то что нужно!!!

Randomize 11.07.2011 20:49

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Цитата:

Сообщение от xmarat (Сообщение 195087)
если есть несколько типов объектов

Можно использовать наследование.
PHP код:

Type Sprite
   Field Order
:Int
EndType


Type Player 
Extends Sprite
EndType

Type Enemy 
Extends Sprite
EndType

Type Bullet 
Extends Sprite
EndType 

И их можно складывать в один лист.

xmarat 11.07.2011 21:21

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Точно. Я об этом не подумал. Тоже очень хороший вариант. Вопрос: какой из двух вариантов меньше нагружает процессор?

Randomize 12.07.2011 00:58

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Цитата:

Сообщение от xmarat (Сообщение 195096)
Точно. Я об этом не подумал. Тоже очень хороший вариант. Вопрос: какой из двух вариантов меньше нагружает процессор?

Важнее то, как тебе проще и удобнее будет делать. Оба способа примерно равны по скорости.

xmarat 12.07.2011 22:54

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
А в какой лист добавлять Player, Enemy, Bullet? Или их можно в несколько листов добавлять?

Randomize 13.07.2011 00:05

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
Цитата:

Сообщение от xmarat (Сообщение 195244)
А в какой лист добавлять Player, Enemy, Bullet? Или их можно в несколько листов добавлять?

Всех можно смело добавлять в один лист. Они же наследники Sprite.

xmarat 13.07.2011 01:17

Ответ: объект сменяющий свою глубину(задний/передний фон)
 
В общем разобрался. Спасибо огромное за ответы. Кстати в моем случае больше подошел вариант с SortList, т.к. depth в игре сменяется не так часто. Считаю тема закрыта. Еще раз спасибо!


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

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