Gameprogrammeren: Animatie

Slides:



Advertisements
Verwante presentaties
Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.
Advertisements

KINN 2010 •OOP •O Object •O Georiënteerd •P Programmeren.
OOS Object geOrienteerd Software-ontwerp - 3
Hoofdstuk 6: Controle structuren
Hoorcollege 13 Animatie, game physics. De speler Wordt aangestuurd via toetsenbord Kent verschillende soorten bewegingen Rennen Stilstaan Springen Doodgaan.
Hoorcollege 14 Vijanden, excepties. Wat zit allemaal in een level? Startpositie van de speler Waterdruppels Tiles Vijanden Einde van het level Achtergronden.
Deel XIV Eerste echte e-commerce applicatie Implementatie (vervolg) 1 Internetapplicaties Deel 15: Herhaling Java-programmatie en geautomatiseerd testen.
KINN 2010 OOP O Object O Georiënteerd P Programmeren.
Hoorcollege 5 Herhaling, game object interactie. Ball class class Ball { Texture2D colorRed, colorGreen, colorBlue; Texture2D currentColor; Vector2 position,
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.
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.
 C++ heeft een inheritance mechanisme  Manier om functionaliteit te ‘erfen’ van een parrent class ◦ Polymorphisme ◦ Zoals we het ook in C# kennen.
Programma opdrachten methoden klasse variabelen en Geheugen objecten klasse zijn gegroepeerd in hebben als type veranderen bewerken.
Eerste deeltentamen nNagekeken werk ligt voor in de zaal nNeem je eigen werk mee: in het college wordt het besproken nVragen over de beoordeling: in de.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 3 inleveropdrachten) college Tent. 1 Tent. 3 college prakt. 1 prakt. 3 prakt.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 2 inleveropdrachten) college Tent. 1 Tent. 2 college prakt. 1 prakt. 2 prakt.
Resources. Kompas } { protected override void OnDraw(Canvas canv) { base.OnDraw(canv); } public KompasView(Context c) : base(c) { } class KompasView :
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
IF() ELSE() LES 4: VOORWAARDEN. BOOL Een variabele die slechts 2 mogelijke waarden kan hebben: true(waar) of false(niet waar) duid je aan met bool bool.
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: Introductie
Gameprogrammeren: Overerving
Gameprogrammeren: Char en String
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Expressies
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
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: Exceptions
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
Gameprogrammeren: Sprite sheets
Software Development fundamentals
Gameprogrammeren: Arrays
Transcript van de presentatie:

Gameprogrammeren: Animatie Arjan Egges Paul Bergervoet Wouter van Toll

De speler Wordt aangestuurd via toetsenbord Kent verschillende soorten bewegingen Rennen Stilstaan Springen Doodgaan Botsingen moeten afgehandeld worden We willen simpele ‘physics’ voor de speler

Animatie We hebben al simpele animaties gezien In de Painter game: bal, paintcans, … Bewegende paddles in Pong Tetrisblokjes die naar beneden vallen Enzovoorts… Maar tot nu toe verplaatsen we alleen sprites Hoe zit het met animaties?

Wat is animatie? Snelle opeenvolging van net iets andere plaatjes Als dat snel genoeg gebeurt, dan denken we dat iets beweegt “Persistence of Vision” “Persistence of Motion”

De sprite met alle frames Animatie in C# Verschillende mogelijkheden a) Iedere frame = een aparte sprite b) Een sprite bevat een aantal frames Hiervoor kunnen we mooi sprite sheets gebruiken! De sprite met alle frames 1 frame

AnimatedCharacter Geanimeerde sprite

Overzicht Animation-klasse AnimatedGameObject-klasse Uitbreiding van SpriteSheet Namelijk: sheet index aanpassen aan de verstreken tijd AnimatedGameObject-klasse Bevat een aantal Animation-objecten Kan verschillende animaties afspelen

Animation-klasse public class Animation : SpriteSheet { protected float frameTime; protected bool isLooping; protected float time; public Animation(string asset, bool isLooping, float frtime = 0.1f) : base(asset) { this.frameTime = frtime; this.isLooping = isLooping; } public int CountFrames { get { return this.NumberSheetElements; } … De tijd tussen iedere frame, oftewel: dit bepaalt de snelheid van de animatie! Handige property dat het aantal frames berekent

public float FrameTime { get { return frameTime; } } public bool IsLooping get { return isLooping; } public bool AnimationEnded get return !this.isLooping && sheetIndex >= NumberSheetElements - 1; Nog meer properties…

public override void Update(GameTime gameTime) public void Play() { this.sheetIndex = 0; this.time = 0.0f; } public override void Update(GameTime gameTime) time += (float)gameTime.ElapsedGameTime.TotalSeconds; while (time > frameTime) time -= frameTime; if (isLooping) sheetIndex = (sheetIndex + 1) % this.CountFrames; else sheetIndex = Math.Min(sheetIndex + 1, this.CountFrames - 1); Start de animatie. Bereken huidig af te beelden frame.

Spiegelen van sprites Naar links lopen of naar rechts lopen Spiegel de sprite in plaats van twee aparte sprites public class SpriteSheet { … protected bool mirror; public bool Mirror { get { return mirror; } set { mirror = value; } }

Spiegelen in SpriteSheets public void Draw(SpriteBatch s, 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); } Sprite spiegelen

AnimatedGameObject-klasse public class AnimatedGameObject : SpriteGameObject { protected Dictionary<string, Animation> animations; public AnimatedGameObject(int layer = 0, string id = "") : base(layer, id) animations = new Dictionary<string, Animation>(); } public Animation Current get { return sprite as Animation; } …

AnimatedGameObject-klasse public void LoadAnimation(string asset, string id, bool looping, float frametime = 0.1f) { Animation anim = new Animation(assetname, looping, frametime); animations[id] = anim; } public void PlayAnimation(string id) { if (sprite == animations[id]) return; if (sprite != null) animations[id].Mirror = sprite.Mirror; animations[id].Play(); sprite = animations[id]; origin = new Vector2(sprite.Width / 2, sprite.Height);

AnimatedGameObject-klasse public override void Update(GameTime gameTime) { if (sprite == null) return; Current.Update(gameTime); base.Update(gameTime); }

Player-klasse class Player : AnimatedGameObject { public Player(Vector2 start) : base(2, "player") this.LoadAnimation("spr_idle", "idle", true); this.LoadAnimation("spr_run@13", "run", true, 0.05f); this.LoadAnimation("spr_jump@14", "jump", false, 0.05f); this.LoadAnimation("spr_celeb@14", "celebrate", false, 0.05f); this.LoadAnimation("spr_die@5", "die", false); this.LoadAnimation("spr_expl@5x5", "explode", false, 0.04f); startPosition = start; Reset(); } …

public override void Reset() { this.position = startPosition; isOnTheGround = true; this.PlayAnimation("idle"); previousYPosition = BoundingBox.Bottom; } public override void Update(GameTime gameTime) { base.Update(gameTime); if (isOnTheGround) if (velocity.X == 0) else this.PlayAnimation("run"); else if (velocity.Y < 0) this.PlayAnimation("jump"); DoPhysics(); startconfiguratie Speler begint op een bepaalde positie. “idle”-animatie positie

public override void HandleInput(InputHelper inputHelper) { float walkingSpeed = 400; if (inputHelper.IsKeyDown(Keys.Left)) velocity.X = -walkingSpeed; else if (inputHelper.IsKeyDown(Keys.Right)) velocity.X = walkingSpeed; else if (isOnTheGround) velocity.X = 0.0f; if (velocity.X != 0.0f) Mirror = velocity.X < 0; if ((inputHelper.KeyPressed(Keys.Space) || inputHelper.KeyPressed(Keys.Up)) && isOnTheGround) Jump(); } Kies de juiste beweegrichting Willen we springen?

Physics in de Player-klasse public void Jump(float speed = 1100) { velocity.Y = -speed; } private void DoPhysics() velocity.Y += 55f; HandleCollisions(); Springen = negatieve y-snelheid. We vallen steeds harder naar beneden.