image image


Tutorial: Basic Side Scroller mit P5.js (Teil 1)

Natürlich möchte ich meine Erkundungen von P5.js, dem JavaScript-Mode von Processing fortsetzen. Daher habe ich als einen nächsten Schritt einfach den Basic Side Scroller (Teil 2) mit Bewegungsparallaxe, den ich im Frühjahr dieses Jahres schon einmal in Processing.py, dem Python-Mode von Processing, programmiert hatte, mehr oder weniger Eins-zu-Eins in JavaScript nachprogrammiert. Hier der Quellcode:

// Sidescroller 1

const aliens = [];
const clouds = [];
const bighills = [];
const smallhills = [];

function preload() {
        alienwalk1 = loadImage("images/alienwalk1.png");
        alienwalk2 = loadImage("images/alienwalk2.png");
        alienjumps = loadImage("images/alienjumps.png");
}

function setup() {
        const myCanvas = createCanvas(800, 450);
        myCanvas.parent("myCanvas");
        clouds.push(new Cloud(700, -0.25));
        for (let i = 0; i < 3; i++) {
                bighills.push(new Hill(i*400, 200, -0.5, "#63e06b"));
        }
        for (let i = 0; i < 6; i++) {
                smallhills.push(new Hill(i*200, 100, -0.75, "#217424"));
        }
        aliens.push(new Alien(66, 320));
        noStroke();
}

function draw() {
        background(64, 176, 226);
        // Langsame Wolke ganz im Hintergrund
        for (let cloud of clouds) {
                cloud.update();
                cloud.show();
        }
        // Große Hügel im Hintergrund
        for (let bighill of bighills) {
                bighill.update();
                bighill.show();
        }
        // Kleine Hügel davor
        for (let smallhill of smallhills) {
                smallhill.update();
                smallhill.show();
        }
        // Erdboden
        fill("#ffd05e");
        rect(0, 400, width, 50)
        // Alien
        for (let alien of aliens) {
                alien.update();
                alien.show();
        }
}

function keyPressed() {
        let alien = aliens[0];
        if (((keyCode === UP_ARROW) || (key === "w")) && (alien.status == "walking")) {
                alien.vely = -6;
                alien.status = "jumping";
        }
}

// Hintergrund-Objekte

class Cloud {
        
        constructor(x, s) {
                this.xpos = x;
                this.step = s;
        }
        
        update() {
                this.xpos += this.step;
                if (this.xpos <= -200) {
                        this.xpos = width + 200;
                }
        }
        
        show() {
                fill("#ffffff");
                ellipse(this.xpos, 150, 100);
                ellipse(this.xpos, 200, 100);
                ellipse(this.xpos - 50, 200, 100);
                ellipse(this.xpos + 50, 200, 100);
        }
}

class Hill {
        
        constructor(x, r, s, c) {
                this.xpos = x;
                this.radius = r;
                this.step = s;
                this.col = c;
        }
        
        update() {
                this.xpos += this.step;
                if (this.xpos <= -this.radius) {
                        this.xpos = width + this.radius;
                }
        }
        
        show() {
                fill(this.col);
                ellipse(this.xpos, 400, 2*this.radius);
        }
}

// Sprites

class Alien {
        
        constructor(x, y) {
                this.xpos = x;
                this.ypos = y;
                this.status = "walking";
                this.im1 = alienwalk1;
                this.im2 = alienwalk2;
                this.im3 = alienjumps;
                this.count = 0;
                this.vely = 0;
        }
        
        update() {
                if (this.status == "jumping") {
                        this.vely += 0.1;
                }
        }
        
        show() {
                if (this.status == "walking") {
                        this.count += 1;
                        if (this.count > 15) {
                                this.count = 0;
                        }
                        if (this.count < 8) {
                                image(this.im1, this.xpos, this.ypos);
                        } else {
                                image(this.im2, this.xpos, this.ypos);
                        }
                } else if (this.status == "jumping") {
                        this.ypos += this.vely;
                        image(this.im3, this.xpos, this.ypos);
                        if (this.ypos >= 320) {
                                this.ypos = 320;
                                this.status = "walking";
                                this.vely = 0;
                        }
                }
        }
}

Zu diesem Nachbau gibt es im derzeitigen Stadium nicht allzuviel zu sagen, es steht alles schon im Text zur Python-Version. Wie dort bringt der Pfeil nach oben, das kleine rosa Alien zum Hüpfen, da jedoch der Browser ebenfalls meint, auf die Pfeiltaste reagieren zu müssen, bevor er sie an JavaScript durchreicht, habe ich zusätzlich die Möglichkeit eingebaut, diesen Hüpfvorgang alternativ mit der Taste w zu triggern (siehe keyPressed()). Meine erste Idee, alternativ die SPACE-Taste zu verwenden, habe ich nach ersten Tests sofort wieder verworfen, mit dieser stellt mein Browser (Chrome) noch größeren Unsinn als mit der Pfeiltaste an.

Die Bildchen des Aliens stammen wieder aus dem unerschöpflichen Fundus der freien Sprite-Sammlung von Kenney.nl, die ich mit der Bildverarbeitung meines Vertrauens ein wenig zurechtgestutzt habe. Damit Ihr das Spielchen nachprogrammieren könnt, habe ich sie in die Seite eingebunden:

imageimageimage

Es macht Spaß, wenn man das Ergebnis seiner Programmierübungen direkt im Browser vorführen kann und ich habe vor, dieses Spielchen weiterzutreiben. In einer nächsten Version soll unser Held über Hindernisse hüpfen und wenn er auf ein Hindernis trifft, ist das Spiel vorbei. Für die Kollisionserkennung möchte ich die Bibliothek p5.collide2D verwenden, die auf dem wunderbaren und freien (Online-) Buch Collision Detection von Jeff Thompson basiert. Schaun wir mal, ob mir das alles gelingt.

Wie gesagt, die Programmierung in JavaScript ist neu für mich. So hadere ich immer noch mit der Frage, wann ich ein Semicolon setzen muß/darf und wann nicht. Und es ist mir (noch) nicht gelungen, die Klassen-Definitionen in eine separate Datei auszulagern. Falls daher jemand meiner Leserinnen oder Leser etwas verbesserungswürdig findet, wäre ich für eine Mitteilung in meinen (Email-) Kommentaren dankbar. Still digging!


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image