- Home /
Card/Tile Game, loops dont update element0 of playerHand properly
In Unity 2D: I have a Tile class, PlayerTileTray class, PlayerTileTrayManager class and a TileManager class.
TileManager creates a List and adds elements to the list, setting the Tile variables. TileManager has a Deal Method with an OnTileSent(Tile sentTile) event that sends the top tile as a parameter.
PlayerTileTrayManager listens to the event using the OnTileSent Method. PlayerTileTrayManager's job is to take that tileSent and place it in one of several _trays in a PlaceTileInFirstEmptySlotOfTrays method. I am currently using an array of trays called _tray[].
If an next element of the _tray array is null, I Instantiate a gameObject Prefab representing the tray and add a PlayerTileTray instance to the prefab as _tray[trayIndex].
The PlayerTileTray has an array of bools,slotFull[], to show whether a slot is full. In the PlayerTileTrayManager: I loop through _tray and then slots of that tray to call the UpdateTrayWithTile method of PlayerTileTray UpdateTrayWiltTile adds the tile to a List in _tray, then trys to update the _tray bool variables emptyTray, fullTray and slotFull[].
The main problem I am having I am currently using a nested for loop. I have tried do while loops. The first bool element slotFull[0] never gets set to true despite how I try to make it true. When the first tile is dealt, slotFull[0] stays false. When the second tile is dealt both slotFull[0] and slotFull[1] are true;
The results of everything else is achieved or will be if I can fix the first element of slotFull updating properly..
 TileManager.cs
 TileManager.cs
 using UnityEngine;
 using System;
 using System.Collections;
 using System.Collections.Generic;
 
 public class TileManager :MonoBehaviour
 {    
     //For testing
     private int _topTile = 0;
     private List<Tile> _fullStackTiles = new List<Tile>();
     private static int _stockTileCount = 16;
     private static int _numberOfTileSets = 4;
 
     public int tilesToDeal = 1;
     public static Dictionary <string,Tile> stockTiles = new Dictionary <string,Tile>();
     public static List<Tile> shuffledTiles = new List<Tile>() ;
     public static int maxTiles = _numberOfTileSets * _stockTileCount;
 
     / **Singleton Stuff and Delegate,Event and Publisher Method removed for Brevity */
       void Awake(){
         _instance = this;  //  <--Singleton
     }
     void Start(){
         AssignTiles ();
         createFullStackWithSetOf(_numberOfTileSets);
         shuffledTiles = _fullStackTiles;
 
         //Shuffle is located in MyExtensions
         shuffledTiles.Shuffle();
     }
     void AssignTiles(){/* Method Contents removed for Brevity */ }
 
     void createFullStackWithSetOf(int numSets){
         //Create a stack of tiles with _numOfTileSets of stockTiles
         foreach(KeyValuePair<string,Tile> t in stockTiles){
             for(int i = 0; i < numSets; i++)
                 _fullStackTiles.Add(t.Value);
         }
     }
     public void Deal(int numIilesToDeal){
         for(int i = 0; i < numIilesToDeal; i++){
             //TileSend method is near the beginning of this script in the Delegate #region
             //TileSend (shuffledTiles[_topTile]);
             OnTileSent(shuffledTiles[_topTile]);
             shuffledTiles.RemoveAt(_topTile);
 
             //create node for instantiated tile
             //insert tile into Node
         }
     }
 }
PlayerTileTrayManager
 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 
 public class PlayerTileTrayManager : MonoBehaviour {
 
     private static int _maxNumberOfTrays = TileManager.maxTiles / PlayerTileTray.trayMax;
     private List<Tile> _playerTiles = new List<Tile>();
     private GameObject _tilePrefab;
     private PlayerTileTray[] _tray = new PlayerTileTray[8];
 
     public Tile tileFromDraw;
     public GameObject TrayPrefab;
     List <GameObject> _trayObject  = new List<GameObject>();
     
     void OnEnable(){
         TileManager.Instance.TileSent += OnTileSent;
     }
     void OnDisable(){
         TileManager.Instance.TileSent -= OnTileSent;
     }
 
     void OnTileSent(object source, Tile tileSent){
         _playerTiles.Add (tileSent);
         PlaceTileInFirstEmptySlotOfTrays (tileSent);
         
         GameObject go = PrefabMap.Instance.GetValueByKey(tileSent.tileName);
         Instantiate (go,Vector3.zero,Quaternion.identity);
 
         //move _tilePrefab to childLocation
     }
     void PlaceTileInFirstEmptySlotOfTrays(Tile placeTile)
     {
         for(int trayIndex = 0;trayIndex < _maxNumberOfTrays;trayIndex++){
             //for(int slotIndex = 0; slotIndex < PlayerTileTray.trayMax; slotIndex ++)
             int slotIndex = 0;
             do{
                 if(_tray[trayIndex] == null)
                 {
                     _trayObject.Add (Instantiate (TrayPrefab, Vector3.zero, Quaternion.identity) as GameObject);
                     _tray[trayIndex] = _trayObject[trayIndex].GetComponent<PlayerTileTray>();
                 }
                 if (!_tray[trayIndex].fullTray)
                 {
                     if(!_tray[trayIndex].fullSlot[slotIndex])
                     {
                         _tray[trayIndex].UpdateTrayWithTile(placeTile);
                         Debug.Log (placeTile.tileName + "was placed in the " + trayIndex + " trayIndex iteration and in the " + 
                                    slotIndex + " slotIndex iteration.");
                         return;
                     }
                 }
                 slotIndex++;
             }while(slotIndex < PlayerTileTray.trayMax);
         }
     }
     public void showHand(){/* Not relevant to the Question*/    }
     //CycleTrays
 }
PlayerTileTray.cs
 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 public class PlayerTileTray :MonoBehaviour{
 
     public static int trayMax = 8;
 
     public bool[] fullSlot;
     public bool fullTray;
     public bool emptyTray;
 
     public Tile tileFromTrayManager;
     public List<Tile> tilesInTray = new List<Tile>();
 
     public PlayerTileTray(){
         fullSlot = new bool[trayMax];
         fullTray = false;
         emptyTray = true;
     }
     void Start(){
         for(int i = 0; i < trayMax; i++)
             fullSlot[i] = false;
     }
     public void UpdateTrayWithTile(Tile tileToTray){
         tilesInTray.Add (tileToTray);
         for (int i = 0; i < tilesInTray.Count; i++)
             fullSlot[i] = true;
         if(tilesInTray.Count >= 0)
             emptyTray = false;
         if(tilesInTray.Count >= 8)
             fullTray = true;
     }
 }
 
 
Answer by znSawyer · Aug 04, 2015 at 10:39 PM
In the PlayerTileTray, I initaized my Boolean array in Start(). I changed this to Awake and code worked as expected.
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                