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

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

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

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

Ответ
 
Опции темы
Старый 04.09.2005, 21:28   #1
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Смех

Пример создания дыма:

для начала сохраните у себя на компьютере в какую-нибудь папку следующие текстуры:





они нам потребуются для работы кода, теперь копируем следующий код в блиц-редактор, оттуда сохраняем в папку, куда скопированы текстуры... запускаем...

;устанавливаем видеорежим и ставим текущий буфер видеопамяти на задний фон
Graphics3D 1024,768,16,1
SetBuffer BackBuffer()

; определяем тип для облачков дыма
Type SmogT

Field SHandle%
Field STime%
Field SSpeed#
Field ScaleIndex#
Field ScaleI#
Field SAlpha#
Field SAlphaSpeed#

End Type

; создаем камеру и помещаем ее так, чтоб нам было наш дымящийся объект
camera=CreateCamera()
PositionEntity camera,0,15,-25
RotateEntity camera,10,0,0

;создаем свет
RotateEntity CreateLight(),0,45,0

;загружаем наши текстуры как спрайты
sm2=LoadSprite("smog2.bmp",1)
sm1=LoadSprite("smog1.bmp",1)
; скрываем их, чтоб они не мешались на экране
HideEntity sm2
HideEntity sm1

; создаем шарик который будет дымиться
smogobject=CreateSphere()

; здесь запускаем счетчик, он нам нужен для того, чтоб регулировать насыщенность дыма
; иными словами сколько шарик будет пускать облачков дыма за один проход общего цикла
CreateStep=4+Rnd(-2,2)
; запускаем цикл до нажатия клавиши ESC
Repeat

; уменьшаем наш счетчик на единицу, если он достиг нуля, то пускаем облачко дыма
CreateStep=CreateStep-1
If CreateStep=0

; создаем новый тип для облачка
Smog.Smogt=New Smogt
; копируем наш спрайт
Smog\SHandle=CopyEntity(sm1)
; сбрасываем счетчик времени
Smog\STime=0
; задаем скорость поднятия облачка ввоздух
Smog\SSpeed=0.15
; задаем начальные размеры облачка
Smog\ScaleIndex=1.5
; задаем величину изменения размеров облачка с каждым подняитием его ввоздух
Smog\ScaleI=-0.02
; задаем начальную прозрачность облачка
Smog\SAlpha=0.8
; задаем величину изменения прозрачности облачка с каждым поднятием его ввоздух
Smog\SAlphaSpeed=-0.02
; помещаем наше облачко над объектом горения
PositionEntity Smog\SHandle,EntityX(SmogObject),EntityY(SmogObject)+1,EntityZ(SmogObject)

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

Smog.Smogt=New Smogt
Smog\SHandle=CopyEntity(sm2)
Smog\STime=0
Smog\SSpeed=0.15
Smog\ScaleIndex=2
Smog\ScaleI=0.01
Smog\SAlpha=0.5
Smog\SAlphaSpeed=-0.005
PositionEntity Smog\SHandle,EntityX(SmogObject),EntityY(SmogObject)+1,EntityZ(SmogObject)

; если счетчик равен нулю, то чтоб поновой отмерялось время запускаем его снова
CreateStep=4+Rnd(-2,2)

EndIf

; по нажатию кнопки передвигаем наш дымящийся шарик
If KeyDown(200) Then MoveEntity SmogObject,0,0,0.5
If KeyDown(208) Then MoveEntity SmogObject,0,0,-0.5
If KeyDown(203) Then MoveEntity SmogObject,-0.5,0,0
If KeyDown(205) Then MoveEntity SmogObject,0.5,0,0

