OOP problem with Bmax

BlitzMax Forums/BlitzMax Beginners Area/OOP problem with Bmax

Nathan(Posted 2005) [#1]
I can't get the following code to work. I created it to learn the basics of OOP. At the line e:enemy=e.create("bmax120.png") the execution stops without a message. Can anyone help me?

P.S: I can see the potential of Bmax but Blitzplus was a hell lot easier to learn.

Nathan.



Strict

Graphics 800,600,0


Global List:TList = New TList


Type enemy
	Field x:Int
	Field y:Int
	Field dx:Int
	Field dy:Int
	Field gfx:Timage
	
	Function Create:enemy(f:String)
		e:enemy=New enemy
		e.x=Rnd(0,799)
		e.y=Rnd(0,599)
		e.dx=1
		e.dy=1
		e.gfx=LoadImage(f)
		List.addlast e
		Return e
	End Function
	
	Method Draw()
		DrawImage(gfx,x,y)
		If x>800 Then dx=-1
		If x<0 Then dx=1
		If y>600 Then dx=-1
		If y<0 Then dy=1
		x=x+dx
		y=y+dy
	End Method
End Type

Global e:enemy
Global j:Int

'***** MAIN *****
DebugStop()
List:TList=CreateList()
For j=0 To 2
	e:enemy=e.create("bmax120.png")
Next

While Not KeyDown(KEY_ESCAPE)
	Cls
	DebugStop()
	For e:enemy=EachIn List
		e.draw()	
	Next
	Flip
	FlushMem
Wend
EndGraphics



tonyg(Posted 2005) [#2]
It stops without a message as you have debugstop. Without this you get an Unhandled exception (beta doesn't have full debugger).
You need to call...
e:enemy = enemy.create("bmax120.png")
<edit> In fact you only need...
enemy.create("bmax120.png")


Nathan(Posted 2005) [#3]
Sorry, I was not clear enough.
Debugstop() was only to get me to the debugger. Anyway if I take out this line and change the second line to Graphics 800,600,32 I get the same result the execution stops without ever reaching the while wend loop.


altitudems(Posted 2005) [#4]
Nathan, here is a version that works. I changed a few things cause I'm picky :) Let me know if you have any questions.
Strict

Global EnemyList:tList = CreateList()

Type tEnemy
	Field X:Float
	Field Y:Float
	Field VX:Float
	Field VY:Float
	Field Gfx:tImage
	
	Function Create:tEnemy(f:String)
		Local e:tEnemy=New tEnemy
		e.X=Rnd(0,799)
		e.Y=Rnd(0,599)
		e.VX=1
		e.VY=1
		e.Gfx=LoadImage(f)
		EnemyList.AddLast(e)
		Return e
	End Function
	
	Method Draw()
		DrawImage(Gfx,X,Y)
		If X>800 Then VX=-1
		If X<0 Then VY=1
		If Y>600 Then VY=-1
		If Y<0 Then VY=1
		X :+ VX
		Y :+ VY
	End Method
End Type


Graphics 800,600,0
AutoMidHandle (True) 
For Local i:Int = 0 To 2 'Creates 3
	tEnemy.Create("bmax120.png")
Next

While Not KeyDown(KEY_ESCAPE)
	Cls
	For Local e:tEnemy = EachIn EnemyList
		e.Draw()	
	Next
	Flip
	FlushMem
Wend
EndGraphics



tonyg(Posted 2005) [#5]
@Nathan, you missed this bit...
You need to call...
e:enemy = enemy.create("bmax120.png")
<edit> In fact you only need...
enemy.create("bmax120.png")


Nathan(Posted 2005) [#6]
@tonyg Thanks for clearing this up. I've got it working now.
@altitudems Thanks for the changes.

I'm slowly getting used to the syntax.

Nathan