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

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

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

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

Хочу сделать функцию для создания эффекта ряби на воде. Думаю смотреть надо в сторону pixmap'ов. Как вы считаете стоит ли ее создавать, или такая функция нагрузит процессор? Так же буду рад помощи в создании этой функции...

Type Effect
    Field x
%, y%, r%, t%, rnx%, rny%, timer%
    
Field myi%,myj% = 0
    Field mypm1
:TPixmap,mypm2:TPixmap
    Field myimg
:TImage
    Method Draw
()
        
mypm1=CreatePixmap(r*2,r*2,PF_RGBA88884)
        
mypm2=CreatePixmap(r*2,r*2,PF_RGBA88884)
        
mypm1=GrabPixmap(x-r,y-r,r*2,r*2)
        For 
myi=0 To r*2-1
            
For myj=0 To r*2-1
                rnx
=10-Rand(5)
                
rny=10-Rand(5)
                If 
myi+rnx>r*2-1 Then rnx=0
                
If myj+rnx>r*2-1 Then rnx=0
                
If myi+rnx<0 Then rnx=0
                
If myj+rnx<0 Then rnx=0
                
                
If myi+rny>r*2-1 Then rny=0
                
If myj+rny>r*2-1 Then rny=0
                
If myi+rny<0 Then rny=0
                
If myj+rny<0 Then rny=0
                mypm2
.WritePixel(myi,myj,mypm1.ReadPixel(myi+rnx,myj+rny))
            
Next
        Next
        DrawPixmap mypm2
x-r+5y-r+5
    EndMethod
    
Function Create(x%,y%,r%,t%)
        
Local NewEffect:Effect = New Effect
        NewEffect
.x=x
        NewEffect
.y=y
        NewEffect
.r=r
        NewEffect
.timer=MilliSecs()
        
NewEffect.t=t
        EffectList
.AddLast NewEffect
    EndFunction
    Method destroy
()
        
EffectList.remove(Self)
    
EndMethod
EndType 
Эффект конечно требует доработки, а так же начинает поддтормаживать при радиусе больше 64 пикселей...
__________________
OS: Ubuntu Linux 11.04
CPU: Intel® Core™ 2 Quad Q9000 (2.0GHz, 1066MHz, 6Mb)
RAM: DDR2 SODIMM 4096 Мб
Video: NVIDIA® GeForce® GT240M 1024 Мб

Последний раз редактировалось xmarat, 03.08.2011 в 21:08.
(Offline)
 
Ответить с цитированием
Старый 03.08.2011, 00:48   #2
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Рябь на воде

Че за нахер?
(Offline)
 
Ответить с цитированием
Старый 03.08.2011, 00:54   #3
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: Рябь на воде

Зачем сразу нахер? Просто предлагаю написать функцию...
__________________
OS: Ubuntu Linux 11.04
CPU: Intel® Core™ 2 Quad Q9000 (2.0GHz, 1066MHz, 6Mb)
RAM: DDR2 SODIMM 4096 Мб
Video: NVIDIA® GeForce® GT240M 1024 Мб
(Offline)
 
Ответить с цитированием
Старый 03.08.2011, 00:54   #4
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Рябь на воде

пиксмапы на блицмаксе это медленно, хотя если научишься шустро менять пиксели на картинке over 256x256, обязательно отпишись)
__________________
(Offline)
 
Ответить с цитированием
Старый 03.08.2011, 01:01   #5
xmarat
Нуждающийся
 
Регистрация: 11.07.2011
Сообщений: 64
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: Рябь на воде

Ну я думал если получится сюда выложить. Буду постепенно менять первое сообщение, поправляйте если что...
__________________
OS: Ubuntu Linux 11.04
CPU: Intel® Core™ 2 Quad Q9000 (2.0GHz, 1066MHz, 6Mb)
RAM: DDR2 SODIMM 4096 Мб
Video: NVIDIA® GeForce® GT240M 1024 Мб
(Offline)
 
Ответить с цитированием
Старый 06.08.2011, 15:53   #6
Черный крыс
 
Сообщений: n/a
Ответ: Рябь на воде

Пиксмапы хранятся в ОЗУ, поэтому будет очень медленно.
ОЗУ->Перегонка данных пиксмапа по шине в видяху->Билд пиксмапа в видеопамяти в текстуру OpenGL\DirectX - вот такая получается длинная дорожка.

Думаю тебе известно что GAPI хранит текстуры в видеопамяти - это копии пиксмапов переведенные в формат графической библиотеки, и именно от них надо плясать, нет ничего сложного чтобы прочесть\записать данные напрямую в видеопамяти.

БлицМакс хранит текстуры здесь :
image.Frame(frame).name
Это адрес в видеопамяти но напрямую обращатся к нему нельзя доступ к текстуре обеспечивает графическая библиотека что то наподобии этого :

Local frame:TD3D7ImageFrame = TD3D7ImageFrame(image.Frame(0))
Local pixels:Byte Ptr = MemAlloc(16*16*driver.GetPitch(frame.name))
driver.Lock(frame.name, D3D_READONLY)
driver.Read([0, 0, 16, 16], frame.name, Varptr pixels[0])
driver.UnLock(frame.name)
Предупреждаю - это псевдокод, поэтому надо разбиратся - но общая картина такова.

А вообще Анимированая текстура - тру_решение.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Reizel (07.08.2011)
Старый 07.08.2011, 10:24   #7
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Рябь на воде

СПасибо, надо будет порыть в этом направлении..
+ ему не нужно анимированной текстуры - он просто хочет динамически прогонять эффекты по пиксмапе, тут анимированных картинок не хватит)))
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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