Mijn spelletje was genomineerd voor de Annual Allegro Awards 2003 in de klasse Most Professional! Bedankt! Helaas is de link naar de bijhorende pagina dood...

Nuttige info? Vind je mijn spel leuk? Denk eens aan een vrijwillige bijdrage?
Support deze site

Games programming

Op deze pagina: graphics, sound, programming, links

PinpinPinPin: mijn laatste (en eigenlijk ook eerste) PC/DirectX game!! Een geweldloos spel voor kinderen vanaf een jaar of 5, voor gemiddelde Windows-PC's (DirectX 7 of hoger, 640x480 in 8-bit), of onder DOS. Deze nieuwe versie heeft 7 levels, en een aantal nieuwe mogelijkheden. Zie ook verderop: hoe maak je spelletjes? En aan het einde van deze pagina verschillende links naar onder andere kant-en-klare spelmaakprogramma's!

  • Download Windows versie: pinpin15_install.exe ; installatie: leesmij.txt of in het [English]Engels: readme.txt). Ongeveer 610 Kbyte; 4 minuten met een 56kbit modem. Nu met installer (gebaseerd op de NSIS installer): maakt ook short cuts op het bureaublad aan en zo. Veel makkelijker installeren.
  • De krabOf de DOS versie (heerlijk dat Allegro zowel met de DJGPP DOS compiler werkt als met de Dev_C++ Windows compiler, zie mijn C pagina): pinpin15dos_install.zip (werkt niet altijd soepel onder Windows, met name het MIDI geluid niet). Ongeveer 500 Kbyte; 3 minuten met een 56kbit modem. Dit is een ZIP-file, werkt ook op kale DOS systemen. Heb je geen unzip: hier is een unzip.exe (50 Kb, van FreeDOS).
  • En ook: een port naar Linux! Met dank aan Georgik voor de port, kijk op games.linux.sk voor de download, of pak hem hier (source file!): pinpin15_linux.tar.gz.

PinPin screenshot

Spelletjes: leuk. Maar nog (veel) leuker vind ik het om ze zelf te programmeren (voor wat links voor beginners: kijk aan het einde van deze pagina), zie het screen shot op het begin van deze pagina van een spel waarmee ik bezig ben (komt nog een keer op deze pagina). Beter gezegd: om ze zelf te maken, want programmeren is maar een heel klein deel van het maken van spelletjes. Veel meer tijd gaat zitten in andere zaken, zoals

  1. Het bedenken van het spel zelf: wat is het doel, wat voor ideeën wil ik er in brengen
  2. De structuur van je data-opslag
  3. Het maken van de plaatjes ('graphics' ), figuurtjes, bewegingen.
  4. Het maken van de geluiden en de muziek.
  5. Het maken van uitlegtekst en zo voort.
  6. Het maken van extra 'levels'.
  7. En dan het eigenlijke programmeren
  8. Inpakken en wegwezen

PinpinHierbij doe je dit meestal niet stap voor stap, maar je bent met alle stappen tegelijk bezig. Maar zoals je ziet, het programmeren is er eigenlijk maar een heel klein gedeelte van. Bij mij zit de meeste tijd in 2 en 5, doordat ik voor het programmeren goede hulpmiddelen heb. OK, wat uitleg bij elke stap:

1. Het bedenken van het spel

Ja, dat is iets wat je zelf moet doen. Kijk naar bestaande spelletjes, maar probeer ze niet na te maken. Wat vind je leuk, wat is het spel-element? Hier heb ik gekozen voor een klassieke vorm, de 'arcade game'. Je moet hier een pinguïn bewegen, en haar? hem? helpen de baby's naar de iglo te brengen, ondanks de gevaren onderweg zoals zee-egels. Onder water zwemmend, boven water lopend en springend.

Zee-egelExtra problemen worden veroorzaakt doordat je bijvoorbeeld niet te snel mag zwemmen, dat houden de baby's niet bij. Ze raken steeds verder achterop, en op een gegeven moment zwemmen ze weer terug naar de plaats waar je ze gehaald had.

2. De structuur van de data

Hoe bewaar en distribueer je alle gegevens voor je spel? Je krijgt al snel een heleboel verschillende files, met graphics, geluidjes, achtergrondmuziek, levels, helptekst, introscherm, ..... Een beetje spel heeft al snel een file of honderd, en dat moet allemaal naar de 'klant'......

