Hoorcollege 8 Game object structuren. Arrays in games Grid-gebaseerd speelveld (zoals Tetris) Lijst van spelers Lijst van inventory items Lijst van alle.

Slides:



Advertisements
Verwante presentaties
Zelf objecten maken in VBA Ynte Jan Kuindersma, BIRD Automation Nationale Officedag 2009 EDE, 14 Oktober 2009.
Advertisements

MagentaPurpleTeal PinkOrangeBlue LimeBrown RedGreen Introductie C# /.NET
OOS Object geOrienteerd Software-ontwerp - 4 Codeerperikelen Singleton Specificeren Scheiding GUI en Domein Facade.
Omgevingen zijn dan geïmplementeerd als Symbol Tables. Symbol Table mapt een symbool met een Binding Meerdere noties van binding –Meerdere manieren te.
Computervaardigheden en Programmatie Universiteit AntwerpenObjecten 4.1 Computervaardigheden en Programmatie 1rste BAC Toegepaste Biologische Wetenschappen.
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Hoofdstuk 2 Hallo, C# !.
Server side scripting 1 Webtechnologie Lennart Herlaar.
Algoritmiek Arrays: wat zijn dat en wat kun je ermee? Loops: hoe hou je ze in bedwang? Hoorcollege 6 - Ma. 9 okt L.M. Bosveld-de Smet.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Dagdeel 2.
Opgave 1a: afronden int n=5; double a, b, c, d; a = n * 1.5; b = n * 3 / 2; c = n / 2 * 3; d = 3 / 2 * n; a b c d
Array nDeclaratie nCreatie nOpvragen nWijzigen nLengte String [ ] a; a = new String[10]; ……a[5]…… a[5] = ……; …a.Length… …is eigenlijk overbodig! List a;
Hoorcollege 13 Animatie, game physics. De speler Wordt aangestuurd via toetsenbord Kent verschillende soorten bewegingen Rennen Stilstaan Springen Doodgaan.
Eerste deeltoets Uitwerking. Resultaten Gemiddeld: 6,01 Tips voor de volgende keer: – Werk in klad uit, schrijf duidelijk – Oefenen met loops en tellertjes.
Hoorcollege 14 Vijanden, excepties. Wat zit allemaal in een level? Startpositie van de speler Waterdruppels Tiles Vijanden Einde van het level Achtergronden.
Hoorcollege 7 Collections, arrays. Programma ‘Snowflakes’ Sneeuwvlok object.
Hibernate Object relational mapping
Algoritmiek Strings & Stringmanipulaties; Controle Structuren; Floating-point notation. Hoorcollege 4 - Ma. 25 sept L.M. Bosveld-de Smet.
Algoritmiek Java GUIs, AWT en Swing API Overzicht te bestuderen stof, voorbeeldtentamen Hoorcollege 15 - Ma. 11 dec L.M. Bosveld-de Smet.
JAVA1 H 22. COLLECTIONS FRAMEWORK. 1. INLEIDING. Collections framework Is een verzameling van data structuren, interfaces en algoritmen Meest voorkomende.
1 Hoofdstuk 11: Strings en karakters Inleiding In dit hoofdstuk bespreken we de mogelijkheden van de klassen : String StringBuffer Character StringTokenizer.
HOOFDSTUK 7 ARRAYS 7.1.     INLEIDING Array
Hoorcollege 12 Afronding Penguin Pairs & overzicht Tick Tick.
Hoofdstuk 2 Java. Soorten Java-programma’s nJava Applet programma “leeft” op een WWW-pagina nJava Application programma heeft een eigen window nJavascript.
Hoofdstuk 9 Objecten en klassen.
Hoorcollege 9 Jewel Jam The revenge. Hierarchie van game objecten Game object (lijst) Game object (grid) Game object (lijst) Game object.
Internetapplicaties - IV Collecties 1 Internetapplicaties Deel 4: Java hulpklassen: Collecties.
OO Analyse in de praktijk OO Analyse in de praktijk V Enkele Design Patterns.
TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik.
Hoofdstuk 10.1 Toepassing: Bitmap-editor. nKlik punten op scherm nPlaatje verschuiven left, right, up, down nPlaatje bewerken clear, invert, bold, outline.
Hoofdstuk 5 Interactie. Controls Form Label Button Label TextBox.
Hoorcollege 5 Herhaling, game object interactie. Ball class class Ball { Texture2D colorRed, colorGreen, colorBlue; Texture2D currentColor; Vector2 position,
C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1.
The beast has been released! 4 arcade-style games Interviews with famous people in the game industry Develop browsers games for any device (phone, tablet,
Algoritmiek Class Hierarchies, Inheritance. Hoorcollege 12 - Ma. 20 nov L.M. Bosveld-de Smet.
Hoorcollege 2 Basis gameprogrammeren. Soorten programma’s Console- applicatie.
Hoorcollege 14 Vijanden, excepties. Overzicht programmaconstructies Opdrachten Toekenning Aanroep void-methode return-opdracht while-opdracht for(each)-opdracht.
Hoorcollege 4 Objecten en methoden. Eigen methode toevoegen class Painter : Game { public void HandleInput() { … } protected override void Update(GameTime.
Hoorcollege 3 Game assets, Invoer verwerken. Tutorlunch GroepTutorStutorZaal UPaul BergervoetBob BestBBG 001 VMarries van de HoefSander VerkuilBBG 731.
Hoofdstuk 10.3 Tekst-editor: MDI-interface Dialogen Files lezen Abstracte klassen.
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
Game Object Structuren
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Game Assets
Gameprogrammeren: Lists en interfaces
Gameprogrammeren: Overerving
Gameprogrammeren: Animatie
Gameprogrammeren: Methoden
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Overerving in Painter
Gameprogrammeren: Player input in Painter
Gameprogrammeren: Tiles in Tick Tick
Gameprogrammeren: Willekeurigheid (Randomness)
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Game Basics
Arjan Egges & Paul Bergervoet
Voortborduren op eerder gedaan werk
Libraries, Platform Games
Gameprogrammeren: Recursie
Willekeurigheid en Herhaling
Gameprogrammeren: Tiles en File I/O in Tick Tick
Game: omgaan met tijd (Jewel-Jam)
Gameprogrammeren: Klassen en objecten
Arjan Egges & Paul Bergervoet
Implementatie Zoekboom
Object Communication (Jewel Jam)
Gameprogrammeren: Enemies in Tick Tick
Gameprogrammeren: Sprite sheets
Gameprogrammeren: Arrays
Transcript van de presentatie:

Hoorcollege 8 Game object structuren

Arrays in games Grid-gebaseerd speelveld (zoals Tetris) Lijst van spelers Lijst van inventory items Lijst van alle game objecten die getekend moeten worden Enzovoorts…

Programmeerconstructies in games Klassen Objecten Collections N-dimensionale arrays

Programmeerconstructies in games Klassen Objecten Collections N-dimensionale arrays

Jewel Jam

Twee-dimensionale array tabel int [, ] tabel; new int [5,3]; tabel = length tabel.GetLength(0) tabel.GetLength(1)

2D array voor speelveld Declaratie: In LoadContent: Grid initialiseren: jewel1 = Content.Load (" spr_single_jewel1"); jewel2 = Content.Load (" spr_single_jewel2"); jewel3 = Content.Load (" spr_single_jewel3"); int[,] grid; grid = new int[5, 10]; for (int x = 0; x < 5; x++) for (int y = 0; y < 10; y++) grid[x, y] = random.Next(3);

2D grid tekenen for (int x = 0; x < 5; x++) for (int y = 0; y < 10; y++) { Vector2 position = new Vector2(85 + x * 85, y * 85); if (grid[x, y] == 0) spriteBatch.Draw(jewel1, position, Color.White); else if (grid[x, y] == 1) spriteBatch.Draw(jewel2, position, Color.White); else spriteBatch.Draw(jewel3, position, Color.White); }

Rij naar onder verplaatsen // verplaats alle rijen eentje naar onderen int x, y; for (y = 8; y >= 0; y--) for (x = 0; x < 5; x++) grid[x, y + 1] = grid[x, y]; // vul de eerste rij met nieuwe willekeurige juwelen for (x = 0; x < 5; x++) grid[x, 0] = random.Next(3); Let op de volgorde bij kopieren in loops!

Veel games gebruiken game objecten in een boomstructuur – Puzzelgames (groeperen van objecten, objecten bestaan uit onderdelen…) – 3D games (omgeving is een boomstructuur) – Platform games –…–… Zo’n structuur noemen we ook wel een scene graph Game objecten in een structuur

Scene graphs

Game objecten in een scene graph Een game object kan een parent hebben Een game object kan bestaan uit een lijst van andere game objecten Een game object kan bestaan uit een grid van andere game objecten Game objecten kunnen een positie en snelheid ten opzichte van hun parent objecten hebben

Game object hierarchie Game object (lijst) Game object (grid) Game object (lijst) Game object ‘root’ game object

Nieuwe GameObject klasse (zonder sprite!) Testen of game object aan de top van de hierarchie staat: class GameObject { protected GameObject parent; protected Vector2 position, velocity; protected int layer; protected bool visible; … } if (parent != null) // we are not at the top of the hierarchy Game objecten hebben een ‘parent’. Het ‘root’ game object heeft als parent null.

Positionering van objecten Globale posities Speelveldpositie: (85, 150) Juweelpositie: (85, 150)

Positionering van objecten Lokale posities Speelveldpositie: (85, 150) Juweelpositie: (0, 0)

Positionering van objecten Globale posities: – Locatie object altijd bekend –  Verplaatsen van object hoger in de hierarchie  opnieuw alle posities uitrekenen Lokale posities: – Objecten worden lokaal in de hierarchie getekend  gamewereld onafhankelijk –  Opvragen van globale positie kost extra rekenkracht

Globale positie berekenen public virtual Vector2 GlobalPosition { get { if (parent != null) return parent.GlobalPosition + this.Position; else return this.Position; } } Afhankelijk van de globale positie van de parent.

Klasse SpriteGameObject class SpriteGameObject : GameObject { protected Texture2D sprite; public SpriteGameObject(Texture2D spr, int layer = 0) : base(layer) { sprite = spr; } public override void Draw(GameTime t, SpriteBatch spriteBatch) { if (visible) spriteBatch.Draw(sprite, this.GlobalPosition, Color.White); } } Subklasse van GameObject Tekenen op de globale positie

Tekenen in lagen

Layers class GameObject { protected Vector2 position, velocity; protected GameObject parent; protected int layer; protected bool visible; … } Ieder game object zit in een ‘laag’. Kleinere waarde = Eerder tekenen

Klasse GameObjectList class GameObjectList : GameObject { protected List gameObjects; public GameObjectList(int layer = 0) : base(layer) { gameObjects = new List (); } … } Subklasse van GameObject

Klasse GameObjectList public void Add(GameObject obj) { obj.Parent = this; for (int i = 0; i < gameObjects.Count; i++) if (gameObjects[i].Layer > obj.Layer) { gameObjects.Insert(i, obj); return; } gameObjects.Add(obj); } public void Remove(GameObject obj) { gameObjects.Remove(obj); obj.Parent = null; }

public override void HandleInput(InputHelper inputHelper) { foreach (GameObject obj in gameObjects) obj.HandleInput(inputHelper); } public override void Update(GameTime gameTime) { foreach (GameObject obj in gameObjects) obj.Update(gameTime); } public override void Draw(GameTime time, SpriteBatch s) { if (!visible) return; for (int i = 0; i < gameObjects.Count; i++) gameObjects[i].Draw(time, s); } Game objecten worden automatisch in de goede volgorde getekend!

Klasse GameObjectGrid class GameObjectGrid : GameObject { protected GameObject[,] grid; protected int cellWidth, cellHeight; public GameObjectGrid(int rows, int columns, int layer = 0) : base(layer) { grid = new GameObject[columns, rows]; for (int x = 0; x < columns; x++) for (int y = 0; y < rows; y++) grid[x,y] = null; } Subklasse van GameObject

Klasse GameObjectGrid public void Add(GameObject obj) { for (int x = 0; x < Columns; x++) for (int y = 0; y < Rows; y++) if (grid[x,y] == null) { grid[x,y] = obj; obj.Parent = this; obj.Position = new Vector2(x * cellWidth, y * cellHeight); return; } } Zoek de eerste lege plek! Zet het object op de juiste positie (lokaal!)

Gamewereld bouwen gameWorld = new GameObjectList(); Texture2D background = Content.Load ("spr_bkgrnd"); gameWorld.Add(new SpriteGameObject(background)); GameObjectList playingField = new GameObjectList(1); playingField.Position = new Vector2(85, 150); gameWorld.Add(playingField); GameObjectGrid grid = new GameObjectGrid(10, 5, 60); playingField.Add(grid); Texture2D selectorFrame = Content.Load ("spr_sel_fr"); RowSelectGameObject rowSelector = new RowSelectGameObject(grid, selectorFrame, 1); playingField.Add(rowSelector);

Klassenhierarchie

playingField positie

Asset management Makkelijk toegang tot assets zonder steeds die ContentManager door te hoeven geven – Doen we in een AssetManager klasse

AssetManager class AssetManager { protected ContentManager contentManager; public AssetManager(ContentManager Content) { this.contentManager = Content; } public ContentManager Content { get { return contentManager; } } }

AssetManager public Texture2D GetSprite(string assetName) { if (assetName == "") return null; return contentManager.Load (assetName); } We declareren een static variable in de JewelJam klasse, met een property: protected static AssetManager assetManager; … public static AssetManager AssetManager { get { return assetManager; } }

SpriteGameObject public SpriteGameObject(string assetname, int layer = 0) : base(layer) { sprite = JewelJam.AssetManager.GetSprite(assetname); }

JewelJamGameWorld class JewelJamGameWorld : GameObjectList { public JewelJamGameWorld() { this.Add(new SpriteGameObject("spr_background")); GameObjectList playingField = new GameObjectList(1); playingField.Position = new Vector2(85, 150); this.Add(playingField); JewelGrid grid = new JewelGrid(10, 5, 60, 0); playingField.Add(grid); playingField.Add(new RowSelectGameObject(grid, 1)); } } Subklasse van GameObjectList

Jewel klasse class Jewel : SpriteGameObject { protected int variation; public Jewel(int layer = 0) : base("spr_jewels", layer) { variation = JewelJam.Random.Next(27); }... }

Een deel van de sprite tekenen public override void Draw(GameTime gameTime, SpriteBatch spriteBatch) { if (!visible) return; Rectangle source = new Rectangle(variation * sprite.Height, 0, sprite.Height, sprite.Height); spriteBatch.Draw(sprite, GlobalPosition, source, Color.White); }

Anchor position public Vector2 GetAnchorPosition(GameObject s) { for (int x = 0; x < Columns; x++) for (int y = 0; y < Rows; y++) if (grid[x, y] == s) return new Vector2(x * cellWidth, y * cellHeight); return Vector2.Zero; } In de GameObjectGrid klasse:

In de Jewel klasse: Maar dat mag niet, want parent heeft als type GameObject en niet GameObjectGrid Dus, casten: Wat gebeurt er als this.Parent niet het type GameObjectGrid heeft? Anchor position opvragen Vector2 anchorPosition = this.Parent.GetAnchorPosition(this); GameObjectGrid parent = (GameObjectGrid)this.Parent; Boem!

Veiliger: gebruik as Daarna kun je controleren of het gelukt is: Gevolg: Programma veel robuuster! Anchor position opvragen GameObjectGrid parentGrid = this.Parent as GameObjectGrid; if (parentGrid != null) // doe iets met parentGrid

Motion effecten if (parent != null) { Vector2 anchorPosition = parent.GetAnchorPosition(this); velocity = (anchorPosition – position) * 8; base.Update(gameTime); } In de Update methode van Jewel:

Tetris

class LangwerpigTetrisBlok { Color kleur; Texture2D blokSprite; const int grootte = 4; bool[,] configuratie; … Langwerpig tetrisblok Hierin bewaren we het blok (false = vrij, true = bezet)

Langwerpig tetrisblok public LangwerpigTetrisBlok() { this.kleur = Color.Red; this.configuratie = new bool[grootte, grootte]; for (int i = 0; i < grootte; ++i) for (int j = 0; j < grootte; ++j) this.configuratie[i, j] = false; configuratie[0,1] = true; configuratie[1,1] = true; configuratie[2,1] = true; configuratie[3,1] = true; } Array initialisatie Een langwerpig blok

Tetrisblok draaien public void draaiLinksom() { bool[,] nieuw = new bool[grootte, grootte]; for (int i = 0; i < grootte; ++i) for (int j = 0; j < grootte; ++j) nieuw[grootte - j - 1, i] = configuratie[i, j]; this.configuratie = nieuw; } i= j=

De volgende keer Afronding Jewel Jam – Recursie – Game object communicatie – Tijd in games