Bmx call-by-value, cant update TList objects

BlitzMax Forums/BlitzMax Beginners Area/Bmx call-by-value, cant update TList objects

pappavis(Posted 2007) [#1]
I'm working on programming a "snakes" game in Blitzmax.

This is basic idea;
1. The snake can move on tile objects which represents a big chessboard. The tiles are added to a TList. Each tile itself is a Type ("class") with some properties X,Y, tilenumber etc etc.
2. When the worm moves, the tile on which it is located gets a flag set.
3. This flagged tile is (temporarily) flagged as occupied.
4. My code loops throught the Tlist-"Chessboard" calling an update on each tile, like this:

the code here was typed at work from my head in MS-Word, not in the compiler. it can contain (spelling) mistakes.
Type MySnakesGame
 Method manage()
   Graphics(800,600,0);
  '//...add about 480 tiles (32x30 pixels) on 800x600 display..
   local chessboardList:TList = new TList;
   for Local count1:int = 0 to 470
      Local chessTile:clsTile = new clsTile;
      chessTile.X = 30;  '//ofcoz increments..
      chessTile.Y = 30;  '// same here
      chessTile.TileCounter = count1;
      chessTile.tiledOcuppiedBy = enumNobody;
      chessboardList.Addlast(chessTile);
   Next

   While not keyhit(key_escape)
     cls();

    '//player moves, flag the tile as occupied
     '//handle keybord input, new X/Y is at 'tilenumber'.

     Local objOccupiedTile1:clsTile =  clsTile(ChessboardList.ValueAtIndex(tilenumber));
     objOccupiedTile1.tiledOcuppiedBy = enumPlayer; '//this is suppeds to call-by-ref, or not?

    '// the display will be filling up, visually showing where your player was.
    For Local objTile1:clsTile = EachIn ChessboardList:TList
      objTile1.Update();
    Next
    flip();
  Wend
 EndMethod

 '// here sumthing strange happens, call by value?  Call-by-reference?
endType

 type clsTile
    field myImage:TImage;
    Field x:int;
    Field y:int;
 
     '//stupid constructur emulated. call this in your code.. Blitzmax forum exmaple ;).
    function Create:clsTile()
       local objTile3:clsTile = new clsTile
       objTile3.MyImage = loadImage("snakehead1.png");
        return objTile3;
    endfunction

    method update()
       If(Self.tiledOcuppiedBy = enumPlayer)       
          DrawImage(Self.MyImage, self.x, self.y);
       EndIf
    endmethod
 end type


The above attempts to;
1. fill a tlist chessboard containing tiles.
2. aloow the player to move onto a tile.
3. Flag the tile as occupied.
4. Loop through all tiles in chessboard, updating it.

Problem:
the clsTile.Update doesnt do anything. The tile isnt rendered. The reference obtained from the Tlist (probably) dont update the object it obtained. Is that true? How can i modify a object in Tlist by reference?


tonyg(Posted 2007) [#2]
This is going to be very tricky. Your clstile type doesn't have any X or Y attributes and isn't extended either. The same type doesn't have a TiledOccupiedby method or field either.
In short, I don't think the code you have posted gives much chance in suggesting anything.
How about waiting until you get home and posting the actual code?
<edit> In answer to your question you can take the clstile off the list exactly as you have done and then call its update method.


pappavis(Posted 2007) [#3]
Here is the complete program code. Out of the box it wont run coz it needs a few .png files, which ofcoz can be swapped for any other image file.

TIA for any help :)




Czar Flavius(Posted 2007) [#4]
Just a hint, use [codebox] instead.