أحدث البرامج التعليمية وتطوير الشبكة
 

العقبات لعبة HTML


دفع أزرار لتحريك مربع أحمر:



واليسار



إضافة بعض العقبات

الآن نريد أن نضيف العقبات سوم لعبتنا.

إضافة مكون جديد إلى منطقة الألعاب. جعله الخضراء، واسعة 10px، 200px عالية، ووضعه 300px إلى اليمين و120px أسفل.

أيضا تحديث المكون عقبة في كل إطار:

مثال

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();
}
انها محاولة لنفسك »

ضرب العقبة = أكثر من لعبة

في المثال أعلاه، لا شيء يحدث عند ضرب عقبة. في لعبة، وهذا ليس مرضيا جدا.

كيف لنا أن نعرف إذا كان لدينا مربع أحمر يضرب عقبة؟

إنشاء أسلوب جديد في منشئ مكون، أن chekcs إذا تعطل المكون مع مكون آخر. ينبغي أن تسمى هذه الطريقة في كل مرة الأطر التحديثات، 50 مرة في الثانية الواحدة.

أيضا إضافة stop() طريقة ل myGameArea الكائن، الذي يمهد فترة 20 مللي ثانية.

مثال

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();
    }
}
انها محاولة لنفسك »

العقبة مؤثرة

العقبة هي من أي خطر عندما يكون ثابت، لذلك نحن نريد أن تتحرك.

تغيير قيمة الخاصية من myObstacle.x في كل تحديث:

مثال

function updateGameArea() {
    if (myGamePiece.crashWith(myObstacle)) {
        myGameArea.stop();
    } else {
        myGameArea.clear();
        myObstacle.x += -1;
        myObstacle.update();
        myGamePiece.newPos();
        myGamePiece.update();
    }
}
انها محاولة لنفسك »

عقبات متعددة

كيف حول إضافة عقبات متعددة؟

لذلك نحن بحاجة إلى الملكية للإطارات العد، وطريقة للتنفيذ شيء بمعدل إطار معين.

مثال

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;
}

ترجع الدالة everyinterval الحقيقية إذا كان framenumber الحالي يتوافق مع فترة معينة.

لتحديد العقبات متعددة، أولا بتعريف المتغير عقبة كما صفيف.

ثانيا، نحن بحاجة إلى إجراء بعض التغييرات في وظيفة updateGameArea.

مثال

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();
}
انها محاولة لنفسك »

في updateGameArea وظيفة يجب أن يتكرر خلال كل عقبة لمعرفة ما إذا كان هناك حادث. إذا كان هناك حادث تحطم طائرة، و updateGameArea وظيفة التوقف، ويتم لا مزيد من الرسم.

و updateGameArea وظيفة تعول إطارات ويضيف عقبة أمام كل إطار ال150.


معوقات حجم عشوائي

لجعل اللعبة أكثر صعوبة بعض الشيء، والمرح، وسوف نرسل في العقبات من الأحجام بشكل عشوائي، بحيث مربع أحمر يجب أن تتحرك صعودا وهبوطا لعدم حدوث اى خلل.

مثال

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();
}
انها محاولة لنفسك »