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

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

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

Ответ
 
Опции темы
Старый 11.07.2011, 14:26   #1
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
объект сменяющий свою глубину(задний/передний фон)

Изучаю BlitzMax. Возник вопрос: как можно сделать чтоб объект мог во время игры менять свою глубину? Т.е. в один момент один спрайт рисуется над вторым, в другой момент второй спрайт рисуется над первым. На BlitzMax пересел с GameMaker и там был параметр depth, чем больше число depth тем выше рисуется спрайт. Как такое можно реализовать, или может в BlitzMax уже есть что то для этого? Заранее благодарен...
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 14:32   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Рисуй с другой поочерёдностью. Позже рисованные - перекрывают те что раньше нарисованы.
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 14:38   #3
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Это понятно. Но мне нужно чтоб глубину можно было поменять во время игры, динамически так сказать...
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 15:04   #4
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Дык, ты можешь это сделать сам, рисуй иначе - простая логика.
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 15:09   #5
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Буду признателен если приведете небольшой пример
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 15:22   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,139
Написано 2,332 полезных сообщений
(для 6,487 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

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 
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 16Gb ram; Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 15:29   #7
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,374
Написано 489 полезных сообщений
(для 882 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Если количество слоёв невелико и количество объектов тоже, то можно ввести параметр "слой" для объектов, и потом в цикле пробегать по слоям:
(Для трёх слоёв - задний, средний, передний - можно взять -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
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
xmarat (11.07.2011)
Старый 11.07.2011, 15:57   #8
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

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
Однако не подходит если есть несколько типов объектов, но все равно спасибо!

Жека, Огромное спасибо, это то что нужно!!!
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 16:49   #9
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,139
Написано 2,332 полезных сообщений
(для 6,487 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Сообщение от xmarat Посмотреть сообщение
если есть несколько типов объектов
Можно использовать наследование.
Type Sprite
   Field Order
:Int
EndType


Type Player 
Extends Sprite
EndType

Type Enemy 
Extends Sprite
EndType

Type Bullet 
Extends Sprite
EndType 
И их можно складывать в один лист.
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 16Gb ram; Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
xmarat (11.07.2011)
Старый 11.07.2011, 17:21   #10
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Точно. Я об этом не подумал. Тоже очень хороший вариант. Вопрос: какой из двух вариантов меньше нагружает процессор?
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 20:58   #11
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,139
Написано 2,332 полезных сообщений
(для 6,487 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Сообщение от xmarat Посмотреть сообщение
Точно. Я об этом не подумал. Тоже очень хороший вариант. Вопрос: какой из двух вариантов меньше нагружает процессор?
Важнее то, как тебе проще и удобнее будет делать. Оба способа примерно равны по скорости.
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 16Gb ram; Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 12.07.2011, 18:54   #12
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

А в какой лист добавлять Player, Enemy, Bullet? Или их можно в несколько листов добавлять?
(Offline)
 
Ответить с цитированием
Старый 12.07.2011, 20:05   #13
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,139
Написано 2,332 полезных сообщений
(для 6,487 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

Сообщение от xmarat Посмотреть сообщение
А в какой лист добавлять Player, Enemy, Bullet? Или их можно в несколько листов добавлять?
Всех можно смело добавлять в один лист. Они же наследники Sprite.
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 16Gb ram; Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 12.07.2011, 21:17   #14
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: объект сменяющий свою глубину(задний/передний фон)

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


Опции темы

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

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


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


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