Object Communication (Jewel Jam) Arjan Egges & Paul Bergervoet
Hierarchie van game objecten Game object (lijst) Game object Game object (grid) Game object (lijst) Game object Game object Game object
Game object communicatie Hoe ‘praten’ game objecten met elkaar? Verschillende mogelijkheden Ze praten niet met elkaar alle interactie handelen we af in de game wereld Objecten zoeken zelf uit met wie ze willen praten, en kunnen andere objecten vinden in de game wereld
Wat hebben we nodig? Game objecten moeten toegang hebben tot de gamewereld GameWorld object is beschikbaar als static variabele Game objecten moeten andere game objecten kunnen vinden GameObject instanties hebben een ID nodig
Communicatie via GameWorld object class GameObject { // members … protected string id; public GameObject(int layer = 0, string id = "") { … } public virtual void HandleInput(InputHelper inputHelper) public virtual void Update(GameTime gameTime) public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch) GameObject instanties hebben een ID
Zoeken naar game objecten public GameObject Find(string id) { foreach (GameObject obj in gameObjects) if (obj.ID == id) return obj; if (obj is GameObjectList) GameObjectList objlist = obj as GameObjectList; GameObject subobj = objlist.Find(id); if (subobj != null) return subobj; } return null; Methode in de GameObjectList klasse. Gebruik is om te kijken of een object van een bepaald type is. Methode roept ‘zichzelf’ aan: recursie
RowSelectGameObject public override void HandleInput(InputHelper inputHelper) { JewelGrid grid = GameWorld.Find("grid") as JewelGrid; if (inputHelper.KeyPressed(Keys.Up)) selectedRow--; else if (inputHelper.KeyPressed(Keys.Down)) selectedRow++; selectedRow = (int)MathHelper.Clamp(selectedRow,0,grid.Rows-1); this.position = new Vector2(-10, grid.CellHeight*selectedRow - 10); if (inputHelper.KeyPressed(Keys.Left)) grid.ShiftRowLeft(selectedRow); else if (inputHelper.KeyPressed(Keys.Right)) grid.ShiftRowRight(selectedRow); } Grid object zoeken Gebruikmaken van het object.
JewelGrid class JewelGrid : GameObjectGrid { We erven van GameObjectGrid class JewelGrid : GameObjectGrid { public JewelGrid(int rows, int columns, int layer = 0, string id = "") : base(rows, columns, layer, id) } ...
Geldige combinaties vinden Elk juweel heeft drie eigenschappen: kleur, vorm en aantal Encoderen dmv. 3 getallen in verzameling {0, 1, 2} Drie elementen hebben dezelfde eigenschap: 0+0+0=0, of 1+1+1=3 of 2+2+2=6 Som is altijd deelbaar door 3! Drie elementen hebben verschillende eigenschap: 0+1+2=3 ook deelbaar door 3!
Geldige combinaties vinden Hoe vinden we de encodering? We hebben een getal (variation) tussen 0-27 Variation/9 geeft de kleur Variation%9 is dan een getal tussen 0-8 Variation%9/3 geeft de vorm Rest is een getal tussen 0-2 geeft het aantal weer
public bool IsValidCombination(Jewel a, Jewel b, Jewel c) { int curra = a.Variation; int currb = b.Variation; int currc = c.Variation; int divider = 9; for (int i = 0; i < 3; i++) if ((curra/divider + currb/divider + currc/divider)%3 != 0) return false; curra %= divider; currb %= divider; currc %= divider; divider /= 3; } return true;
HandleInput methode (JewelGrid) if (!inputHelper.KeyPressed(Keys.Space)) return; int middleCol = this.Columns / 2, i = 0; ScoreGameObject score = GameWorld.Find("score") as ScoreGameObject; while (i < this.Rows - 2) { if (IsValidCombination((Jewel)grid[middleCol, i], (Jewel)grid[middleCol, i + 1], (Jewel)grid[middleCol, i + 2])) { ReplaceJewel(middleCol, i, -objsize); ReplaceJewel(middleCol, i + 1, -objsize * 2); ReplaceJewel(middleCol, i + 2, -objsize * 3); score.Score += 10; ... i = 0; } else i++; Het score game object zoeken. HandleInput methode (JewelGrid)
public void ReplaceJewel(int x, int y, int newYPosition) { this.Clear(x, y); Jewel s = new Jewel(); this.Add(s); s.Position = new Vector2(x * CellWidth, newYPosition); }
JewelCart
class JewelCart : SpriteGameObject { protected float push, minxpos; public JewelCart(int layer = 0, string id = "") : base("spr_jewelcart", layer, id) velocity.X = 6; push = 50.0f; } public void Push() position.X = MathHelper.Max(position.X - push, minxpos); ... We erven van SpriteGameObject
if (!inputHelper.KeyPressed(Keys.Space)) return; int middleCol = this.Columns / 2, i = 0; while (i < this.Rows - 2) { if (IsValidCombination((Jewel)grid[middleCol, i], (Jewel)grid[middleCol, i + 1], (Jewel)grid[middleCol, i + 2])) ... JewelCart jewelCart = GameWorld.Find("jewelcart") as JewelCart; jewelCart.Push(); i = 0; } else i++;
Paar seconden laten zien