Есть спрайтщит (картинка с кадрами анимации), делаем LoadImage и:
1-й вариант — DrawImageRect
2-й вариант — GrabImage и DrawImage
какой из вариантов лучше и почему? Какова производительность обоих вариантов?
Есть спрайтщит (картинка с кадрами анимации), делаем LoadImage и:
1-й вариант — DrawImageRect
2-й вариант — GrabImage и DrawImage
какой из вариантов лучше и почему? Какова производительность обоих вариантов?
GrabImage — создает новое изображение путем захвата заданной прямоугольной области исходного изображения. Важно заметить, что при этом изображение не является копией исходного изображения, а лишь ссылается на него.
Использование:
— Получение изображений из текстурного атласа
DraImageRect — позволяет выводить на экран заданную прямоугольную область изображения.
Использование:
— Вывод на экран прямоугольной области изображения
— Анимация изображений, с непостоянным размером кадра
Для анимации изображений с постоянным размером кадра удобнее всего использовать стандартные средства класса Image. Для этого достаточно при загрузке изображения указать количество кадров, и при вызове DrawImage указать номер кадра для отображения.
Создаю скриншот в игре ,но не умею его сохранять в папку data
@serg Создаю скриншот в игре ,но не умею его сохранять в папку data
В Monkey нет функции сохранения скриншота. Самый простой способ сохранить массив пикселей в самый простейший формат bmp. Но это не будет работать для HTML5
А как ты сохраняешь массив в формате bmp?
У меня была мысль конвертировать целочисленный массив в строку ,а затем уже сохранить но конвертация пока мне не удаётся...
Нужен пример...
Чтобы сохранить массив байт нужно использовать databuffer. К тому же в bmp есть обязательные заголовки. Вот рабочий пример найденный на оф. форуме
Import brl.databuffer
Import brl.filestream
Class BmpFile
Field Width:Int ' bmp image width
Field Height:Int ' bmp image height
Field Pixels:Int[1] ' array for screen pixels
Field FileSize:Int ' bmp file size
Field Buffer:DataBuffer ' bmp file data (header + pixels)
Field PadLineWidth:Int ' bmp real line size
' default header for 24bpp image
Field Header:Int[] = [ $42,$4D,$D6,$83,$00,$00,$00,$00,$00,$00,$36,$00,$00,$00,$28,$00,$00,$00,$6C,$00,$00,$00,$68,$00,$00,
$00,$01,$00,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C3,$0E,$00,$00,$C3,$0E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ]
Const FILE_SIZE := $2
Const IMAGE_WIDTH := $12
Const IMAGE_HEIGHT := $16
Const RAW_DATA_SIZE := $22
Method Grab:Void( x:Int, y:Int, w:Int, h:Int ) ' Call within OnRender after drawing the image to grab
Width = w
Height = h
PadLineWidth = (((Width*3) + 3) / 4) * 4
Pixels = Pixels.Resize( Width * Height )
ReadPixels Pixels, x, y, Width, Height
FileSize = Header.Length() + PadLineWidth * Height
Buffer = New DataBuffer( FileSize )
local ptr:Int
for ptr = 0 until Header.Length
Buffer.PokeByte ptr, Header[ptr]
next
Buffer.PokeInt FILE_SIZE, FileSize
Buffer.PokeInt IMAGE_WIDTH, Width
Buffer.PokeInt IMAGE_HEIGHT, Height
Buffer.PokeInt RAW_DATA_SIZE, PadLineWidth * Height
local i:Int = 0
local pix:Int
for local ys:Int = 0 until Height
ptr = (Height - ys - 1) * PadLineWidth + Header.Length
for local xs:Int = 0 until Width
pix = Pixels[i]
Buffer.PokeByte ptr+0, pix & $ff
Buffer.PokeByte ptr+1, (pix shr 8) & $ff
Buffer.PokeByte ptr+2, (pix shr 16) & $ff
ptr += 3
i += 1
next
next
End
Method Save:Void( filename:String ) ' filename without .bmp
Local file:=FileStream.Open( "monkey://internal/"+filename+".bmp","w" )
If file
file.Write Buffer, 0, FileSize
file.Close
Endif
End
End
Использование:
bmp = New BmpFile()
bmp.Grab(0, 0, DeviceWidth, DeviceHeight) 'этот метод обязательно выполняется в OnRender
bmp.Save("screenshot")
Изучив код можно адаптировать для сохранения произвольного массива данных