Огонь.

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Огонь.

Сообщение Mikle » 30.09.2004 (Чт) 15:47

Вот реализация огня на основе того же генератора текстур, что я использовал для облаков. Плюс мультитекстурирование.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.09.2004 (Чт) 19:15

Бесспорно, похоже. Огромное сенкс! Такое простое решение очень понадобится. Только забью один гвоздь - комментируй, пожалуйста, код хотя бы чуть-чуть. Знаешь, как иногда бывает лень думать!? И еще пол-гвоздя - прога после первого запуска-выхода падает на втором! Где кроется ошибка?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 01.10.2004 (Пт) 13:00

На счет комментария учту. А вот зависаний у меня не наблюдалось на двух разных компьютерах при многократных запусках. :roll:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 01.10.2004 (Пт) 20:03

Все работает отлично!!! Вообще клево сделано.... :lol:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 02.10.2004 (Сб) 1:36

Могет где-то получается отлично, но причину я нашел довольно быстро

d3dDevice.Present ByVal 0, ByVal 0, Me.hWnd, ByVal 0

вместо

d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.10.2004 (Сб) 10:06

Странно, вот цитата из SDK:
DestWindowOverride
Destination window whose client area is taken as the target for this presentation. If this value is 0 (zero), then the hWndDeviceWindow member of D3DPRESENT_PARAMETERS is taken.

Так что Yurich спасибо, буду знать, что иногда это не работает.

ЗЫ. Если поменять цвет с
Vertices(0).Color = &HFFFF8070
на
Vertices(0).Color = &HFFFFA070
(в двух местах) - получается более похоже.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 03.10.2004 (Вс) 0:17

С первыми доводами я пожалуй погорячился, софт не врал, у меня просто возникло случайное совпадение. Причина оказалась почище выпитого за компом литра пива. Виновен QueryPerformanceCounter d2, а точнее метод описания самой переменной d2. Я попытался провести небольшой 4-х часовой эксперимнт с этой функцией и первым вразумительным результатом оказалось, что после перехода счётчика через нуль ситема отвечает ошибкой "Прога выполнила...". Перезагрузка VB при этом не помогает (только перезагрузка W98).
Пока я еще не нашел точного ответа. Но по первым пробам решил, что d2 надо огласить внутри ф-ции не как Static, а описать стандартно
Dim d2 As Long
И тут возник вопрос, почему при опиаснии переменной в разделе General проект виснет "не задумываясь", а если внутри процедуры или модуля - живет и (вроде, пока) нормально работает?
PS. во всех моих проектах подобная d2 переменная оглашена в модулях, потому я не поподал в такую историю.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 03.10.2004 (Вс) 10:25

Тогда, вроде, понятно. Видимо QueryPerformanceCounter так же как и QueryPerformanceFrequency возвращает не 4, а 8 байт. Недаром я за QFreq As Long дописал QFreqTmp As Long - резервирую лишние байты. Тогда после d2 нужно тоже зарезервировать память. Правда у меня не висло - может я не дожидался перехода через 0? Или в XP функция работает несколько иначе, чем в 98.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 04.10.2004 (Пн) 0:40

Mikle писал(а):Видимо QueryPerformanceCounter так же как и QueryPerformanceFrequency возвращает не 4, а 8 байт. Недаром я за QFreq As Long дописал QFreqTmp As Long - резервирую лишние байты. Тогда после d2 нужно тоже зарезервировать память.


Так и есть! Dim d2 As Long, d2tmp As Long исключает проблему.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.10.2004 (Пн) 9:03

Замечательно сделано! ;-)

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 06.10.2004 (Ср) 8:22

Может никто не замети но у меня огонь падает !!!
Надо исправить
Mtrx.m32 = -TexPos
на
Mtrx.m32 = TexPos
Вообще красиво но че-то мутновато и не "красно" :wink:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 06.10.2004 (Ср) 15:14

Bonesnapper писал(а):Может никто не замети но у меня огонь падает !!!


Забавно! Какая телега у тебя и винда?
Мутновато, потому-что в качестве основы лежит облако, а не красно - ну огонь в общем-то не красный а соломенный цвет имеет.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.10.2004 (Ср) 15:25

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

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 07.10.2004 (Чт) 14:12

P-4 2800,GeForce 5800,1024 ram(pc3200): WINDOWS XP SP1
Может кто не понал огонь не "вверх ногами" Он появляется сверху
и постепенно желтея подает вниз :wink:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 07.10.2004 (Чт) 16:57

Не тачка, а настоящая тачанка. Майкл, может в таком случае отказаться от ораничения d2 тремя байтами? Ведь бред получается - прога работает быстрее, чем системный таймер.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.10.2004 (Пт) 10:16

Bonesnapper
Поставь после вычисления QFreq строку:
Debug.Print QFreq
и напиши, пожалуйста, сколько получилось. Может у тебя действительно очень высокая частота? Это зависит от мамки, но настолько большой частоты, чтобы не хватало 3 байта, я пока не встречал.
Или QueryPerformanceCounter идет в обратную сторону :lol:

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 11.10.2004 (Пн) 8:40

Поставь после вычисления QFreq строку:
Debug.Print QFreq

QFreq=-1488537296
А не могли бы вы объяснить как работает функция TexPos :roll:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.10.2004 (Пн) 11:23

:shock: Частота не может быть отрицательной.... Скорее всего переваливает за пределы типа... :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.10.2004 (Пн) 11:49

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.10.2004 (Пн) 15:36

После:
Код: Выделить всё
QueryPerformanceFrequency QFreq

нужно вставить:
Код: Выделить всё
  QFreq = QFreq / &H100
  If QFreq < 0 Then QFreq = QFreq + &H1000000

А TexPos будет выглядеть так:
Код: Выделить всё
Private Function TexPos() As Single
Static p As Single, d1 As Long, d2 As Long, dTmp As Long
  QueryPerformanceCounter d2
  d2 = d2 And &HFFFFFFF
  p = p + (((d2 - d1) And &HFFFFFFF) / QFreq) * 0.004!
  d1 = d2
  TexPos = p
End Function

Мало того, что в бейсике нет беззнакового DoubleWord, при таких частотах действительно может не хватать трех байт, как сказал Юрич. По крайней мере при FPS меньше 50...100, точно не считал. Поэтому я добавил еще пол байта - теперь хватит на все случаи жизни.
Bonesnapper
Функция возвращает значение сдвига текстурной матрицы, исходя из прошедшего с предыдущего вызова времени. Ограничение: "And &HFFFFFFF" устраняет переполнение, которое может произойти при переходе счетчика через 0.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 12.10.2004 (Вт) 18:13

Все теперь нормально работает с -texpos (только медленно чето)
Кто-то сказал что огонь некрасный.Красный он.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList