Neueste Web-Entwicklung Tutorials
 

HTML Spiel Hindernisse


Drücken Sie die Tasten auf das rote Quadrat zu bewegen:







Fügen Sie einige Hindernisse

Jetzt wollen wir som Hindernisse für unser Spiel hinzuzufügen.

Fügen Sie eine neue Komponente in den Spielbereich. Machen Sie es grün, 10px breit, 200 Pixel hoch, und legen Sie es 300px nach rechts und nach unten 120px.

Auch aktualisieren das Hindernis Komponente in jedem Frame:

Beispiel

var myGamePiece;
var myObstacle;

function startGame() {
    myGamePiece = new component(30, 30, "red" , 10, 120);
    myObstacle = new component(10, 200, "green" , 300, 120);
    myGameArea.start();
}

function updateGameArea() {
    myGameArea.clear();
    myObstacle.update();
   
myGamePiece.newPos();
    myGamePiece.update();
}
Versuch es selber "

Hit The Obstacle = Game Over

In dem obigen Beispiel, geschieht nichts, wenn Sie das Hindernis treffen. In einem Spiel, das ist nicht sehr befriedigend.

Wie wissen wir, ob unser rotes Quadrat auf das Hindernis trifft?

Erstellen Sie eine neue Methode in der Komponentenbauer, dass chekcs wenn die Komponente Abstürze mit einer anderen Komponente. Diese Methode sollte jedes Mal die Rahmen-Updates, 50-mal pro Sekunde aufgerufen werden.

Auch ein Add stop() Methode zur myGameArea Objekt, das die 20 Millisekunden Intervall löscht.

Beispiel

var myGameArea = {
    canvas : document.createElement("canvas"),
    start : function() {
        this.canvas.width = 480;
        this.canvas.height = 270;
        this.context = this.canvas.getContext("2d");
        document.body.insertBefore(this.canvas, document.body.childNodes[0]);
        this.interval = setInterval(updateGameArea, 20);
    },
    clear : function() {
        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
    } ,
    stop : function() {
        clearInterval(this.interval);
    }
}

function component(width, height, color, x, y) {
    this.width = width;
    this.height = height;
    this.speedX = 0;
    this.speedY = 0;
    this.x = x;
    this.y = y;
    this.update = function() {
        ctx = myGameArea.context;
        ctx.fillStyle = color;
        ctx.fillRect(this.x, this.y, this.width, this.height);
    }
    this.newPos = function() {
        this.x += this.speedX;
        this.y += this.speedY;
    }
    this.crashWith = function(otherobj) {
        var myleft = this.x;
        var myright = this.x + (this.width);
        var mytop = this.y;
        var mybottom = this.y + (this.height);
        var otherleft = otherobj.x;
        var otherright = otherobj.x + (otherobj.width);
        var othertop = otherobj.y;
        var otherbottom = otherobj.y + (otherobj.height);
        var crash = true;
        if ((mybottom < othertop) ||
               (mytop > otherbottom) ||
               (myright < otherleft) ||
               (myleft > otherright)) {
           crash = false;
        }
        return crash;
    }
}

function updateGameArea() {
    if (myGamePiece.crashWith(myObstacle)) {
        myGameArea.stop();
    } else {
        myGameArea.clear();
        myObstacle.update();
        myGamePiece.newPos();
        myGamePiece.update();
    }
}
Versuch es selber "

Verschieben Hindernis

Das Hindernis ist keine Gefahr, wenn sie statisch ist, so dass wir wollen, dass es zu bewegen.

Ändern Sie den Wert der Eigenschaft myObstacle.x bei jedem Update:

Beispiel

function updateGameArea() {
    if (myGamePiece.crashWith(myObstacle)) {
        myGameArea.stop();
    } else {
        myGameArea.clear();
        myObstacle.x += -1;
        myObstacle.update();
        myGamePiece.newPos();
        myGamePiece.update();
    }
}
Versuch es selber "

Mehrere Hindernisse

Wie wäre es mehrere Hindernisse Hinzufügen?

Dafür brauchen wir eine Eigenschaft zum Zählen Rahmen, und ein Verfahren für etwas zu einem bestimmten Frame-Rate auszuführen.

Beispiel

var myGameArea = {
    canvas : document.createElement("canvas"),
    start : function() {
        this.canvas.width = 480;
        this.canvas.height = 270;
        this.context = this.canvas.getContext("2d");
        document.body.insertBefore(this.canvas, document.body.childNodes[0]);
        this.frameNo = 0;        
        this.interval = setInterval(updateGameArea, 20);
    },
    clear : function() {
        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
    },
    stop : function() {
        clearInterval(this.interval);
    }
}

function everyinterval(n) {
    if ((myGameArea.frameNo / n) % 1 == 0) {return true;}
    return false;
}

Die everyinterval Funktion gibt true zurück, wenn die aktuelle Framenummern mit dem angegebenen Intervall entspricht.

Um mehrere Hindernisse zu definieren, erklären zuerst das Hindernis Variable als Array.

Zweitens müssen wir einige Änderungen in der updateGameArea Funktion machen.

Beispiel

var myGamePiece;
var myObstacles = [];

function updateGameArea() {
    var x, y;
    for (i = 0; i < myObstacles.length; i += 1) {
        if (myGamePiece.crashWith(myObstacles[i])) {
            myGameArea.stop();
            return;
        }
    }
    myGameArea.clear();
    myGameArea.frameNo += 1;
    if (myGameArea.frameNo == 1 || everyinterval(150)) {
        x = myGameArea.canvas.width;
        y = myGameArea.canvas.height - 200
        myObstacles.push(new component(10, 200, "green" , x, y));
    }
    for (i = 0; i < myObstacles.length; i += 1) {
        myObstacles[i].x += -1;
        myObstacles[i].update();
    }
    myGamePiece.newPos();
    myGamePiece.update();
}
Versuch es selber "

In der updateGameArea Funktion durch jedes Hindernis müssen wir Schleife , um zu sehen , ob es einen Absturz. Wenn es einen Absturz, der updateGameArea wird Stopp - Funktion, und nicht mehr Zeichnung erfolgt.

Die updateGameArea Funktion zählt Frames und fügt ein Hindernis für jeden 150. Rahmen.


Hindernisse von Random Größe

Um das Spiel ein bisschen schwieriger, und Spaß, wir Hindernisse von Zufallsgrößen senden wird, so dass das rote Quadrat bewegen muss und bis zu nicht abstürzen.

Beispiel

function updateGameArea() {
    var x, height, gap, minHeight, maxHeight, minGap, maxGap;
    for (i = 0; i < myObstacles.length; i += 1) {
        if (myGamePiece.crashWith(myObstacles[i])) {
            myGameArea.stop();
            return;
        }
    }
    myGameArea.clear();
    myGameArea.frameNo += 1;
    if (myGameArea.frameNo == 1 || everyinterval(150)) {
        x = myGameArea.canvas.width;
        minHeight = 20;
        maxHeight = 200;
        height = Math.floor(Math.random()*(maxHeight-minHeight+1)+minHeight);
        minGap = 50;
        maxGap = 200;
        gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap);
        myObstacles.push(new component(10, height, "green" , x, 0));
        myObstacles.push(new component(10, x - height - gap, "green" , x, height + gap));
    }
    for (i = 0; i < myObstacles.length; i += 1) {
        myObstacles[i].x += -1;
        myObstacles[i].update();
    }
    myGamePiece.newPos();
    myGamePiece.update();
}
Versuch es selber "