Types in BlitzBasic = Class in Monkey?

Monkey Forums/Monkey Beginners/Types in BlitzBasic = Class in Monkey?

Dale(Posted 2014) [#1]
Hello again,

I am used to using "Types" in BlitzBasic, and I see in Monkey they are similar to Classes. Here I made a function that creates a new "fish":

Function NewLevel()
	Local f:fish = New fish
		f.x = 100
		f.y = Rnd(0,DeviceHeight())
		f.scale = .2
		f.img = LoadImage("fish.png")
End Function


But when I try to access it in Method OnRender() like this:
DrawImage f.img,f.x,f.y,0,f.scale,f.scale


It simply says identifier 'f' not found.

What is happening?


Raph(Posted 2014) [#2]
You made it local to that function.


Dale(Posted 2014) [#3]
I tried to use Global instead of Local but it just gave me an error.


Jesse(Posted 2014) [#4]
What kind of error?


Dale(Posted 2014) [#5]
Syntax error unexpected token 'global'


therevills(Posted 2014) [#6]
Try something like this:


Or use internal methods:



Jesse(Posted 2014) [#7]
Make sure you don't use Global inside a Method or a Function.


ziggy(Posted 2014) [#8]
You should take a look to variable scopes.

A local variable exists only in the block it is defined. As instance, if you declare a local variable into a Function, it won't be accesible from outside that function. If you declare a variable inside a While block, it won't be accesible outside the while block, if you declare a local variable inside a For loop, the same... etc...

Then there are global variables. Those variables, when they're defined outside a class and outside a function, they can be accessed form everywhere. They're "regular" globals.

And then, there are class members, which can be fields or globals too. Fields are memebers of each instance of a class, while globals inside classes are shared in all class instances.

Example:

Function Main()
   Local myItem:= New MyClass
   myItem.x = 100
   myItem.y = 200
   local myotherItem:= New MyClass
   myotherItem.x = 50
   myotherItem.y = 75
   Print myItem.x + ", " + myItem.y
   Print myotherItem.x + ", " + myotherItem.y
   MyClass.Score = 200
   Print myItem.Score
   Print myotherItem.Score
End

Class MyClass
    Global Score:Int = 0
    Field x:Int, y:Int
End



Dale(Posted 2014) [#9]
Thank you guys!

And how would I go about deleting each fish entity when I am done with it? (Like when it swims off the screen)


Midimaster(Posted 2014) [#10]
Use a LIST to have control over all fishes! In New() add the new fish to the list with LIST.ADDLAST(). Call the function DrawAll() instead of calling each single fish. Use CheckAll() to control, whether a fish should be removed. Remove the fishes with LIST.REMOVE()

Class Fish
	Field x:Float
	Field y:Float
	Field img:Image
	Field scale:Float
        Global Fishes:List<Fish>= New List<Fish>

	Method New(x:Float, y:Float, scale:Float, img:Image)
		self.x = x
		self.y = y
		self.scale = scale
		self.img = img
		Fishes.AddLast self
	End

	Function DrawAll:Void()
		For local locFish:Fish = Eachin Fishes
			locFish.Draw()
		Next
	End

	Method Draw:Void()
		DrawImage(img, x, y, 0, scale, scale)
	End

	Function CheckAll:Void()
		For local locFish:Fish = Eachin Fishes
			If locFish.y<0 Fishes.Remove locFish
		Next
	End
End