; а тут самое интересное, здесь идет обработка дыма, чтоб он взлетал ввоздух и растворялся
; запускаем цикл на весь тип (в нем с каждым проходом мы будем работать с каждым облачком дыма)
For Smog.SmogT=Each SmogT
; таймер для дыма, т.е. сколько раз каждое облачко должно быть обработано пока оно не будет удалено
If Smog\STime< 100
; поднимаем облачко на заданную скорость SSpeed
MoveEntity Smog\SHandle,Rnd(-0.05,0.05),Smog\SSpeed,Rnd(-0.05,0.05)
; рассчитываем и изменяем размер облачка
Smog\ScaleIndex=Smog\ScaleIndex+Smog\ScaleI
ScaleSprite Smog\SHandle,Smog\ScaleIndex,Smog\ScaleIndex

; рассчитываем и изменяем прозрачность облачка
Smog\SAlpha=Smog\SAlpha+Smog\SAlphaSpeed
EntityAlpha Smog\SHandle,Smog\SAlpha

; увеличиваем счетчик времени облачка
Smog\STime=Smog\STime+1
; если время больше заданного (100) то его (облачко) нужно удалить
If Smog\STime=100
; удаляем спрайт облачка
FreeEntity Smog\SHandle
; удаляем тип
Delete Smog
EndIf
EndIf
Next

; прорисовываем (обновляем) наш мир
RenderWorld
; обмениваем буфера видеопамяти, чтоб увидеть что у нас получилось,
; теперь все следующее будет
рисоваться в скрытый буфер
Flip

Until KeyHit(1)

; конец программы
End
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 04.09.2005, 21:31   #2
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Смех

Примечание:

в зависимости от текстуры можно писать вот так:
sm2=LoadSprite("smog2.bmp",2)
sm1=LoadSprite("smog1.bmp",2)
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 04.09.2005, 21:33   #3
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Смех

А еще можно такую библу посмотреть.

(с) Impersonalis

__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 07.09.2005, 00:47   #4
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
не - делал не я. я только нарыл её )
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 17.09.2005, 21:59   #5
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Можно еще вот такой дым сделать (см. аттач)

использование:

ObjectToSmog - делает объект дымящимся

параметры:
ObjectToSmog (
SmogObject% - идентификатор объекта который будет дымиться (например возвращенный созданием сферы)
Sprite% - идентификатор спрайта для дыма, возвращенный LoadSprite()
Timer% - таймер для дыма, для установки времени между пусканиями облачков дыма (в итерациях)
Height# - высота столба дыма (в блиц-координатах)
Speed# - скорость шага поднятия облачков дыма ввоздух (в блиц-координатах)
Radius# - на самом деле столб дыма не совсем столб, а как-бы конус расположенный острием вниз, дым ведь рассеивается, дак вот этим параметром можно настроить величину отклонения облачков дыма при движении вверх (в блиц-координатах)
Rotating From# - максимальная закрученность облачков дыма против часовой чтрелки
Rotating To# - максимальная закрученность облачков дыма по часовой чтрелке, на самом деле вызывается для каждого облачка rnd (Rotating From, Rotating To) что и определяет закрученность облаков в ту или иную сторону.
Size From# - начальный размер каждого облачка дыма
Size To# - размер достигаемый облачком при достижении высшей точки столба дыма
Alpha From# - прозрачность облачка дыма в самом начале
Alpha To# - прозрачность облачка дыма при достижении высшей точки столба дыма

)

RemoveSmog убирает дым с объекта

параметры:
RemoveSmog(
EntityHandle - идентификатор объекта на который был установлен дым
)

SmogUpdate() обновляет состояние дыма, эту функцию нужно запихать в главный цикл программы, чтоб дым работал...
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 18.09.2005, 17:37   #6
alcosholik
 
Сообщений: n/a
Последний вариант дыма рулит! Особенно, если сравнить его с дымом в первом посте
Красиво и вполне реалистично. Респект.
 
Ответить с цитированием
Старый 18.09.2005, 20:22   #7
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
вообще все эти примеры были как учебное пособие, я считаю, что каждый должен сделать себе дым сам, подходящий для логики существования его мира... с учетом гравитации и ветра и со своими текстурами (саморисованные текстуры всегда лучше)
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 30.10.2005, 01:42   #8
Matt Merkulov
Модератор
 
Аватар для Matt Merkulov
 
