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

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

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

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 13.06.2007, 17:32   #1
CRACK
AnyKey`щик
 
Регистрация: 15.02.2007
Сообщений: 18
Написано 0 полезных сообщений
(для 0 пользователей)
Удаление частиц

Добрый день, в поиске почему-то я по конкретному вопросу не нашел... В общем пишу систему частиц(типа шлейф за чем-нибудь) для небольшой аркады. Смысл такой - рисуется пять спрайтов за один цикл на месте player'a, и так как он у меня с постоянной скоростью перемещается(что-то типа летящего самолетика подбитого), то этого в полне хватает визуально. Но проблема в другом - спрайты у меня вырисовываются через массив и я никак не могу избавиться от переполнения массива. Ну а если делать просто через нью тайп, то не получается удалять лишний хвост. А библиотеки левые прикручивать не хочу. Вот простой исходничек, посмотрите пожалуйста:

Dim particle(20000)
Graphics3D 1024,768,32,1

light=CreateLight()
TurnEntity light, 45,45,0
Player=CreateCube()
PositionEntity Player,0,5,15
cam=CreateCamera()
PositionEntity cam,14,0,-20
CameraRange cam,0.1,110000
plane=CreatePlane()
PositionEntity plane,0,-20,0
EntityColor plane,20,120,20
asp = LoadTexture("media/tex.jpg")
ScaleTexture asp, 50, 50
EntityTexture plane, asp

hvost = LoadSprite("media/lens.jpg")

Repeat

For b=1 To 5
i=i+1
particle(i) = CopyEntity(hvost,particle(i))
PositionEntity particle(i),EntityX(Player)+Rnd(-1,1),EntityY(Player)+Rnd(-0.5,0.5),EntityZ(Player)
If i>150 Then HideEntity particle(i-150)
Next
MoveEntity cam,1,0,0
MoveEntity player,0,-0.3,0
MoveEntity player,1,0,0
If KeyDown(200) Then MoveEntity player,0,0.4,0


If KeyDown(1) Then Exit

UpdateWorld
RenderWorld



Text 10,14,"Array "+i

Flip

Forever
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 18:08   #2
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Re: Удаление частиц

Так у тебя счетчик все время увеличивается. Сделай лимит чтоли или или уменьшай его. А вообще нужно создать еще один цикл и усе.
For b=1 To 5
For i=0 to 19999
particle(i) = CopyEntity(hvost,particle(i))
PositionEntity particle(i),EntityX(Player)+Rnd(-1,1),EntityY(Player)+Rnd(-0.5,0.5),EntityZ(Player)
If i>150 Then HideEntity particle(i-150)
Next
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 18:21   #3
Nord
Знающий
 
Регистрация: 07.10.2006
Сообщений: 269
Написано 22 полезных сообщений
(для 30 пользователей)
Re: Удаление частиц

если делать просто через нью тайп, то не получается удалять лишний хвост
Время жизни партиклам делай и усё.
Graphics3D 1024,768,32,1

Type particle
Field entity, age#    
End Type

light=CreateLight()
TurnEntity light, 45,45,0
Player=CreateCube()
PositionEntity Player,0,5,15
cam=CreateCamera()
PositionEntity cam,14,0,-20
CameraRange cam,0.1,110000
plane=CreatePlane()
PositionEntity plane,0,-20,0
EntityColor plane,20,120,20
asp = LoadTexture("media/tex.jpg") 
ScaleTexture asp, 50, 50
EntityTexture plane, asp

hvost=LoadSprite("media/lens.jpg")

Repeat

For i=1 To 5
p.particle = New particle
    p\entity=CopyEntity(hvost,p\entity)
    p\age=25
    PositionEntity p\entity,EntityX(Player)+Rnd(-1,1),EntityY(Player)+Rnd(-0.5,0.5),EntityZ(Player)
Next

For w.particle =Each particle
    w\age=w\age-1
    If w\age<=0 Then : FreeEntity w\entity : Delete w :EndIf
Next

MoveEntity cam,1,0,0
MoveEntity player,0,-0.3,0
MoveEntity player,1,0,0
If KeyDown(200) Then MoveEntity player,0,0.4,0

If KeyDown(1) Then Exit

UpdateWorld
RenderWorld

Flip

Forever
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 18:27   #4
CRACK
AnyKey`щик
 
