Zelf een game (engine) maken, hoe begin je?
Heb je altijd al willen weten hoe je een eigen game kunt bouwen? Ik ben Daniël Kok, werkzaam als Software Engineer bij New Nexus en in mijn vrije tijd een fervente gamer en gameontwikkelaar. In mijn zoektocht naar de beste game engine ben ik tegen heel wat obstakels aangelopen. In deze blog deel ik mijn bevindingen en tips met jou. Maar vertel ik ook hoe hobbymatig programmeren en het toepassen van slimme gametechnieken mij helpt in mijn dagelijkse denkproces als Software Engineer.
Trip down memory lane
Van jongs af aan ben ik gek op spellen. Bordspellen, maar ook computer games. Iedereen kent van vroeger wel een paar klassiekers als Tetris, Mario, Sonic en Commander Keen. Omdat je het zelf had of bij een vriend of vriendin speelde. Of omdat sommige spellen inmiddels legendarisch zijn geworden doordat ze zo vernieuwend waren voor hun tijd. Games zijn overal en bij het woord games denk je al snel aan platformers, shooters en role playing games (RPGs).
Maar het zit ook in andere aspecten van ons leven en werk. We gebruiken het om informatie te verkrijgen, als reden om bij elkaar te komen en om spelenderwijs met elkaar te strijden. Bijvoorbeeld bij het gebruik van Kahoot voor een quiz of TheWikiGame als ice-breaker van een retrospective.
Zelf begon ik in de jaren 90 met text-based (ASCII) games zoals Kingdom of Kroz, Beast en de meer grafische spellen als Duke Nukem of Prince of Persia. Later werden dat adventure games, bijvoorbeeld de Quest-series van Sierra of Full Throttle van Lucas Arts. De fun zat hem in het niet wetend wat je tegen ging komen maar ook een gevoel van spanning en avontuur als je eindelijk voorbij een hindernis was gekomen of een bepaalde puzzel had opgelost. Dat smaakte steeds naar meer. In deze periode zette ik ook mijn eerste stappen in het zelf programmeren van een spel……Tot zover de trip down memory lane.
Hoewel ik er niet mijn werk van heb gemaakt, heeft game development mij om meerdere redenen altijd aangetrokken. Game development maakt namelijk vele technieken, principes en algoritmes uit de computerwetenschap visueel. Je ziet direct effect van het toepassen van de theorie, die daardoor ook meteen een stuk interessanter wordt. Daarnaast heb je de vrijheid om vanuit een leeg canvas te maken wat je wilt en is het ook nog eens leuk om een game te testen. Inmiddels werk ik aan een 2D game engine voor o.a. platformers of top-down role playing games. Ik leg je graag in een drietal stappen uit hoe ik op dit punt ben gekomen (en hopelijk heb jij daar ook wat aan).
Stap 1: Oriëntatie
Als je gaat Googlen op game development kom je snel uit bij zogenaamde game engines. Namen waar je ongetwijfeld van gehoord zult hebben zijn Unity en Unreal Engine. Deze engines bieden een framework en interfaces die aansluiten bij hoe een game in elkaar steekt. Een game engine biedt over het algemeen een rendercomponent waarmee je 2D of 3D objecten op het scherm kunt tekenen en manipuleren, physics om beweging te simuleren en collision detection om interacties te detecteren. Deze kun je vervolgens met aanvullende code voorzien van logica (als-dan) die specifiek is voor jouw game. Verder bieden game engines een grafische omgeving waar je gemakkelijk je game art, geluiden, 3d-modellen e.d. kan importeren en configureren.
Nadat ik met Unity wat stappen had gezet, kwam ik erachter dat deze engines wel erg veel kunnen. Dit was gelijk ook weer een belemmering want door de talloze opties om zoveel mogelijk game-typen te ondersteunen was dit, voor mij als beginner, vrij overweldigend en complex. Ik had daardoor het gevoel dat ik te veel tijd kwijt was met leren hoe deze specifieke engine werkte, en daardoor te weinig bezig was met de kern van game development – wat ik natuurlijk het liefste wilde.
Stap 2: Cursus in de basics
Ik liet het een poosje rusten en werd verrast door een cursus van Chris DeLeon: ‘How to Program Games: Tile classics in JS for HTML Canvas’ .(https://www.youtube.com/watch?v=MtByFgScit8). Deze cursus begint bij de basis, gebruikt geen bestaande engine, geen frameworks, maar plain Javascipt met een HTML-canvas. Dit bood mij de basis voor het tekenen en bewegen van objecten, detecteren van interacties en de basis voor het vastleggen van de regels van een game.
De cursus leidt je door een aantal verschillende games zoals Pong, een racer en een RPG-style game. Zo leer je, door de ene broncode steeds als basis voor de andere te gebruiken, dat dezelfde basisprincipes in iets totaal anders kunnen resulteren.
Geschreven door
Daniël Kok
Figuur 1. Break-out game en racer game gemaakt in Javascript met HTML-canvas
Stap 3: Een eigen probeersel (met Xamarin Forms en SkiaSharp)
Omdat ik destijds in mijn dagelijks werk voornamelijk bezig was met Xamarin Forms, zocht ik daar wat meer verbinding mee. Dat vond ik in de vorm van SkiaSharp. Skia is een open source 2D graphics library van Google die je in staat stelt om basisvormen zoals lijnen en cirkels, bitmaps en tekst op een canvas te tekenen. SkiaSharp is een .NET library die o.a. te gebruiken is in Xamarin Forms.
Nu kon ik de kennis uit de cursus gebruiken om niet in een HTML-canvas maar met SkiaSharp een game te maken. Ik begon te experimenteren met een shooter-game in de vorm van een ruimteschip die met touch controls te bewegen was, voegde bewegende sterren op de achtergrond toe en een enemy met wat animaties.
Figuur 2: shooter-game met SkiaSharp
Het zag er leuk uit en werkte op zich goed. Wel liep ik tegen de limieten aan van wat ik tot nu toe had geleerd. Hoewel ik de basis goed had, wilde ik het spel graag verder uitbreiden door bijvoorbeeld meer enemies of nieuwe logica toe te voegen. Daarvoor had ik aanvullende kennis nodig over het neerzetten van een flexibele game engine. Ik had in elk geval de ervaring en het vertrouwen opgedaan om met voorgaande technieken een game te ontwikkelen
Figuur 3: tile-based 2D-platform game gemaakt met SkiaSharp (Bron artwork: opengameart)
Conclusie en tips
Het mooie van mijn hobby is dat ik het af en toe ook kan toepassen in mijn werk. Zo heb ik recent een golf training app voor een klant ontwikkeld waarin de gebruiker registreert waar de golfballen terecht komen. Dit vereiste een hele specifieke manier van invoeren waar ik samen met mijn collega’s custom componenten voor heb ontwikkeld. Het afvangen van de invoer en het tekenen en animeren hiervan toont veel raakvlakken met game ontwikkeling.
Inmiddels heb ik nu voor mijn eigen game iets neergezet wat is uitgegroeid tot een engine. Deze is weliswaar beperkt in zijn opties, maar biedt toch een framework om gemakkelijk verschillende spellen te implementeren. Ik ga me nu focussen op het ontwikkelen van een complete game met deze engine.
Mocht je ook iets willen uitproberen dan hoop ik dat ik je hiermee heb gemotiveerd om ook eens de stap te zetten. Met deze JSFiddle (http://jsfiddle.net/xDZa4/) kan je gelijk beginnen. Pas aan en experimenteer! Ik ben benieuwd naar jouw ervaring.