Ik kies er voor om al die kleine files in een grote file te combineren. Ik noem zo'n file hier verder even een 'database'. Bij de game library 'Allegro' zit een goed programma om zo iets te maken ('grabber'), en zitten routines om vervolgens vanuit je spel eenvoudig de data weer te kunnen gebruiken. Alle geluidjes, sprites, etc, stop ik daar in. Als je een of meerdere files veranderd, dan kan grabber deze veranderingen automatisch in de database bijwerken (een soort ingebouwde 'make'). Scheelt veel werk.....

In totaal gaan er maar een paar files naar de gebruiker (en die dan weer verpakt in een zelf-uitpakked archive, op dit moment van zo'n 530 Kbyte):

  • Het programma (de 'executable'), zo'n 10 .. 50 Kbyte
  • De database (100..200 Kbyte)
  • Eventueel apart: de level-file
  • De read-me file met uitleg hoe het programma op de computer te installeren (1..10 Kbyte)
  • De DLL van Allegro (library file) zo'n 400..500 Kbyte

In totaal past alles op het moment nog op een enkele floppy.

3. Het maken van de plaatjes.

ZwemmenJe hebt een aantal soorten plaatjes nodig: de achtergrond, de bewegende poppetjes, de help-bordjes, etc. Ik probeer dit allemaal gelijktijdig te maken, om de zaak bij elkaar te laten passen. Ik doe dit in Paint Shop Pro 6, en werk daar in verschillende lagen:

  • de achtergrond (lucht en ijsbergen)
  • de voorgrond (het koper-kleurige frame met punten etc)
  • de poppetjes en voorwerpen

De lagen bewerk ik gezamenlijk, en save ik dan apart naar bmp-files (een per laag, hier dus een voor de achtergrond, een voor de figuurtjes, en een voor de voorgrond; drie files in totaal). Deze gaan vervolgens de Allegro/grabber database in (die zorgt ook voor compressie).

Vanuit de 'poppetjes-file' maak ik de aparte graphics voor de spelers. Dit worden nu geen aparte files, maar met behulp van grabber geef ik aan waar welk figuur zit in de poppetjesfile. Grabber zorgt voor de rest. Het voordeel hiervan is dat als ik de graphics verander, ik niet weer opnieuw al die figuurtjes uit hoef te knippen.

4. Geluidjes en muziek.

Kopieer niet zo maar iemand anders' muziek. Niet beleefd, maar ook al omdat er copyright op zit, en je er dus toestemming voor moet hebben. Beter is het om zelf iets te bedenken. Ook zijn er sites met vrij beschikbare muziek, bijvoorbeeld ???????? (oops, waar heb ik die link nu gelaten?).

De krabGoed freeware programma om geluidjes te maken: Saw Cutter, http://www.cuttermusic.com/. Voor het gepiep van de baby-pinguïns en zo. Audacity is een gratis open-source programma voor het opnemen en bewerken van geluiden, zoals mixen van kanalen. Beschikbaar voor meerdere operating systems. Uitbreidbaar met veel plug-ins. Voor MP3 moet je eerst apart de Lame MP3 DLL installeren.

En een leuk programma om achtergrondmuziek te maken (in de vorm van midi files): Music in the Numbers van Lars Kindermann. Maakt random muziek gebaseerd op wat formules, die je zelf kan beïnvloeden. Heb ik in dit spel ook mijn achtergrondmuziek van.

Ook deze soundfiles (midi en wave) worden weer gebundeld in de 'database', zo dat je niet allemaal losse files hoeft mee te slepen.

5. Helptekst en zo

Ik heb geen enkele tekst direct in het programma staan. In plaats daarvan is alle tekst (uitleg, intro-scherm, credits, en zo) verzameld in een file, die ook weer de 'database' in gaat. Vanuit Allegro kan je makkelijk bij zo'n (pseudo)file in de database. Elk stukje tekst begint met een herkenningscode en een nummer, en vanuit het programma verwijs ik via zo'n nummer. Zodra er ergens tekst nodig is, zoekt het programma in de file naar de code/nummer en laat de bijhorende tekst zien.

PinpinOp deze manier is het makkelijker om het programma meertalig te maken. Alle teksten op een plaats, dus het is altijd duidelijk waar je de zaak moet aanpassen. Bovendien kan je dit dan ook makkelijk uitbesteden naar mensen die de taal goed spreken. En je programma hoeft niet opnieuw vertaald te worden na wijzigingen van de taal, je hoeft alleen een nieuwe database te leveren.

6. Het maken van levels

Een arcade/platform spel bestaat meestal uit een of meer 'worlds', werelden, met ieder een thema, en dan per wereld meerdere levels. In mijn geval bouw ik een level op uit blokjes (hier van 32x32 puntjes, zie het plaatje bovenaan deze pagina). Ook hiervoor gebruik ik een bestaand hulpprogramma, in mijn geval 'Mappy '. Een prima uitbreiding op Allegro.

De level-file heb ik momenteel nog niet in de database, omdat het nog maar een test-versie is. Hierdoor kunnen mensen eenvoudig met behulp van Mappy zelf levels maken, zonder de database zelf te hoeven veranderen. Niet dat ik daar al support voor lever, maar ik houd er vast rekening mee.

7. Het programmeren

Allegro! Prima game library, zorgt voor alle basis grafische functies, zoals figuurtjes op het scherm zetten. Ook het afspelen van wave en midi files neemt'ie voor z'n rekening, en ook het uitlezen van het keyboard (shift, alt etc). Zie de volgende link: Allegro. Bovendien werkt het zowel onder DOS (met de 32-bit DJGPP compiler) als onder Windows/DirectX (met de Dev_C++/GNU MingW compiler), zie ook mijn C pagina.

Het programma is in C, niet in C++. Lijkt misschien vreemd, maar voor mij heeft C++ niet genoeg voordelen om tegen e nadelen (grotere executable, tragere uitvoering) op te wegen. Uiteindelijk bestaat het hele programma uit slechts 2 C-files, en is dus de complexiteit nog goed te overzien. De rest van de code komt uit libraries, zoals de Allegro library, de Mappy library, mijn CLWP library, en zo voort.

Moeilijkste is nog om je spel op elke PC op dezelfde snelheid te laten spelen, onafhankelijk van kloksnelheid en refresh-rate van het scherm. Bij mij worden de acties (als lopen, zwemmen, bewegen van animaties, en zo) 50 keer per seconde doorgerekend, onafhankelijk van het aantal beeldjes per seconde op het scherm (bij DirectX ergens tussen de 50 en 85 per seconde). Is de computer te traag, dan zal het bijwerken van het scherm wat inzakken, maar het doorrekenen van de figuurtjes blijft op dezelfde snelheid (tot het echt niet meer gaat.....). Hoe ik dit heb opgelost kan je hier lezen.

Meer details en code-voorbeelden voor andere problemen zullen nog wel eens volgen.

8. Inpakken en wegwezen

Als resultaat van die stappen heb je nu een aantal files. In mijn geval zijn dit:

  1. Het eigenlijke programma, pinguin.exe (18 Kbyte)
  2. De 'database' met de plaatjes, geluiden, helpteksten etc (163 Kbyte)
  3. De file met de levels (330 Kbyte)
  4. En een 'readme.txt' (lees_mij) file met wat uitleg voor nieuwe gebruikers (2 Kbyte)
  5. En evt de DLL met de runtime routines, indien mensen die nog niet hebben (465 Kbyte)

PinpinVan dit alles maak ik een mooie Windows Installer, dank zij de mooie installer software van NSIS. Dit gratis pakket wordt ook gebruikt voor de WinAmp installer. Niet het makkelijkste pakket, maar wel heel compleet, en weinig overhead ten opzichte van een zip file (minder dan 50K). Het totale pakket voor Pinpin, met installatie in het Engels en in het Nederlands, wordt dan zo'n 600 Kbyte.

Een alternatief is een 'self-extracting archive', een gecomprimeerd bestand dat zichzelf uit kan pakken. Dit kan bijvoorbeeld met WinZip of met PowerArchiver.

9 Links

Om duplicatie (en daarmee veel werk voor mij om het gelijk te houden) te voorkomen heb ik al mijn game programming links verhuisd naar mijn programming links pagina! Je vind daar drie groepen links voor het zelf maken van games:

  • Wil je niet zelf 'echt' programmeren: kant-en-klare game-ontwerp programma's
  • Wil je wel zelf programmeren: informatie-sites
  • Als je echt met games de diepte in wilt:
Dit is nog maar een allereerste begin, net genoeg om (hopelijk) trek te krijgen. Nog een tip: de Game Programming Wiki, als je meer over dit onderwerp wilt weten (en Engels kent).