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

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

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

Ответ
 
Опции темы
Старый 18.06.2007, 23:01   #1
jimon
 
Сообщений: n/a
TAnimImage

простой тип для автоматической анимации анимированых картинок
мне понадобился чтобы везде не заморачиватся с кодом

в типе сделано фпс независимая реализация
потому даже со стабилизацией фпс заморачиватся не стоит

Type TAnimImage
	
	Field AnimationSpeed# ' in milisec per frame  , for example 1000/12 or 1000/25
	Field Image:TImage
	Field LastAnimationTime#
	Field Frame#
	Field StartCell%
	Field CellCount%
	
	Method Free()
		Image = Null
	End Method

	Method Draw(x#,y#,fr% = -1)
		If fr <> - 1 Then Frame = fr
		
		DrawImage Image,x,y,Frame
		
		If ( MilliSecs() - LastAnimationTime) => AnimationSpeed  Then
			Frame:+ (Float(MilliSecs() - LastAnimationTime))/AnimationSpeed
			LastAnimationTime = MilliSecs()
			If Frame >= CellCount Then Frame = StartCell
		End If
	End Method
	
	Function CreateAnimImage:TAnimImage(Img:TImage,Speed#,StartCell%,CellCount%)
		Local AnImg:TAnimImage = New TAnimImage
		
		AnImg.AnimationSpeed = 1000.0 / Speed
		AnImg.Image = Img
		AnImg.LastAnimationTime = MilliSecs()
		AnImg.StartCell = StartCell
		AnImg.CellCount = CellCount
		AnImg.Frame = StartCell
		
		Return AnImg
	End Function


End Type

примерный код как использовать (писал просто в браузере)
' 25 - ето 25 кадров в секунду
Img:TAnimImage = TAnimImage.CreateAnimImage(our_img,25,0,10)

while not keyhit(key_escape)
cls
Img.Draw(0,0)
flip
wend

Img.Free()
Img = Null
ps. я решил использовать свой метод Free для того чтобы избежать
потери памяти на кросслинках
 
Ответить с цитированием
Старый 19.06.2007, 01:19   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: TAnimImage

Image = Null
Если не загружаешь картинку каждый раз, а присваиваешь к переменной хандл картинки, создаётся копия, или просто "указатель"?
(Offline)
 
Ответить с цитированием
Старый 19.06.2007, 02:36   #3
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Re: TAnimImage

правильней написать так:
Method Delete() 'стандартный деструктор вызываемый при удалении объекта
    Image = Null
End Method

'поэтому в программе чтобы удалить объект достаточно написать
img=Null 'а деструктор Delete вызовется автоматически.\
__________________
(Offline)
 
Ответить с цитированием
Старый 19.06.2007, 02:36   #4
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Re: TAnimImage

Указатель, вроде.
(Offline)
 
Ответить с цитированием
Старый 19.06.2007, 10:39   #5
jimon
 
Сообщений: n/a
Re: TAnimImage

SBJoker
такой метод у меня дал течь в виндовском менеджере ... хотя блицовский манагер молчал ... потому пришлось принимать меры ..

MoKa
указатель
 
Ответить с цитированием
Старый 19.06.2007, 13:17   #6
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Re: TAnimImage

Хех, течь у него, а ты GCollect вызывал? Вот именно, что нет значит сборщик мусора отложил это на дальнюю перспективу..
__________________
(Offline)
 
Ответить с цитированием
Старый 19.06.2007, 13:21   #7
jimon
 
Сообщений: n/a
SBJoker
щитаеш меня за идиота ? естествено что вызывал
иначе бы память во внутренем манагере прыгала
а так она оставалась всегда константой ...
а память в виндовском манагере откровенно текла

ну вот смотри ... и обьсяни тогда мои наблюдения :

тестовый код
Framework brl.GLMax2D
Import BRL.PNGLoader 
Import brl.jpgloader

Type TResourceImage
	Field Image:TImage
	
	Method Delete()
		DebugLog "eta hren tozhe vizivaetsa ! "
		Image = Null
	End Method
	
	Function LoadResource:TResourceImage(file$)
		Local Res:TResourceImage = New TResourceImage
		Res.Image = LoadImage(file)
		Return Res
	End Function
End Type

Global ResourceManager:TResourceManager

Type TResourceManager

	Field Resources:TList
	
	Method Delete()
		DebugLog "eta hren vizivaetsa ! "
		Resources.Clear()
		Resources = Null
	End Method
	
	Method CreateNewResource(File$)
		Local Res:TResourceImage
		Res = TResourceImage.LoadResource(File)
		Resources.AddLast Res
	End Method
	
	Method LoadResources()
		CreateNewResource("circlefont.png")
	End Method
	
	Function CreateResourceManager()
		 ResourceManager = New TResourceManager
		 ResourceManager.Resources = New TList
	End Function

End Type



Graphics 100,100

GCCollect()

While Not KeyHit(KEY_ESCAPE) Or AppTerminate() 

TResourceManager.CreateResourceManager()
GCCollect()
ResourceManager.LoadResources()
GCCollect()
ResourceManager = Null
GCCollect()

DebugLog GCMemAlloced()

Wend
End
память во внутренем манагере не течет
нажимаем ctrl+alt+del и смотрим там скока ета тварь жрет памяти
оказывается что жрет по наростающей ...

коментируем строчку Import brl.jpgloader
пробуем опять, память не течет ... вопрос какого хрена ?!

ps. как потом оказалось ... (я ету проблемму пару дней тому назад решал)
что собстенно методы Delete \ Free не решают етой проблеммы
так что принципиально я использую Free чтобы избавится от кросслинков
 
Ответить с цитированием
Старый 19.06.2007, 15:10   #8
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: TAnimImage

Там какая-то течь была с PNG загрузчиком.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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