I have this little program:
------------------------------------------------------
Strict
'STANDAR TYPE FOR ALL GRAPHICAL OBJECTS:
Type Base Abstract
Global Elements:Int
Field X:Float
Field Y:Float
Method New()
'EVERYTIME A GRAPHICAL OBJECT IS CREATED; IT IS COUNTED:
Elements:+1
End Method
End Type
'EVERY STAR IS AN OBJECT:
Type Star Extends Base 'IT EXTENDS BASE BECOUSE IT IS A GRAPHICAL OBJECT
Field Speed:Float 'EVERY STAR HAS ITS OWN SPEED
Field Parent:Sky 'EVERY STAR IS ALLOCATED INSIDE AN SKY OBJECT
Field ColorIntensity:Int
Method New()
Speed = Rand(1001,1020)/1000.0 'WHEN A STAR IS CREATED, A RANDOM SPEED IS ASSIGNED TO IT
ColorIntensity = Rand(105,255)
x=Rand(0,GraphicsWidth()) 'IT IS PLACED ON THE SCREEN
y=Rand(0,GraphicsHeight())
End Method
Method Move() 'THIS IS CALLED TO MOVE STARS.
Local OldX,OldY
OldX = X
OldY = Y
' self.x=(self.x-GraphicsWidth()/2)*Speed+GraphicsWidth()/2'
' self.y=(self.y-GraphicsHeight()/2)*Speed+GraphicsHeight()/2
self.x=(self.x-MouseX())*Speed+MouseX()
self.y=(self.y-MouseY())*Speed+MouseY()
'IF A STAR IS OUT OF BOUNDS, IT IS DESTROYED
If ((self.x<0) Or (self.x>GraphicsWidth()) Or (self.y<0) Or (self.y>GraphicsHeight()))
parent.DeleteStar(Self)
Else
SetColor(ColorIntensity,ColorIntensity,ColorIntensity)
DrawLine(X,Y,OldX,OldY) 'We draw the star
EndIf
End Method
End Type
Type Sky Extends base
Field Stars: TList 'A LIST OF ALL STARS INSIDE THE SKY
Field StarNum:Int 'THE NUMBER OF STARS THE SKY OBJECT WILL OWN
Method New()
Stars = New TList 'START DE STARS COLLECTION
Local i:Int=0
Starnum = 500
For i=1 To Starnum
addstar()
Next
End Method
Method AddStar()
Local I:Star=New Star 'WE CREATE A NEW STAR
i.parent = Self 'WE TELL THE NEW STAR THIS SKY IS ITS PARENT
Stars.AddLast I 'WE ADD THE NEW STAR IN THE STARS LIST.
End Method
Method Update()
Local Counter:Int = 0 'STAR COUNTER
Local j:Int=0 'FOR - NEXT INDEX
Local i:star 'STAR TYPE DECLARATION
For i:star= EachIn stars 'WE GO THROUG ALL STARS LIST, MOVING EVERY STAR.
Counter:+1
i.move()
Next
i = Null ' WE FREE THE I VARIABLE AND ITS STAR OBJECT.
For j = counter To starnum 'WE CREATE AS MUCH STARS AS NEEDED TO REPOSE THE ONES WHO HAVE DIED.
addstar
Next
End Method
Method DeleteStar(StarToDelete:Star)
Stars.remove (StarToDelete) 'WE REMOVE THE STAR FROM THE COLLECTION
Elements:-1 'UPDATE ELEMENTS COUNTER (ELEMENTS IS INSIDE BASE TYPE DECLARATION AND IT IS ACCESIBLE THROUG ALL OBJECTS THAT EXTEND BASE).
End Method
End Type
Graphics 1024,768
HideMouse
Local mysky:sky=New sky
Local FrameTimer:Float=MilliSecs()
While Not KeyHit(27)
Cls
FlushMem
mysky.update()
DrawOval(MouseX()-5,MouseY()-5,10,10)
'DrawText MemAlloced(), 1,1
While MilliSecs () < FrameTimer + 35
Wend
FrameTimer = MilliSecs ()
Flip
Wend
EndGraphics
'---------------
If i put the FlushMem inside the method Update of the object SKY, FlushMem doesn't do anything. I don't know wht, but it just doesn't do anything, and memAlloced() grows ad grows non stop, but when I put ir in the main loop (where it is now) it works ok. My question is:
WHY?
------------------------------------------------------
Strict
'STANDAR TYPE FOR ALL GRAPHICAL OBJECTS:
Type Base Abstract
Global Elements:Int
Field X:Float
Field Y:Float
Method New()
'EVERYTIME A GRAPHICAL OBJECT IS CREATED; IT IS COUNTED:
Elements:+1
End Method
End Type
'EVERY STAR IS AN OBJECT:
Type Star Extends Base 'IT EXTENDS BASE BECOUSE IT IS A GRAPHICAL OBJECT
Field Speed:Float 'EVERY STAR HAS ITS OWN SPEED
Field Parent:Sky 'EVERY STAR IS ALLOCATED INSIDE AN SKY OBJECT
Field ColorIntensity:Int
Method New()
Speed = Rand(1001,1020)/1000.0 'WHEN A STAR IS CREATED, A RANDOM SPEED IS ASSIGNED TO IT
ColorIntensity = Rand(105,255)
x=Rand(0,GraphicsWidth()) 'IT IS PLACED ON THE SCREEN
y=Rand(0,GraphicsHeight())
End Method
Method Move() 'THIS IS CALLED TO MOVE STARS.
Local OldX,OldY
OldX = X
OldY = Y
' self.x=(self.x-GraphicsWidth()/2)*Speed+GraphicsWidth()/2'
' self.y=(self.y-GraphicsHeight()/2)*Speed+GraphicsHeight()/2
self.x=(self.x-MouseX())*Speed+MouseX()
self.y=(self.y-MouseY())*Speed+MouseY()
'IF A STAR IS OUT OF BOUNDS, IT IS DESTROYED
If ((self.x<0) Or (self.x>GraphicsWidth()) Or (self.y<0) Or (self.y>GraphicsHeight()))
parent.DeleteStar(Self)
Else
SetColor(ColorIntensity,ColorIntensity,ColorIntensity)
DrawLine(X,Y,OldX,OldY) 'We draw the star
EndIf
End Method
End Type
Type Sky Extends base
Field Stars: TList 'A LIST OF ALL STARS INSIDE THE SKY
Field StarNum:Int 'THE NUMBER OF STARS THE SKY OBJECT WILL OWN
Method New()
Stars = New TList 'START DE STARS COLLECTION
Local i:Int=0
Starnum = 500
For i=1 To Starnum
addstar()
Next
End Method
Method AddStar()
Local I:Star=New Star 'WE CREATE A NEW STAR
i.parent = Self 'WE TELL THE NEW STAR THIS SKY IS ITS PARENT
Stars.AddLast I 'WE ADD THE NEW STAR IN THE STARS LIST.
End Method
Method Update()
Local Counter:Int = 0 'STAR COUNTER
Local j:Int=0 'FOR - NEXT INDEX
Local i:star 'STAR TYPE DECLARATION
For i:star= EachIn stars 'WE GO THROUG ALL STARS LIST, MOVING EVERY STAR.
Counter:+1
i.move()
Next
i = Null ' WE FREE THE I VARIABLE AND ITS STAR OBJECT.
For j = counter To starnum 'WE CREATE AS MUCH STARS AS NEEDED TO REPOSE THE ONES WHO HAVE DIED.
addstar
Next
End Method
Method DeleteStar(StarToDelete:Star)
Stars.remove (StarToDelete) 'WE REMOVE THE STAR FROM THE COLLECTION
Elements:-1 'UPDATE ELEMENTS COUNTER (ELEMENTS IS INSIDE BASE TYPE DECLARATION AND IT IS ACCESIBLE THROUG ALL OBJECTS THAT EXTEND BASE).
End Method
End Type
Graphics 1024,768
HideMouse
Local mysky:sky=New sky
Local FrameTimer:Float=MilliSecs()
While Not KeyHit(27)
Cls
FlushMem
mysky.update()
DrawOval(MouseX()-5,MouseY()-5,10,10)
'DrawText MemAlloced(), 1,1
While MilliSecs () < FrameTimer + 35
Wend
FrameTimer = MilliSecs ()
Flip
Wend
EndGraphics
'---------------
If i put the FlushMem inside the method Update of the object SKY, FlushMem doesn't do anything. I don't know wht, but it just doesn't do anything, and memAlloced() grows ad grows non stop, but when I put ir in the main loop (where it is now) it works ok. My question is:
WHY?