Initializing a Custom Type Array

BlitzMax Forums/BlitzMax Beginners Area/Initializing a Custom Type Array

Macguffin(Posted 2008) [#1]
Hi all,

I'm working on a card game right now, and am creating a player type that (amongst other things) will keep track of their hand of 5 card objects.

I'm not sure why, but while the first example below compiles, while the second one doesn't. Can anyone help me figure out why? Thanks much.

Type TPlayer
	
	Field playerHand:TCard[] = New TCard[5] 
	
End Type


(This next one doesn't work - I get "Expecting expression but encountered '='")

Type TPlayer
	
	Field playerHand:TCard[] 
	
	Function Create()   'instantiates a player
	
		playerHand[] = New TCard[5] 
	
	End Function
End Type



jsp(Posted 2008) [#2]
Change the function into a method and don't use the [] for the array, it's already defined in the Field

Type TPlayer
	
	Field playerHand:TCard[] 
	
	Method Create()   'instantiates a player
	
		playerHand = New TCard[5] 
	
	End Method 
End Type



tonyg(Posted 2008) [#3]
... I would do the following :
Type TPlayer
	
	Field playerHand:TCard[] 
	
	Function Create()   'instantiates a player
		Local temp:TPlayer = New TPlayer
		temp.playerHand = New TCard[5] 
	End Function
	
End Type

Depending on the rest of the program I might even make the temp.playerhand assignment the return from another function/method call.


jsp(Posted 2008) [#4]
Yep that's correct! Overlooked the 'instantiates a player
comment.


Macguffin(Posted 2008) [#5]
Ok. I follow what you are doing, tonyg, but I'm not sure why. Can you explain why you'd do it that way, please? I'm assuming it's a cleaner way to do things, but I'm not positive on what's underpinning it.

Also - you guys understand why the original way I had it doesn't compile?

Thanks very much for the help.


Czar Flavius(Posted 2008) [#6]
I think tonyg misssed this out:
Type TPlayer
	
	Field playerHand:TCard[] 
	
	Function Create:TPlayer()   'instantiates a player
		Local temp:TPlayer = New TPlayer
		temp.playerHand = New TCard[5]
		Return temp
	End Function
	
End Type


To make a new player, do this
main code blah blah
Local aplayer:TPlayer = TPlayer.Create()
aplayer.blahblahblah



Don't forget that = New TCard[5] sets up an array, but doesn't set up the cards inside. You need to to this seperately. If you don't know how I can tell you.

A create function like this is useful because you can add some parameters for your new object. Here's a make believe example:

Type TPlayer
	
	Field playerHand:TCard[] 
	
	Function Create:TPlayer(numCards:Int)   'instantiates a player
		Local temp:TPlayer = New TPlayer
		temp.playerHand = New TCard[numCards]
		Return temp
	End Function
	
End Type

Local aplayer:TPlayer = TPlayer.Create(5)
Local otherplayer:TPlayer = TPlayer.Create(4)

So this lets you set up players with any number of cards. Nifty eh?


PS Your original code didn't compile because of the unneeded []


Macguffin(Posted 2008) [#7]
Ah! Got it guys, thanks. Part of the problem was the mixup on my end of methods and functions when dealing with a not-yet-created type.

Thanks on the extra explanation CZ - I think I'm on the right track, I'll give a shout if this flummoxes me again.


Macguffin(Posted 2008) [#8]
One more question - to return temp as above, do I need to cast it somehow? Trying the below doesn't work for me, Unable to Convert from Int to Foo.

Strict

Type Foo
	Function Create() 
		Local temp:Foo = New Foo
		Return temp
	End Function
End Type

Global fooInstance:Foo = New Foo.Create()


Thanks.

EDIT: Ah. I was doing Create() instead of Create:Foo()

I'm figuring when you use :<type> after a function, you're specifying return type?


plash(Posted 2008) [#9]
I'm figuring when you use :<type> after a function, you're specifying return type?
Yulp.


Paposo(Posted 2008) [#10]
Hello.

Another way to initialize fields are the method new()

If new() exist it is called at creation of object.
example:


If you use SuperStrict you correct your code more well.


Macguffin(Posted 2008) [#11]
Ok, thanks. I'm planning on moving to SuperStrict once the support is in for Grey Alien's Framework, which I'm using.