[TUT] Game development 01 - Introductie

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Hallo ICTScripters,

    Omdat er nog maar weinig tutorials te vinden zijn m.b.t. game development wil ik hierbij het initiatief nemen om een serie te schrijven waarin je je eigen game gaat maken. Dit zal gedaan worden in Java, waarbij alles tot op de regel wordt uitgelegd, hiervoor is wel een beetje Java kennis nodig.

    Wat kan je van de lessen verwachten?
    Je gaat een game engine maken vanaf scratch waarmee je een tile-based game kan maken. We gaan dus geen bestaande engine gebruiken zodat je leert hoe een game tot stand komt en welke technieken hiervoor gebruikt worden.

    Welke programmeertaal gaan we gebruiken en heb ik hiervoor een IDE nodig?
    We gaan in de lessen de taal Java gebruiken (geen javascript). In voorbeelden etc. gebruik ik zelf de IDE Eclipse omdat ik deze prettig vindt werken en naar mijn mening het beste is om mee te programmeren in Java. Eclipse is Plug and Play en je hebt verder geen andere benodigdheden nodig naast de JDK (Java Development Kit).

    Oké we gaan beginnen! De eerste les zal bestaan uit het maken van een leeg scherm en het opzetten van een thread.

    Eerst gaan we een nieuw project aanmaken, dit doe je in Eclipse door op File, New en dan Java Project te klikken. Nu opent er een nieuw scherm waarin je het project aan kan maken. Voor het gemak vul je alleen het veld Project Name in en druk je vervolgens op Finish.

    [Blocked Image: https://raw.githubusercontent.com/michaelbeers/Elysium/master/Afbeeldingen/01_01.jpg]

    Nu is je project gemaakt en kunnen we de eerste klasse maken. Ga daarom nu naar File, New, en dan klik je op Class. Nu opent er een nieuw scherm waarin je een nieuwe klasse kan aanmaken. Noem deze klasse Game en vul bij package het volgende in: com.client. Natuurlijk is het mogelijk om bij de package een andere naam in te vullen, bij bedrijven is het gebruikelijk dat je het domein invoert van jouw website gevolgd door het project. Ik zal daarom in mijn code het volgende gebruiken: com.michaelbeers.elysium, waarbij elysium de naam is van mijn project.

    [Blocked Image: https://raw.githubusercontent.com/michaelbeers/Elysium/master/Afbeeldingen/01_02.jpg]

    Nu opent het bestand Game.java en kan je daadwerkelijk beginnen met programmeren. Allereerst gaan we het Canvas object extenden en de Runnable interface implementeren.

    Source Code

    1. package com.michaelbeers.elysium;
    2. public class Game extends Canvas implements Runnable {
    3. }


    Al snel zal je merken dat er errors komen, deze kan je voor nu nog even negeren.

    Het Canvas object gaat er voor dienen dat je componenten kan gaan plaatsen op je scherm die we zometeen gaan creëren.

    De Runnable interface zorgt ervoor dat het zometeen mogelijk is om threads te gebruiken.

    We gaan nu een aantal variabelen toevoegen aan de klasse:

    Source Code

    1. package com.michaelbeers.elysium;
    2. public class Game extends Canvas implements Runnable {
    3. private static final long serialVersionUID = 1L;
    4. public static String title = "Elysium Client";
    5. public static int width = 300;
    6. public static int height = width / 16 * 9;
    7. public static int scale = 3;
    8. private Thread thread;
    9. private JFrame frame;
    10. private boolean running = false;
    11. }
    Display All


    serialVersionUID is een verplichte variable waardoor de klasse een uniek nummer krijgt en daardoor o.a. niet meer backward compatible is.

    title de naam zegt genoeg, dit is de titel van de engine/client.

    width dit wordt de breedte van het scherm.

    height dit wordt de hoogte van het scherm, natuurlijk kan je dit handmatig invullen alleen het voordeel van Java is dat je hiermee kan rekenen. Doordat de huidige schermresolutie 16x9 is delen we de breedte door 16 en vermedigvuldigen we het met 9.

    scale hiermee kunnen we het scherm schalen, voor nu heb ik dit op 3 staan maar later gaan we deze misschien wel naar 1 zetten.

    thread hier wordt de thread opgeslagen van de client. Een Thread is een begrip in Java wat vrij ingewikkeld is om uit te leggen maar kort samengevat is dit een proces binnen je programma (proces in een proces) waardoor je meerdere dingen tegelijk kan laten uitvoeren.

    frame hier wordt het scherm van de client opgeslagen.

    running hier wordt opgeslagen of de client nogsteeds aan staat of niet.

    Nu hebben we de variabelen gemaakt die voor nu nodig zijn alleen kunnen we hier eigenlijk nog niks mee. Daarom gaan we nu 2 extra methoden toevoegen:

    Source Code

    1. package com.michaelbeers.elysium;
    2. public class Game extends Canvas implements Runnable {
    3. private static final long serialVersionUID = 1L;
    4. public static String title = "Elysium Client";
    5. public static int width = 300;
    6. public static int height = width / 16 * 9;
    7. public static int scale = 3;
    8. private Thread thread;
    9. private JFrame frame;
    10. private boolean running = false;
    11. public static void main(String[] args) {
    12. }
    13. public Game() {
    14. }
    15. }
    Display All


    De main methoden is een methoden die de compiler van Java automatisch opzoekt om de applicatie te starten.

    De Game methoden is de methoden waarmee de instantie van de klasse wordt aangemaakt, dit wordt ook wel de constructor genoemd.

    Nu deze methoden zijn aangemaakt dienen deze gevuld te worden. Dit zal ik niet regel voor regel uitleggen maar wel zal ik veel comment blocks plaatsen met wat welke functionaliteit doet.

    Source Code

    1. public static void main(String[] args) {
    2. // Maakt een nieuwe instantie aan van de klasse Game.
    3. // Hierdoor kunnen we alles aanroepen wat in de klasse Game voorkomt.
    4. Game game = new Game();
    5. // Hiermee stel je in of het scherm resizable mag zijn.
    6. game.frame.setResizable(false);
    7. // Hiermee stel je de titel van het scherm in.
    8. game.frame.setTitle(title);
    9. // Hiermee plaats je de instantie van de Game klasse in het scherm als component.
    10. // Zorgt er dus voor dat het scherm ergens mee gevuld wordt.
    11. // Dit kan omdat het Canvas is geextends is.
    12. game.frame.add(game);
    13. // Zorgt er voor dat de breedte en hoogte word ingesteld gebaseerd op het
    14. // component in ons geval Canvas.
    15. game.frame.pack();
    16. // Hiermee stel je de actie in van het scherm wanneer je deze sluit.
    17. game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18. // Hiermee stel je in dat het scherm gecentreerd moet worden.
    19. game.frame.setLocationRelativeTo(null);
    20. // Hiermee stel je in dat het scherm zichtbaar moet zijn
    21. // Standaard is dit niet zo (geen idee waarom).
    22. game.frame.setVisible(true);
    23. }
    24. public Game() {
    25. // Maakt een nieuwe dimentie aan voor het het Canvas object.
    26. // Om de breedte een hoogte te bepalen gebruiken we de breedte x de schaal van het scherm
    27. // en voor de hoogte de hoogte x de schaal.
    28. Dimension size = new Dimension(width * scale, height * scale);
    29. // Dit stelt de breedte en hoogte in van het Canvas.
    30. // Deze methoden is onderdeel van het Canvas object.
    31. setPreferredSize(size);
    32. // Initialiseert het scherm voor de client.
    33. this.frame = new JFrame();
    34. }
    Display All


    Nu deze methoden zijn gevuld zul je nog veel meer errors te krijgen, het wordt nu tijd om deze op te lossen. Dit doe je door CTRL+SHIFT+O nu zal er nog 1 error over blijven. Dit komt omdat de interface Runnable jou dwingt de methoden run() toe te voegen in de klasse. Daarom gaan we nu de 3 laatste methoden toevoegen van de introductie van deze game development tutorials. Dit zijn de volgende methoden: start(), stop() en de verplichte run() methoden.

    Net als de 2 vorige methoden zal ik de code plaatsen met veel comments zodat er duidelijk wordt wat ik precies doe:

    Source Code

    1. public synchronized void start() {
    2. // Dit zorgt er alleen voor dat jouw applicatie herkent dat de client
    3. // nu gestart is.
    4. running = true;
    5. // Maakt een nieuwe instantie aan van een Thread.
    6. // In de thread wordt onze huidige instantie meegegeven, gevolgd door
    7. // de naam van de Thread (dit is puur om alles te organiseren)
    8. thread = new Thread(this, "Display");
    9. // Dit start the thread en roept daarmee automatisch de run() methoden aan.
    10. thread.start();
    11. }
    12. public synchronized void stop() {
    13. // Dit zorgt ervoor dat jouw applicatie herkent dat de client
    14. // nu gestopt is waardoor de gameloop niet meer doorgaat.
    15. running = false;
    16. // Hiermee stopt de thread en zorg je ervoor dat ook het proces stopt
    17. // Dit is nodig om er voor te zorgen dat bijvoorbeeld je muziek niet door blijft
    18. // spelen wanneer je de client hebt gesloten. (vast wel eens meegemaakt)
    19. try {
    20. thread.join();
    21. } catch (InterruptedException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. /**
    26. * Dit is de verplichte run methoden.
    27. * Deze wordt automatisch aangeroepen wanneer je een thread start.
    28. */
    29. @Override
    30. public void run() {
    31. // Dit is de game loop.
    32. // De game loop blijft oneindig doorgaan totdat de client stopt.
    33. // Dit zorgt er voor dat we dingen kunnen gaan updaten en renderen.
    34. //
    35. // Doordat running in start() op true wordt gezet blijft dit doorgaan.
    36. while (running) {
    37. // Dit is een console bericht om te testen of het werkt!
    38. System.out.println("Running...");
    39. }
    40. // Roept de stop functie aan wanneer er iets verkeerd gaat
    41. // in de game loop.
    42. stop();
    43. }
    Display All


    Nu zijn alle errors weg en moet er onderaan de main() methoden alleen nog de regel game.start() worden toegevoegd. Wanneer je nu op de play knop of debug knop drukt zal je het volgende resultaat te zien krijgen:

    [Blocked Image: https://raw.githubusercontent.com/michaelbeers/Elysium/master/Afbeeldingen/01_03.jpg]

    Nu rest er alleen nog een antwoord op de vraag: Waarom wordt er in de start() en stop() een synchronized methoden gebruikt? Zoals ik hierboven al kort heb uitgelegd is een Thread een proces binnen je programma. Dit proces gebruikt geheugen van jouw computer waarin conflicten kunnen ontstaan. Met een synchronized methoden zorg je ervoor dat Java een soort "strategie" opbouwt waardoor deze problemen met je geheugen niet meer voorkomen, zeer effectief dus! Het risico is echter wel dat er bij meerdere Threads een zo genoemde "deadlock" veroorzaakt kan worden waardoor een Thread geblokkeerd wordt en je applicatie crasht.

    Dit was dan de eerste tutorial voor het maken van games. Veel informatie in zo'n introductie maar ik hoop dat jullie er al wat aan hebben ondanks er nog weinig resultaat is ;). Mochten er vragen, opmerkingen of aanvullingen zijn zal ik deze uiteraard beantwoorden. Ik zal een Github repository bijhouden zodat iedereen eventueel op zijn gemak de code kan door kijken.

    Github EP 01 - Introductie

    Met vriendelijke groet,

    Michael Beers

    Vervolg: ictscripters.com/index.php?pag…y&userID=27245&entryID=92
    Dit was mijn spreekbeurt, zijn er nog vragen?

    1,535 times read

Comments 5

  • M.Beers -

    @tijmen2000, met de opbouw die ik gebruik is het mogelijk om de client te verwerken in een web-applicatie, dit zal ik misschien later nog gaan toelichten. Voor nu is het alleen desktop client, omdat je sinds de laatste updates binnen Java een trusted SSL-certificaat moet koppelen aan je web-applicatie om zonder het aanpassen van je security instellingen de web-applicatie uit te voeren.

  • tijmen2000 -

    Gaaf, ik wil aan de slag gaan met je serie! Is het eignelijk mogelijk om zo'n game ook werken op een domeinnaam te plaatsen?

  • K.Rens -

    Wow, er komt veel kijken bij het opstarten van een venster.

    Wel interessant, veel bijgeleerd.
    Wist bv niet van de synchronised, bedankt!

  • M.Beers -

    Zover ik weet maakt dit niks uit, zolang je JRE en JDK maar up-to-date zijn zou dit moeten werken. Je zou alleen in de tutorials misschien dingen op een andere plek in de IDE moeten zoeken want zelf gebruik ik de nieuwste versie van Eclipse ;)

    p.s. Voor de nieuwsgierige onder ons, ik ben nu bezig met EP 02, hierin ga ik het hebben over het renderen van het scherm en komt er daadwerkelijk ook iets op het scherm te staan ;)

  • R.Haentjens -

    Maakt het eigenlijk uit welke versie van eclipse ik gebruik?

    Ik maak nu gebruik van Eclipse Standard 4.3.2.
    Moet ook werken?