Регистрация: 15.02.2007
Сообщений: 18
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Удаление частиц

Что-то он p\entity найти не может...
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 18:31   #5
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Удаление частиц

Не делай, как говорит Nord)
Можно заранее сделать массив, как у тебя. Тогда при достижении счетчика максимального значения, обнуляй его. При этом самые страые спрайты, которые уже наверняка не видно, будут подставляться вместо новых. Естественно, надо задать каждому спрайту время жизни, чтобы он не болтался вечно.

Можно через тип создавать каждый раз необходимое количество. Этот подход может быть проще. Опять же каждому спрайту задавай значение жизни, отнимай его каждый кадр и удаляй спрайт, когда жизнь = 0.
Только ни в коем случае нельзя грузить картинку в главном цикле. Тут или CopySprite, или лучше реализовать первый вариант: создать вначале определенное количество спрайтов, а потом их прятать, когда жизнь = 0. При этом будет лучше производительность. А в конце программы все удалить.
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 18:34   #6
Nord
Знающий
 
Регистрация: 07.10.2006
Сообщений: 269
Написано 22 полезных сообщений
(для 30 пользователей)
Re: Удаление частиц

Нечайно lens.jpg.bmp прописал. Пробуй, сейчас всё работает.
alcoSholik, может объяснишь мне на будущее чем мой вариант плох. Я вроде это же и сделал:
Можно через тип создавать каждый раз необходимое количество. Этот подход может быть проще. Опять же каждому спрайту задавай значение жизни, отнимай его каждый кадр и удаляй спрайт, когда жизнь = 0.
Только ни в коем случае нельзя грузить картинку в главном цикле.
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 18:45   #7
CRACK
AnyKey`щик
 
Регистрация: 15.02.2007
Сообщений: 18
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Удаление частиц

Спасибо Nord, сейчас все работает отлично, поменял loadsprite на copy и все замечательно... и производительность хорошая!
(Offline)
 
Ответить с цитированием
Старый 13.06.2007, 20:12   #8
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Удаление частиц

Nord
"Низя грузить" ты уже потом сделал. А так, действительно, это тот же второй вариант, о котором я упомянул.
(Offline)
 
Ответить с цитированием
Старый 14.06.2007, 00:03   #9
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Re: Удаление частиц

[offtоp]
Следует отвлеченно заметить, что в случае, когда необходимое кол-во партиклов довольно велико, заранее известно, количество создавамых партиклов должно ограничиваться неким максимальным числом- использование группы обычных одномерных массивов вместо типов даст преимущество в скорости просчёта логики от 10% до 30% в зависимости от метода реализации. Если используются простейшие сингсёрфейсные партиклы, количество которых ограничено по определению- массивы тоже весьма удобны.
Однако, использование массивов в данной конкретной специфике всё же следует признать скорее своеобразным финтом ушами, - местами неудобным, местами "непедагогичным", и как правило не дающим значительного прироста скорости. Потому начинающему пользователю, который еще довольно смутно представляет суть происходящих процессов лучше от использования массивов воздержаться.

P.S. я же массивы люблю и уважаю.
[/offtоp]
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
система частиц Kuzma 3D-программирование 1 26.10.2009 21:59
Система частиц Dakar 3D-программирование 35 28.09.2009 19:20
движение частиц по сложной траектории mauNgerS 3D-программирование 20 26.06.2009 15:03
Подскажите либу для частиц? Stalnoy_Gvozd' Библиотеки 24 22.09.2007 13:24


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


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