need help at Eachin :-(

BlitzMax Forums/BlitzMax Beginners Area/need help at Eachin :-(

hello,

finaly i found some time to test bmax.
before i used b+, but as i must see lots changed.

so here some code that doesn't work as i thought it would.

Incbin "player1.png"
Incbin "player2.png"

Graphics 640,480,,2

Global Anim1 = LoadAnimImage("incbin::player1.png",48,64,0,10)
Global Anim2 = LoadAnimImage("incbin::player2.png",48,64,0,10)

Type AniFig
Field Frame
Field X
Field Y
Field Speed
Field GFX
Field Timer1
Field Name$
Field RandomCase
Field Direction
Field Steps
Field PathX1
Field PathY1
Field PathX2
Field PathY2
End Type

Global Fig:AniFig

Fig = New Anifig
Fig.X = 150
Fig.Y = 370
Fig.Frame = 0
Fig.Speed = 50
Fig.GFX = Anim1
Fig.Timer1 = MilliSecs()
Fig.Name$ = "Heidi"
'SeedRnd MilliSecs()
Fig.RandomCase = Rnd(0,10000)
Fig.Direction = 1
Fig.Steps = 0
MidHandleImage Fig.GFX
Fig.PathX1=100
Fig.PathY1=32+Fig.Y
Fig.PathX2=400
Fig.PathY2=32+Fig.Y
'Delay 235

Fig = New Anifig
Fig.X = 350
Fig.Y = 290
Fig.Frame = 0
Fig.Speed = 100
Fig.GFX = Anim2
Fig.Timer1 = MilliSecs()
Fig.Name$ = "Jolly"
SeedRnd MilliSecs()
Fig.RandomCase = Rnd(0,10000)
Fig.Direction = 1
Fig.Steps = 0
MidHandleImage Fig.GFX
Fig.PathX1=200
Fig.PathY1=32+Fig.Y
Fig.PathX2=600
Fig.PathY2=32+Fig.Y

MainLoop()

Function MainLoop()
SetClsColor 255,200,10
While Not KeyHit(27)
Cls
Animate()
Flip
Wend
End Function

Function Animate()
For Fig:Anifig = EachIn AniFig
SetColor 0,0,0

DrawText Fig.Name,Fig.X,Fig.Y - 33

SetColor 255,0,0
DrawLine Fig.PathX1,Fig.PathY1,Fig.PathX1,Fig.PathY2-30
DrawLine Fig.PathX2,Fig.PathY1,Fig.PathX2,Fig.PathY2-30
DrawLine Fig.PathX1,Fig.PathY1,Fig.PathX2,Fig.PathY2
SetColor 255,255,255

If fig.Direction = 1 Then SetScale(1,1)
If fig.Direction = 0 Then SetScale(-1,1)

'SetRotation(180)
DrawImage(Fig.GFX,Fig.X,Fig.Y,Fig.Frame)
SetRotation(0)
SetScale(1,1)

If Fig.Frame = 7 Then Fig.Frame = 0
If MilliSecs() > Fig.Timer1 + Fig.Speed Then
If Fig.X >= Fig.PathX2-12 Then
Fig.Direction = 0
End If
If Fig.X <= Fig.PathX1+12 Then
Fig.Direction = 1
End If
If Fig.Direction = 1 Then
Fig.X = Fig.X + 5
End If
If Fig.Direction = 0 Then
Fig.X = Fig.X - 5
End If
Fig.Steps = Fig.Steps +1
Fig.Frame = Fig.Frame +1
If Fig.Frame = 4 Then Fig.Frame = 5
Fig.Timer1 = MilliSecs()
End If
Next
End Function

can someone tell me please whats wrong in the line

For Fig:Anifig = EachIn AniFig

thanks

In BlitzMax user-defined types don't have they're own hidden list to keep track of them, you have to make one yourself. So what you can do is somewhere near the top create a list to use to keep track of all your objects:

Global anifig_list:TList = CreateList()


Then, whenever you create a new AniFig, you just add it to the list:

Local Fig:AniFig = New AniFig
ListAddLast(anifig_list, Fig)


To cycle through each AniFig you use EachIn on the list:

For Local Fig:AniFig = EachIn anifig_list


And there you go! Hope it helps!

thank you so much...
now i got it ... well this one ... :-))

