[TUT] Game development 10 - Player movement

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

  • Dit is een vervolg op: [TUT] Game development 09 - Entities, Mobs en Players framework

    Hallo ICTScripters,

    Inmiddels hebben we de 3 entity frameworks af en kunnen we deze gaan koppelen aan de game. Dat is wat wij gaan behandelen in deze tutorial en we gaan er voor zorgen dat een speler zich kan bewegen binnen het level.

    Allereerst gaan we beginnen met de movement van de Mob. Hiervoor zijn er 2 checks nodig namelijk welke directie gaat de mob op? en loopt de mob tegen een solide tile aan (bijv een muur)? Voor dat laatste hebben wij een handige methoden gereserveerd namelijk de collision() methoden. Ga daarom naar de Mob klasse en vervang de volgende code binnen de move() methoden:

    Source Code

    1. public void move(int xa, int ya) {
    2. if (xa > 0) {
    3. this.dir = 1;
    4. }
    5. if (xa < 0) {
    6. this.dir = 3;
    7. }
    8. if (ya > 0) {
    9. this.dir = 2;
    10. }
    11. if (ya < 0) {
    12. this.dir = 0;
    13. }
    14. if (!collision()) {
    15. this.x += xa;
    16. this.y += ya;
    17. }
    18. }
    Display All


    Nu de move() methoden klaar is, zoals je waarschijnlijk wel is opgevallen dient deze als algemene functie voor movement. Deze moeten wij dus gaan verwerken in de update() functie van de Player klasse, echter missen wij aller eerst nog een manier om de speler aan te sturen... de input oftewel de Keyboard klasse. We beginnen dus als eerst met het aanpassen van de Player constructors, door hier een Keyboard parameter aan toe te voegen, om deze vervolgens op te slaan in een algemene variabel.

    Source Code

    1. public class Player extends Mob {
    2. private Keyboard input;
    3. public Player(Keyboard input) {
    4. this.input = input;
    5. }
    6. public Player(int x, int y, Keyboard input) {
    7. this.x = x;
    8. this.y = y;
    9. this.input = input;
    10. }
    11. // ...
    12. }
    Display All

    Dan is het nu tijd om de speler te laten bewegen. Omdat dit in de logica van een speler zit gaan we hiervoor de update() methoden aanpassen/invullen, hier komt dan ook gelijk de Keyboard klasse aanbod omdat wij willen dat de speler beweegt door middel van de WASD/UP-DOWN-LEFT-RIGHT knoppen.

    Source Code

    1. int xa = 0;
    2. int ya = 0;
    3. if (input.up) {
    4. ya--;
    5. }
    6. if (input.down) {
    7. ya++;
    8. }
    9. if (input.left) {
    10. xa--;
    11. }
    12. if (input.right) {
    13. xa++;
    14. }
    15. // Hier wordt gekeken of een speler wel beweegt
    16. // Dus de xa en ya is gemanipuleerd door het toetsenbord.
    17. if (xa != 0 || ya != 0) {
    18. move(xa, ya);
    19. }
    Display All

    Nu kunnen we de speler initialiseren in de Game klasse. Hiervoor ga ik geen uitleg geven dit hebben we tenslotte al meerder malen gedaan ;)...

    Bij de variabelen:

    Source Code

    1. private Thread thread;
    2. private JFrame frame;
    3. private Keyboard key;
    4. private Level level;
    5. private Player player;
    6. private boolean running = false;


    Bij de Game() constructor:

    Source Code

    1. this.screen = new Screen(width, height);
    2. this.frame = new JFrame();
    3. this.key = new Keyboard();
    4. this.level = new RandomLevel(64,64);
    5. this.player = new Player(key);


    Nu rest ons alleen nog het aanpassen van de update() en render() methoden. In de update() methoden kunnen we nu de input volledig weghalen en deze vervangen voor player.update():

    Source Code

    1. public void update() {
    2. key.update();
    3. player.update();
    4. }


    In de render() methoden passen we de level.render() functie alleen aan, hier vervangen we de x en y voor player.x en player.y:

    Source Code

    1. level.render(player.x, player.y, screen);


    Vergeet tot slot de imports niet te fixen met CTRL+SHIFT+O ;)


    Wanneer je nu de game opstart zal je merken dat er niks veranderd is... tenminste dat denk je ;). Inplaats dat we het level nu aansturen via de x en y van de Game klasse, zal het level nu aangestuurd worden d.m.v. de speler. De speler heeft nu dus de leidende rol waardoor de variabele x en y in Game niet meer van toepassing zijn.

    Wat is is hier het nut van?
    Dit stelt ons in staat om de camera/viewport op basis van de speler te manipuleren. Hierdoor kunnen we net als in Pokémon op de Gameboy straks de speler centreren en om de speler heen het level renderen, wat in principe nu al automatisch gebeurd.

    Dit was het einde van deze tutorial, in tutorial 9 gaf ik aan dat we de speler ook zouden gaan renderen alleen ik kwam nog een aantal problemen tegen die ik in de volgende tutorial ga oplossen. Daarnaast kost het ook wat extra tijd om nieuwe Sprites te tekenen voor de speler doordat deze 4 aanzichten hebben (noord, oost, zuid, west).

    Edit: Bug gefixt, als het goed is werkt de applicatie nu naar behoren.
    Dit was mijn spreekbeurt, zijn er nog vragen?

    813 times read

Comments 0