Help with List field in a type
BlitzMax Forums/BlitzMax Beginners Area/Help with List field in a type
| ||
I'm trying to find examples of adding Types to a list field in another type but just not having any luck at the moment The code is listed below, just as an example to refer to. Basically I just want to add say 2 weapons to first ship , 3 weapons to the next etc Also how do you reference the fields of a type that are in a list when you use the List.First() method Thanks a lot Strict Graphics 1024,768 Global ShipList:TList = CreateList() ' ship type Type TShip Field Name:String Field Fuel:Int Field Weapons:TList = CreateList() ' list of weapons each ship can have 'create a ship Function Build(ShipName:String, ShipFuel:Int) Local NewShip:TShip NewShip = New TShip NewShip.Name = ShipName NewShip.Fuel = ShipFuel ShipList.AddLast(NewShip) End Function ' add a weapon , not sure if this works Method AddWeapon(WeaponName:String, WeaponPower:Int) Local NewWeapon:TWeapon NewWeapon = New TWeapon NewWeapon.Name = WeaponName NewWeapon.Power = WeaponPower Weapons.Addlast(NewWeapon) End Method End Type ' weapons type Type TWeapon Field Name:String Field Power:Int End Type ' create the ships CreateShips() ' main loop While Not KeyHit(KEY_ESCAPE) Cls Local y:Int = 12 Local s:TShip ' print a list of the ships For s = EachIn ShipList DrawText ("Ship name: " + s.Name + " - " + "Ship Fuel: " + s.Fuel,20,y) y = y + 12 Next Flip Wend ' create new ships Function CreateShips() Local s:TShip 'Local w:TWeapon 'Think you have to use the TShip name otherwise gives an error TShip.Build("Fighter",80) TShip.Build("Cruiser",34) TShip.Build("Transporter",64) TShip.Build("Scout",74) ' I want to add 2 weapons to the first ship, 3 to the second and 1 to the 3rd ship ' add weapons to the first ship 'If ShipList.First() <> Null ' DrawText (ShipList.First().s.Name,10,200) 'EndIf End Function |
| ||
Why not have TShip.Build() return an instance of the ship you just made. Then you can call newship.AddWeapon()... eg Function Build:TShip(ShipName:String, ShipFuel:Int) ... Return NewShip End Function Function CreateShips() ... Local s:TShip = TShip.Build("Fighter",80) s.AddWeapon(...) ... End Function |
| ||
okee: Also how do you reference the fields of a type that are in a list when you use the List.First() method Use: 'general: TMyType( list.First() ).fieldName TShip(shipList).AddWeapon("Chicken Thrower", 1) This is needed as "first()" returns an "Object". Objects do not know about a TShips functions or variables. By casting it to the type "TShip" you tell the compiler that you know that this First()-object is of type "TShip". If this is _not_ the case, your app will crash on that line (because it accesses something which does not exist). Instead of "First()" you also could use "TShip(shipListValueAtIndex(0))". Another hint: if you do not add weapons that often, you might use less memory with arrays (TWeapon[]). Of course removing a weapon then benefits from a rebuilding of that array (loop over existing ones, add them to a new array - and at the end, assign this new array to the variable holding the old one) one possible approach: Weapons[i] = null 'remove weapon at desired index local newWeapons:TWeapons[] For local w:TWeapon = eachIn Weapons if Weapons[i] then newWeapons :+ [w] Next Weapons = newWeapons Of course it is also possible to use "array slices" (array = array[start ...entry] + array[entry+1 .. end]). bye Ron |
| ||
This is another way to find and manipulate ships after they are already created. The function searches for a ship's name and return the ship as an object:Type TShip Field Name:String Field Fuel:Int Field Weapons:TList = CreateList() ' list of weapons each ship can have Function Build(ShipName:String, ShipFuel:Int) Local NewShip:TShip= New TShip NewShip.Name = ShipName NewShip.Fuel = ShipFuel ShipList.AddLast(NewShip) End Function Method AddWeapon(WeaponName:String, WeaponPower:Int) Local NewWeapon:TWeapon = New TWeapon NewWeapon.Name = WeaponName NewWeapon.Power = WeaponPower Weapons.Addlast(NewWeapon) End Method Function Find:TShip(ShipName:String) For Local Ship:TShip = EachIn ShipList If Ship.Name = ShipName Return Ship Endif Next Return NULL End Function End Type With this you can do things like this: TShip.Find("Fighter").AddWeapon("gun",100) .... TShip.Find("Fighter").Fuel=0 .... ShipList.Remove TShip.Find("Fighter") |
| ||
If a shipname is really unique, you would better have a TMap instead of a TList, as you then just do 'map.ValueForKey("Fighter")'. If shipname is not unique, you end up iterating through all ships and returning the first hit ship. bye Ron |
| ||
Thanks guys, those tips helped a lot |