Gameprogrammeren: Tiles en File I/O in Tick Tick Arjan Egges Paul Bergervoet Wouter van Toll
Tiles Veel games gebruiken tiles om werelden/levels/puzzels voor te stellen
Voorbeeld van een Tile-klasse enum TileType { Normal, Background, Wall }; class Tile : SpriteGameObject { protected TileType type; public Tile(string asset, int layer = 0, string id = "", int sheetIndex = 0) : base(asset, layer, id, sheetIndex) type = TileType.Normal; }
Voorbeeld van een Tile-klasse public override void Draw(GameTime gameTime, SpriteBatch s) { if (type == TileType.Background) return; base.Draw(gameTime, s); } public TileType TileType get { return type; } set { type = value; }
Tick Tick Resterende tijd Exit Speler Wall tile Waterdruppel Background tile Achtergrondlagen
Opbouw van de game Levels worden geladen uit een tekstbestand We hebben verschillende soorten game-objecten De speler Vijanden Waterdruppels Tiles Overlays
Levels en tiles .................... .................X.. ..........########## WWW....WWWW......... ---....####......... WWW................. ###.........WWWWW... ............#####... ....WWW............. ....###............. .1........W.W.W.W.W. #################### Eind van het level Achtergrondtile Waterdruppel Walltile Startpositie van de speler
Na het laden van het level
Levels uit een file lezen Voordelen: Levels worden onafhankelijk van de game-code geproduceerd Makkelijk nieuwe levels toe te voegen Makkelijker om te testen Nadelen: Levels kunnen door iedereen ge-edit worden (makkelijker om vals te spelen) Extra code nodig om levels uit files te lezen Misschien zelfs een speciale level-editor nodig
Levels uit een file lezen private void LoadTiles(string path) { // lees het level in List<string> tekstlines = new List<string>(); StreamReader fileReader = new StreamReader(path); string line = fileReader.ReadLine(); int width = line.Length; while (line != null) tekstlines.Add(line); line = fileReader.ReadLine(); } // maak alle tiles … Een List om alle gelezen regels in te bewaren. We gebruiken de StreamReader klasse. Lees 1 regel. Blijf lezen totdat er geen regels meer zijn.
private void LoadTiles(string path) { // lees het level in … // maak alle tiles TileField tiles = new TileField(textlines.Count - 1, width, 1, "tiles"); this.Add(tiles); tiles.CellWidth = 72; tiles.CellHeight = 55; for (int x = 0; x < width; ++x) for (int y = 0; y < textlines.Count - 1; ++y) Tile t = LoadTile(textlines[y][x], x, y); tiles.Add(t, x, y); } Subklasse van GameObjectGrid Methode die gegeven een karakter een Tile oplevert.
private Tile LoadTile(char tileType, int x, int y) { switch (tileType) { case '.': return new Tile(); case '-': return LoadBasicTile("spr_platform", TileType.Platform); case 'X': return LoadEndTile(x, y); case 'W': return LoadWaterTile(x, y); case '1': return LoadStartTile(x, y); case '#': return LoadBasicTile("spr_wall", TileType.Normal); default: }
Laden van een waterdruppel-tile private Tile LoadWaterTile(int x, int y) { GameObjectList wd = this.Find("waterdrops") as GameObjectList; GameObjectGrid tiles = this.Find("tiles") as GameObjectGrid; WaterDrop w = new WaterDrop(); w.Origin = w.Center; w.Position = new Vector2(x*tiles.CellWidth, y*tiles.CellHeight - 10); w.Position += new Vector2(tiles.CellWidth, tiles.CellHeight) / 2; wd.Add(w); return new Tile(); }
Voortgang van de speler bijhouden Ander voorbeeld van file I/O in Tick Tick Onthouden welk level is voltooid sinds de vorige keer Level status opslaan in file! false,false true,false
Status lezen public void LoadLevelsStatus(string path) { StreamReader fileReader = new StreamReader(path); for (int i = 0; i < levels.Count; i++) string line = fileReader.ReadLine(); string[] elems = line.Split(','); if (elems.Length == 2) levels[i].Locked = bool.Parse(elems[0]); levels[i].Solved = bool.Parse(elems[1]); } fileReader.Close();
Status schrijven public void WriteLevelsStatus(string path) { StreamWriter fileWriter = new StreamWriter(path, false); for (int i = 0; i < levels.Count; i++) string line = levels[i].Locked.ToString() + "," + levels[i].Solved.ToString(); fileWriter.WriteLine(line); } fileWriter.Close();
PlayingState-constructor Initialiseer de levels Sla op welke al voltooid zijn public PlayingState(ContentManager Content) { currentLevelIndex = -1; levels = new List<Level>(); LoadLevels(Content.RootDirectory + "/Levels/levels.txt"); LoadLevelsStatus(Content.RootDirectory + "/Levels/levels_status.txt"); }