Gameprogrammeren: Sprite sheets

Slides:



Advertisements
Verwante presentaties
Het type int Tekenen met Java operatoren
Advertisements

Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Array nDeclaratie nCreatie nOpvragen nWijzigen nLengte String [ ] a; a = new String[10]; ……a[5]…… a[5] = ……; …a.Length… …is eigenlijk overbodig! List a;
Hoorcollege 8 Game object structuren. Arrays in games Grid-gebaseerd speelveld (zoals Tetris) Lijst van spelers Lijst van inventory items Lijst van alle.
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.
Static Keyword static voor functieleden functie niet voor een object aangeroepen class K {... static int minimum( int i, int j); } aanroep: K::minimum(
JAVA -- H51 CONSTRUCTOR –- COPY-CONSTRUCTOR 1Constructor: Dezelfde naam als de klasse Wordt uitgevoerd d.m.v. new Initialisatie van de (private) attributen.
Hoorcollege 12 Afronding Penguin Pairs & overzicht Tick Tick.
Hoorcollege 9 Jewel Jam The revenge. Hierarchie van game objecten Game object (lijst) Game object (grid) Game object (lijst) Game object.
Herhaling Java-programmatie en geautomatiseerd testen (vervolg)
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,
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.
Constructoren Genesis 1:1 Aarde a1 = new Aarde(“Adam”, “Eva”);
Animatie nAnimatie: “tekenfilm” programma toont automatisch veranderende beelden nGemakkelijk te programmeren met gebruik van de klasse Thread “draadje”
Hoorcollege 3 Game assets, Invoer verwerken. Tutorlunch GroepTutorStutorZaal UPaul BergervoetBob BestBBG 001 VMarries van de HoefSander VerkuilBBG 731.
Klasse uit library Android.App Activity Bij het starten van een app: nOperating system maakt een Activity -object aan… n…en neemt dat onderhanden met de.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 3 inleveropdrachten) college Tent. 1 Tent. 3 college prakt. 1 prakt. 3 prakt.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
Bestanden Lezen Schrijven Afbeeldingen. Bestandstypen.txt.png eigen.
De definitie van een object. Een object is een verzameling van eigenschappen en bewerkingen. Veel voorkomende objecten zijn: D (display) Gui (user interface)
Animatie & Game Physics
Partial Classes, Enemies, Exceptions
Game Object Structuren
Objectgeoriënteerd Programmeren (2)
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Game Assets
Gameprogrammeren: Lists en interfaces
Gameprogrammeren: Keuzeopdrachten
Gameprogrammeren: Overerving
Gameprogrammeren: Char en String
Letterfrequentie turven
Gameprogrammeren: Variabelen, declaraties en toekenningen
Gameprogrammeren: Expressies
Gameprogrammeren: Animatie
Gameprogrammeren: Methoden
Arjan Egges & Paul Bergervoet
Publieksvraag // schrijf een static methode die telt hoe // vaak een symbool voorkomt in een string // voorbeeld-aanroep: int n; n = Demo . Freq(’e’,
Gameprogrammeren: Overerving in Painter
Gameprogrammeren: Player input in Painter
Gameprogrammeren: Programmastructuur
Basis Gameprogrammeren
Gameprogrammeren: Tiles in Tick Tick
Gameprogrammeren: Afsluiting
Gameprogrammeren: Willekeurigheid (Randomness)
Gameprogrammeren: Herhalingen
1. Een klasse is… Een groepje opdrachten Een groepje variabelen
Gameprogrammeren: Properties
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Game Basics
Game Assets, Invoer Verwerken
Arjan Egges & Paul Bergervoet
Voorbeeld: Simulatie van bewegende deeltjes
Voortborduren op eerder gedaan werk
Libraries, Platform Games
Gameprogrammeren: Recursie
Gameprogrammeren: Abstracte klassen
Willekeurigheid en Herhaling
Gameprogrammeren: Interfaces
Arjan Egges Paul Bergervoet Wouter van Toll
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
Software Development fundamentals
Gameprogrammeren: Arrays
Transcript van de presentatie:

Gameprogrammeren: Sprite sheets Arjan Egges Paul Bergervoet Wouter van Toll

Overzicht: Penguin Pairs

Sprite sheets Strips vs. Sheets Strip is handiger met tekenen  Soms is een strip te breed om in het videogeheugen te passen  Sheet kan meer sprites bevatten dan strip  Sheet is wat onhandiger om te tekenen 