Регистрация: 23.10.2005
Сообщений: 219
Написано 62 полезных сообщений
(для 247 пользователей)
Можно еще добавить анимацию и вращение. Так же и огонь можно сделать (в MaxPayne это было потрясно реализовано).
(Offline)
 
Ответить с цитированием
Старый 30.10.2005, 12:21   #9
jimon
 
Сообщений: n/a
а можно зделать клон lotusа
только использовать не спрайты, а блиттеры

я щас делаю систему партиклов на блиттерах
у maxusа вышло намного лутче 10 тыс обектов - 180 фпс
у меня 400 обектов - 120 фпс

правда у maxusа есть секрет и он им нехочет делится

ps. кто не в курсе lotus и lotus 2 ето самые красивые системы партиклов для блица , хотя они и самые тормозные

ps2. спрайт ето 2д еденица
а блиттер 3д

блиттер создается вот етим кодом :
mesh = CreateMesh() 
surf = CreateSurface(mesh) 
v0 = AddVertex (surf,-1,-1,0,0,1)
v1 = AddVertex (surf,1,-1,0,1,1) 
v2 = AddVertex (surf,-1,1,0,0,0) 
AddTriangle (surf,v0,v2,v1)
v3 = AddVertex (surf,1,1,0,1,0)
v4 = AddVertex (surf,1,-1,0,1,1) 
v5 = AddVertex (surf,-1,1,0,0,0) 
AddTriangle (surf,v3,v4,v5)
UpdateNormals mesh
 
Ответить с цитированием
Старый 30.10.2005, 20:56   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
2jimon Не вижку различий между блиттером и спрайтом у которого установлен режим "независим от камеры" - free тобишь. Может объяснишь в чем разница по конкретнее?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 30.10.2005, 22:39   #11
jimon
 
Сообщений: n/a
спрайт рисуется 2д системой
а блиттер ето 3д иденица

у maxusа вышло что блиттеры быстрее спрайтов
у меня наоборот

я непонимаю
 
Ответить с цитированием
Старый 30.10.2005, 23:12   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Originally posted by jimon@Oct 30 2005, 10:39 PM
спрайт рисуется 2д системой
а блиттер ето 3д иденица

у maxusа вышло что блиттеры быстрее спрайтов
у меня наоборот

я непонимаю
Я бы попробовал создавать много блиттеров в одном меше, храня в какихнить списках номера вертексов. Передвигал и поворачивал бы их с помощью VertexCoords.

Думаю так быстрее намного будет, только сложнее на столькоже

больше мыслей нет

PS: в своей игрухе я так делал, только не двигал ничего, просто заново создавал часть карты
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 30.10.2005, 23:55   #13
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответь мне тогда еще на один вопрос:

Если спрайт это 2D единица, то прокоментируй следующее (это из справки по блитцу):

Sprites have two real strengths. The first is that they consist of only two polygons; meaning you can use many of them at once. This makes them ideal for particle effects and 2D-using-3D games where you want lots of sprites on-screen at once.
Краткий перевод: У спрайтов два достоинства: 1-имеет два полигона, 2-идеален для создания частиц.

PS: просто немогу понять, как может 2Д единица иметь два полигона

PS2: И почему спрайтов нет в Blitz Basic 2D?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 31.10.2005, 00:09   #14
НУБ
Бывалый
 
Регистрация: 22.09.2005
Сообщений: 634
Написано 36 полезных сообщений
(для 102 пользователей)
PАХ:
Спрайт - это не 2д единица, а 3д - квад из 2х поликов(но можно и 1), кот-й может быть повёрнут к камере.
в блице они организованы как отдельные объекты, поэтому тормозят.
так что их полюбому нужно делать как сингл-сурфейс :)
(Offline)
 
Ответить с цитированием
Старый 31.10.2005, 18:58   #15
jimon
 
Сообщений: n/a
2 ньюб - посмотри мой код создания блиттера
он правильный ? ничего неможеж зделать \ предложить чтобы ускорить рендер ?

copyentity юзаю
в тесте создается только один блиттер
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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