can I suggest holding the list inside the type?
And maybe moving the animate function inside it as well.

Type AniFig
	Global list:TList
	Field Frame:Int
	Field X:Float
	Field Y:Float
	Field Speed:Int
	Field GFX:TImage
	Field Timer1:Int
	Field Name:String
	Field RandomCase:Int
	Field Direction
	Field Steps
	Field PathX1
	Field PathY1
	Field PathX2
	Field PathY2
	
	Function Create:AniFig(X:Float , Y:Float , Speed:Int , GFX:TImage , Name:String , PathX1:Float , PathY1:Float , PathX2:Float , PathY2:Float)
		If Not list Then list:TList = New TList
		Local temp:AniFig = New AniFig
			temp.Frame = 0
			temp.X = X
			temp.Y = Y
			temp.Speed = Speed
			temp.GFX = GFX
			temp.Timer1 = MilliSecs()
			temp.Name = Name
			temp.RandomCase = Rand(0 , 10000)
			temp.Direction = 1
			temp.Steps = 0
			temp.PathX1=PathX1
			temp.PathY1=PathY1+temp.Y
			temp.PathX2=PathX2
			temp.PathY2=PathY2+temp.Y
		Return temp
	End Function
	

	Function Animate()
		For Fig:Anifig = EachIn list
			SetColor 0,0,0
			
			DrawText Fig.Name,Fig.X,Fig.Y - 33
			
			SetColor 255,0,0
			DrawLine Fig.PathX1,Fig.PathY1,Fig.PathX1,Fig.PathY2-30
			DrawLine Fig.PathX2,Fig.PathY1,Fig.PathX2,Fig.PathY2-30
			DrawLine Fig.PathX1,Fig.PathY1,Fig.PathX2,Fig.PathY2
			SetColor 255,255,255
			
			If fig.Direction = 1 Then SetScale(1,1)
			If fig.Direction = 0 Then SetScale(-1,1)
			
			'SetRotation(180)
			DrawImage(Fig.GFX,Fig.X,Fig.Y,Fig.Frame)
			SetRotation(0)
			SetScale(1,1)
			
			If Fig.Frame = 7 Then Fig.Frame = 0
			If MilliSecs() > Fig.Timer1 + Fig.Speed Then
			If Fig.X >= Fig.PathX2-12 Then
				Fig.Direction = 0
			End If
			If Fig.X <= Fig.PathX1+12 Then
				Fig.Direction = 1
			End If
			If Fig.Direction = 1 Then
				Fig.X = Fig.X + 5
			End If
			If Fig.Direction = 0 Then
				Fig.X = Fig.X - 5
			End If
			Fig.Steps = Fig.Steps +1
			Fig.Frame = Fig.Frame +1
			If Fig.Frame = 4 Then Fig.Frame = 5
				Fig.Timer1 = MilliSecs()
			End If
		Next
	End Function
End Type




You can then instantiate a AniFig type with
Global fig1:AnimFig = AniFig.Create(350, 290, 50, Anim1, "Heidi", 100, 32, 400 ,32) 

And it will have all the default fields set for it.

To animate:
Anifig.Animate()

And to loop through the type list (if you haven't spotted it in the animate function).

For Local fig:Anifig = Eachin AniFig.list


Note that the above code is untested, but the principle is there.

thank you, i was busy the last time. i will test it as soon as possible.

i thought that blitz max would be es easy as blitz plus...but there is a long way for me to find out how i can use it :-))

Look here:
http://www.blitzbasic.com/Community/posts.php?topic=50285