Sprite strip tekenen in Jewel Jam public override void Draw(GameTime gameTime, SpriteBatch s) { if (!visible) return; Rectangle source = new Rectangle(variation * sprite.Height, 0, sprite.Height, sprite.Height); s.Draw(sprite, GlobalPosition, source, Color.White); glitters.Draw(gameTime, spriteBatch); }

Nieuwe klasse SpriteSheet SpriteSheet heeft een aantal rijen en kolommen Er is een ‘sheet index’ die aangeeft welk element van de sheet we willen tekenen. 4 kolommen 1 2 3 4 5 6 7 2 rijen

SpriteSheet class SpriteSheet { protected Texture2D sprite; protected int sheetIndex; protected int sheetColumns; protected int sheetRows; protected bool mirror; public SpriteSheet(string assetname, int sheetIndex = 0) ... }

Sprite sheet instellingen Bij het laden van een asset zijn er dan drie mogelijkheden: Het is een enkele sprite Het is een sprite strip Het is een sprite sheet Trucje: encodering in de filenaam! spr_help.jpg spr_levels_solved@6.png spr_penguin@4x2.png

String ‘ontleden’ in de constructor sprite = PenguinPairs.AssetManager.getSprite(assetname); this.sheetIndex = sheetIndex; this.sheetColumns = 1; this.sheetRows = 1; string[] assetSplit = assetname.Split('@'); if (assetSplit.Length <= 1) return; string sheetNrData = assetSplit[assetSplit.Length - 1]; string[] colrow = sheetNrData.Split('x'); this.sheetColumns = int.Parse(colrow[0]); if (colrow.Length == 2) this.sheetRows = int.Parse(colrow[1]); Levert een array op van strings. Blijkbaar is het geen strip of sheet. sheet (rijen en kolommen)

Properties public int Width { get return sprite.Width / sheetColumns; } public int Height return sprite.Height / sheetRows; Deel door het aantal kolommen voor de juiste breedte. Deel door het aantal rijen voor de juiste hoogte.

Meer properties public int NumberSheetElements { get { return this.sheetColumns * this.sheetRows; } } public int SheetIndex get { return this.sheetIndex; } set if (value < NumberSheetElements && value >= 0) this.sheetIndex = value; = totaal aantal elementen Alleen toekennen als het mag.

SpriteSheet tekenen public override void Draw(SpriteBatch spriteBatch, Vector2 position, Vector2 origin) { int columnIndex = sheetIndex % sheetColumns; int rowIndex = sheetIndex / sheetColumns; Rectangle spritePart = new Rectangle(columnIndex * this.Width, rowIndex * this.Height, this.Width, this.Height); SpriteEffects spriteEffects = SpriteEffects.None; if (mirror) spriteEffects = SpriteEffects.FlipHorizontally; spriteBatch.Draw(sprite, position, spritePart, Color.White, 0.0f, origin, 1.0f, spriteEffects, 0.0f); } Bereken de juiste rij/kolom waarden.

SpriteGameObject klasse protected SpriteSheet sprite; protected Vector2 origin; public SpriteGameObject(string assetname, int layer = 0, string id = "", int sheetIndex = 0) : base(layer, id) { if (assetname != "") sprite = new SpriteSheet(assetname, sheetIndex); else sprite = null; } public override void Draw(GameTime gameTime, SpriteBatch s) { if (!visible || sprite == null) return; sprite.Draw(spriteBatch, this.GlobalPosition, origin);

SpriteGameObject gebruiken protected override void LoadContent() { ... gameWorld = new GameObjectList(); gameWorld.Add( new SpriteGameObject("spr_background_levelselect")); SpriteGameObject penguin = new SpriteGameObject("spr_penguin@4x2", 1, "penguin"); penguin.Position = new Vector2(500, 420); gameWorld.Add(penguin); }

SpriteGameObject gebruiken protected void HandleInput() { inputHelper.Update(); if (inputHelper.KeyPressed(Keys.Escape)) this.Exit(); if (inputHelper.KeyPressed(Keys.F5)) SetFullScreen(!graphics.IsFullScreen); gameWorld.HandleInput(inputHelper); SpriteGameObject penguin; penguin = gameWorld.Find("penguin") as SpriteGameObject; if (inputHelper.KeyPressed(Keys.Left)) penguin.SheetIndex--; else if (inputHelper.KeyPressed(Keys.Right)) penguin.SheetIndex++; }