Суббота, 20.04.2024, 14:27
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Категории каталога
BlitzMax [14]
Blitz3D [9]
BlitzPlus [0]
Xna [1]
DarkBasic [0]
Общее [3]
Наш опрос
Слушаете ли вы музыку?
1. Да
2. Иногда
3. Нет
Всего ответов: 25
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Статьи
Главная » Статьи » BlitzMax

Перевод Статьи "Сто одно Изображение"
Вы хотите загрузить стрип? (последовательность изображений в одном файле) .BlitzMax позволяет сделать это, но если вы хотите загрузить стрип, а потом использовать его как карту пикселей (Pixmap), вы будете должны знать, как работает класс TImage. Итак, для начала загрузим стрип:

Quote

Local myanimation:TImage=LoadAnimImage(myurl:Object,width,height,first,count,flags=-1)

Теперь мы должны извлечь карту пикселей. Для этого нам нужно получить доступ к полю Pixmap в типе TImage, а вернее в его копии, 'myanimation'. Чтобы это понять, нужно обратиться к коду объявление типа TImage: (Только без паники! Этот код не нужно копировать!)

Quote

Strict

Import "driver.bmx"

Import BRL.Data

Type TImage Extends TData

Field width,height,flags

Field mask_r,mask_g,mask_b

Field handle_x#,handle_y#

Field pixmaps:TPixmap[]

Field frames:TImageFrame[]

Field seqs[]

Method DataType:TImageDataType()

Return ImageDataType

End Method

Method Frame:TImageFrame( index )

If seqs[index]=GraphicsSeq Return frames[index]

frames[index]=_max2dDriver.CreateFrameFromPixmap( Lock(index,True,False),flags )

If frames[index] seqs[index]=GraphicsSeq Else seqs[index]=0

Return frames[index]

End Method

Method Lock:TPixmap( index,read,write )

If write

seqs[index]=0

frames[index]=Null

EndIf

If Not pixmaps[index]

pixmaps[index]=CreatePixmap( width,height,PF_RGBA8888 )

EndIf

Return pixmaps[index]

End Method

Method SetPixmap( index,pixmap:TPixmap )

If (flags & MASKEDIMAGE) And AlphaBitsPerPixel[pixmap.format]=0

pixmap=MaskPixmap( pixmap,mask_r,mask_g,mask_b )

EndIf

pixmaps[index]=pixmap

seqs[index]=0

frames[index]=Null

End Method

Function Create:TImage( width,height,frames,flags,mr,mg,mb )

Local t:TImage=New TImage

t.width=width

t.height=height

t.flags=flags

t.mask_r=mr

t.mask_g=mg

t.mask_b=mb

t.pixmaps=New TPixmap[frames]

t.frames=New TImageFrame[frames]

t.seqs=New Int[frames]

Return t

End Function

Function Load:TImage( url:Object,flags,mr,mg,mb )

Local pixmap:TPixmap=TPixmap(url)

If Not pixmap pixmap=LoadPixmap(url)

If Not pixmap Return

Local t:TImage=Create( pixmap.width,pixmap.height,1,flags,mr,mg,mb )

t.SetPixmap 0,pixmap

Return t

End Function

Function LoadAnim:TImage( url:Object,cell_width,cell_height,first,count,flags,mr,mg,mb )

Local pixmap:TPixmap=TPixmap(url)

If Not pixmap pixmap=LoadPixmap(url)

If Not pixmap Return

Local x_cells=pixmap.width/cell_width

Local y_cells=pixmap.height/cell_height

If first+count>x_cells*y_cells Return

Local t:TImage=Create( cell_width,cell_height,count,flags,mr,mg,mb )

For Local cell=first To first+count-1

Local x=cell Mod x_cells * cell_width

Local y=cell / x_cells * cell_height

Local window:TPixmap=pixmap.Window( x,y,cell_width,cell_height )

t.SetPixmap cell-first,window.Copy()

Next

Return t

End Function

End Type

Type TImageDataType Extends TDataType

Method Tag$()

Return "brl.max2d.TImage"

End Method

Method ReadObject:Object( stream:TStream )

Local image:TImage=New TImage

image.width=stream.ReadInt()

image.height=stream.ReadInt()

image.flags=stream.ReadInt()

image.mask_r=stream.ReadInt()

image.mask_g=stream.ReadInt()

image.mask_b=stream.ReadInt()

image.handle_x=stream.ReadFloat()

image.handle_y=stream.ReadFloat()

Local count=stream.ReadInt()

image.pixmaps=New TPixmap[count]

For Local i=0 Until count

image.pixmaps[i]=TPixmap( stream.ReadObject() )

Next

image.frames=New TImageFrame[count]

image.seqs=New Int[count]

End Method

Method WriteObject( o:Object,stream:TStream )

Local image:TImage=TImage(o)

stream.WriteInt image.width

stream.WriteInt image.height

stream.WriteInt image.flags

stream.WriteInt image.mask_r

stream.WriteInt image.mask_g

stream.WriteInt image.mask_b

stream.WriteFloat image.handle_x

stream.WriteFloat image.handle_y

stream.WriteInt image.pixmaps.length

For Local pixmap:TPixmap=EachIn image.pixmaps

stream.WriteObject pixmap

Next

End Method

End Type

Global ImageDataType:TImageDataType=New TImageDataType

Как вы могли заметить, поле Pixmap – массив. Итак, чтобы получить доступ к нему надо написать так:

Quote

Local myanimation:TImage=LoadAnimImage(myurl:Object,width,height,first,count,flags=-1)

Local pixmaps:TPixmap[]=myanimation.pixmaps

Все! Мы загрузили Pixmap! Теперь вы можете делать с ним что угодно! Вы можете присвоить стрипу некие особенности рендеринга, например, так:

Quote

Local myanimation:TImage=LoadAnimImage(myurl:Object,width,height,first,count,flags=-1)

Local pixmaps:TPixmap[]=myanimation.pixmaps

Local images:TImage[pixmaps.length]

For j=0 to pixmaps.length-1

images[j]=LoadImage(pixmaps[j])

Next

Категория: BlitzMax | Добавил: JohnK (27.03.2007) | Автор: ninjarat
Просмотров: 1719
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright JohnK© 2024