ساخت بازی با کانواس و جاوا اسکریپت

saalek110

Well-Known Member
ورژن بوئینگ:
عکس png استفاده کردم.



Screenshot_۲۰۲۴-۰۲-۱۷_۰۳۰۷۳۳.jpg

ایرادی که الان داره ، تنظیم نشستن بر کف است. که فکر کنم در تابع مربوطه در component باید تنظیم بشود.

JavaScript:
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style>
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
  #the_heart {
    border:3px solid #fff733;
    border-radius:25px;

font-size:20px;

    margin-right:150px;
    margin-left:150px;

    padding-top:3px;
    padding-bottom:3px;

    padding-left:30px;

    background-color:rgba(250,130,30,1);
       }
</style>
</head>
<body onload="startGame()">
<img id="img2" src="images/plane.png" alt="plane" width="10" height="10">

 <script type='text/javascript'>
var myGamePiece;
var myObstacles = [];
var myScore;
let heart=1000;


function startGame() {

    myGamePiece = new component(2, 2, "red", 10, 120 , "hero");
    myGamePiece.gravity = 0.05;
    myScore = new component("30px", "Consolas", "black", 280, 40, "text");
    myGameArea.start();
}

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

function component(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.speedX = 0;
    this.speedY = 0; 
    this.x = x;
    this.y = y;
    this.gravity = 0;
    this.gravitySpeed = 0;
    this.update = function() {
        ctx = myGameArea.context;
        if (this.type == "text") {
            ctx.font = this.width + " " + this.height;
            ctx.fillStyle = color;
            ctx.fillText(this.text, this.x, this.y);
        } else if(this.type=="hero")
        {
              var img = document.getElementById("plane");
                ctx.drawImage(   document.getElementById("img2") ,this.x,this.y,50,50);
        }
        else {
            ctx.fillStyle = color;
            ctx.fillRect(this.x, this.y, this.width, this.height);
        }
    }
    this.newPos = function() {
        this.gravitySpeed += this.gravity;
        this.x += this.speedX;
        this.y += this.speedY + this.gravitySpeed;
        this.hitBottom();
    }
    this.hitBottom = function() {
        var rockbottom = myGameArea.canvas.height - this.height;
        if (this.y > rockbottom) {
            this.y = rockbottom;
            this.gravitySpeed = 0;
        }
    }
    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() {
    var x, height, gap, minHeight, maxHeight, minGap, maxGap;
    for (i = 0; i < myObstacles.length; i += 1) {
        if (myGamePiece.crashWith(myObstacles[i])) {
heart--;
if (heart<0)
            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 = 100
        maxGap = 150;
        gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap)+50;
        if (height>120)
        {
        myObstacles.push(new component(40, height, "red", x, 0));
         myObstacles.push(new component(40, x - height - gap, "red", x, height + gap));

        }//height>120
                if (height<=120)
         {
        myObstacles.push(new component(40, height, "green", x, 0));
        myObstacles.push(new component(40, x - height - gap, "green", x, height + gap));
          }// height<=120
    }
    for (i = 0; i < myObstacles.length; i += 1) {
        myObstacles[i].x += -1;
        myObstacles[i].update();
    }
    myScore.text="SCORE: " + myGameArea.frameNo;
//  heart.text="heart= ";  //+heart.toString();
    myScore.update();
 //heart.update();
document.getElementById("the_heart").innerHTML="heart= " + JSON.stringify(heart);
    myGamePiece.newPos();
    myGamePiece.update();
}

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

function accelerate(n) {
    myGamePiece.gravity = n;
  
}
</script>
<br>
<br>
<br>

<center>
<p id="the_heart"></p>
<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(-0.04)">up</button>


<button type="button" style=" font-size:12px; height:55px; width:120px" onclick="accelerate(0.5)">ground</button>


<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(0.04)">down</button>
</center>

<p>Use the up and down button to stay in the air</p>


<p>How long can you stay alive?</p>
</body>
</html>
 
آخرین ویرایش:

saalek110

Well-Known Member

مطالب خوبی داره.
 

saalek110

Well-Known Member
ورژن بوئینگ و f4 ، دارای قهرمان به شکل عکس هستند ، ولی اسکلت اون بازی برای قهرمان به شکل مربع است.پس باید تغییرات لازم اعمال شود... در landing یعنی فرود روی زمین ، الان اشتباه است.


خروج قهرمان از کلاس:
.. بیاییم قهرمان را از کلاس component خارج کنیم ، و کارهای قهرمان را بیرون کلاس انجام دهیم... من فکر می کنم این طوری هم دستمان باز است که بیشتر روی قهرمان کار کنیم ، هم حسابش باید از در و دیوار جدا باشه.

انشقاق به چند فایل:
یک تغییر دیگه انشقاق به چند فایل است تا این جوری فایل بلند نباشه. مثلا ما که css را فعلا دست نمی زنیم ، دلیل نداره مدام جزو فایل ببینیم اون را. اینها را خارج می کنیم. تا روی هر تکه راحت تر بتوانیم کار کنیم.
 

saalek110

Well-Known Member
تقسیم به فایلهای مختلف:
شاید بهتر باشد آفلاین کار کنیم ، چون جاوا اسکریپت که سرور نمی خواهد...فقط نتیجه نهایی را در هاست آپلود کنم تا شما ببینید.

فایل اصلی دارای کدهای زیر است. ۳ فایل ازش خارج شدند و خلوت تر شد. اولی فایل css اونجا که نوشته:
HTML:
    <link rel="stylesheet" href="my_css.css">
و دو فایل دیگه این طوری لینک داده شده اند:
HTML:
<script src="component.js"></script>
<script src="updateGameArea.js"></script>

می بینید که کد زیر کمی خلوت تر شد.

JavaScript:
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="my_css.css">
<style>
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
</style>
</head>
<body onload="startGame()">
<img id="img2" src="images/plane.png" alt="plane" width="10" height="10">

 <script type='text/javascript'>
var myGamePiece;
var myObstacles = [];
var myScore;
let heart=1000;


function startGame() {

    myGamePiece = new component(2, 2, "red", 10, 120 , "hero");
    myGamePiece.gravity = 0.05;
    myScore = new component("30px", "Consolas", "black", 280, 40, "text");
    myGameArea.start();
}

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);
    }
}
<script src="component.js"></script>
<script src="updateGameArea.js"></script>

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

function accelerate(n) {
    myGamePiece.gravity = n;
  
}
</script>
<br>
<br>
<br>

<center>
<p id="the_heart"></p>
<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(-0.04)">up</button>


<button type="button" style=" font-size:12px; height:55px; width:120px" onclick="accelerate(0.5)">ground</button>


<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(0.04)">down</button>
</center>

<p>Use the up and down button to stay in the air</p>


<p>How long can you stay alive?</p>
</body>
</html>
 
آخرین ویرایش:

saalek110

Well-Known Member
فایل مادر که در پست قبل کدش را گذاشتم ، فعلا کاری باهاش نداریم ، و می خواهیم روی فایلهای component و آپدیت گیم ایریا کار کنیم. کدشون اینهاست:
JavaScript:
function component(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.speedX = 0;
    this.speedY = 0;  
    this.x = x;
    this.y = y;
    this.gravity = 0;
    this.gravitySpeed = 0;
    this.update = function() {
        ctx = myGameArea.context;
        if (this.type == "text") {
            ctx.font = this.width + " " + this.height;
            ctx.fillStyle = color;
            ctx.fillText(this.text, this.x, this.y);
        } else if(this.type=="hero")
        {
              var img = document.getElementById("plane");
                ctx.drawImage(   document.getElementById("img2") ,this.x,this.y,50,50);
        }
        else {
            ctx.fillStyle = color;
            ctx.fillRect(this.x, this.y, this.width, this.height);
        }
    }
    this.newPos = function() {
        this.gravitySpeed += this.gravity;
        this.x += this.speedX;
        this.y += this.speedY + this.gravitySpeed;
        this.hitBottom();
    }
    this.hitBottom = function() {
        var rockbottom = myGameArea.canvas.height - this.height;
        if (this.y > rockbottom) {
            this.y = rockbottom;
            this.gravitySpeed = 0;
        }
    }
    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;
    }
}
JavaScript:
function updateGameArea() {
    var x, height, gap, minHeight, maxHeight, minGap, maxGap;
    for (i = 0; i < myObstacles.length; i += 1) {
        if (myGamePiece.crashWith(myObstacles[i])) {
heart--;
if (heart<0)
            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 = 100
        maxGap = 150;
        gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap)+50;
        if (height>120)
        {
        myObstacles.push(new component(40, height, "red", x, 0));
         myObstacles.push(new component(40, x - height - gap, "red", x, height + gap));

        }//height>120
                if (height<=120)
         {
        myObstacles.push(new component(40, height, "green", x, 0));
        myObstacles.push(new component(40, x - height - gap, "green", x, height + gap));
          }// height<=120
    }
    for (i = 0; i < myObstacles.length; i += 1) {
        myObstacles[i].x += -1;
        myObstacles[i].update();
    }
    myScore.text="SCORE: " + myGameArea.frameNo;
    myScore.update();
document.getElementById("the_heart").innerHTML="heart= " + JSON.stringify(heart);
    myGamePiece.newPos();
    myGamePiece.update();
}
 

saalek110

Well-Known Member

1708180610271.jpg

این کدها ، کدهای بوئینگ مدل sky است. و این پست ، پست sky است. بعدا شاید از این پست اسم ببرم. و کدهایش مرجع برای ورژن های بعدی هواپیما باشد. مثلا احتمالا کلاس component تا مدتی ثابت می مونه.. و بیشتر روی کلاس boing کار می کنم.

فایل اصلی:
JavaScript:
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="my_css.css">
<style>
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
</style>
</head>
<body onload="startGame()">
<img id="img2" src="images/plane.png" alt="plane" width="10" height="10">

 <script type='text/javascript'>
var boing;
var myObstacles = [];
var myScore;
let heart=1000;


function startGame() {

    boing = new boing(2, 2, "red", 10, 120 , "hero");
       boing.elevation = 0.0;
  
//boing.gravity = 0.05;
    myScore = new component("20px", "Consolas", "black", 280, 40, "text");
   document.getElementById("gamearea").innerHTML+="Ready" ;
myGameArea.start();
}

var myGameArea = {
    canvas : document.createElement("canvas"),
    start : function() {
document.getElementById("gamearea").innerHTML+=" start" ;
        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);
    }
}
</script>
<script src="component.js"></script>
<script src="boing.js"></script>
<script src="updateGameArea.js"></script>
<script>
function everyinterval(n) {
    if ((myGameArea.frameNo / n) % 1 == 0) {return true;}
    return false;
}

function accelerate(n) {
    boing.elevation = n;
  
}
</script>
<br>
<br>
<br>

<center>
<p id="the_heart"></p>

<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(-1)">up</button>


<button type="button" style=" font-size:12px; height:55px; width:120px" onclick="accelerate(0)">stop</button>


<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(1)">down</button>
</center>

<p>Use the up and down button to stay in the air</p>


<p>How long can you stay alive?</p>
<p id="gamearea"></p>
</body>
</html>

فایل component.js:

JavaScript:
function component(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.x = x;
    this.y = y;
    this.update = function() {
        ctx = myGameArea.context;
        if (this.type == "text") {
            ctx.font = this.width + " " + this.height;
            ctx.fillStyle = color;
            ctx.fillText(this.text, this.x, this.y);
        }  else {
            ctx.fillStyle = color;
            ctx.fillRect(this.x, this.y, this.width, this.height);
        }
    }
 
  
}
فایل boing.js:


JavaScript:
function boing(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.speedX = 0;
    this.speedY = 0; 
    this.x = x;
    this.y = y;
    this.gravity = 0;
    this.gravitySpeed = 0;
    this.elevation = 0;
    this.update = function() {
        ctx = myGameArea.context;

              var img = document.getElementById("plane");
                ctx.drawImage(   document.getElementById("img2") ,this.x,this.y,50,50);
      
  
    }
    this.newPos = function() {
       // this.gravitySpeed += this.gravity;
       // this.x += this.speedX;
      //  this.y += this.speedY + this.gravitySpeed;
       this.y += this.elevation;
        this.hitBottom();
    }
    this.hitBottom = function() {
        var rockbottom = myGameArea.canvas.height - this.height-35;
        if (this.y > rockbottom) {
            this.y = rockbottom;
            this.elevation=0;
           // this.gravitySpeed = 0;
        }
    }
    this.crashWith = function(otherobj) {
        var myleft = this.x;
        var myright = this.x + (this.width);
        var mytop = this.y+35;
        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;
    }
}

فایل updateGameArea:
با پسوند js

JavaScript:
function updateGameArea() {
    var x, height, gap, minHeight, maxHeight, minGap, maxGap;
    for (i = 0; i < myObstacles.length; i += 1) {
      
        if (boing.crashWith(myObstacles[i])) {
heart--;
if (heart<0)
            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 = 100
        maxGap = 150;
        gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap)+50;
        if (height>120)
        {
        myObstacles.push(new component(40, height, "red", x, 0));
         myObstacles.push(new component(40, x - height - gap, "red", x, height + gap));

        }//height>120
                if (height<=120)
         {
        myObstacles.push(new component(40, height, "green", x, 0));
        myObstacles.push(new component(40, x - height - gap, "green", x, height + gap));
          }// height<=120
    }
    for (i = 0; i < myObstacles.length; i += 1) {
        myObstacles[i].x += -1;
        myObstacles[i].update();
    }
    myScore.text="SCORE: " + myGameArea.frameNo;
    myScore.update();
 
document.getElementById("the_heart").innerHTML="heart= " + JSON.stringify(heart);
    boing.newPos();
    boing.update();
}

فایل my_css.css:


CSS:
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
  #the_heart {
    border:3px solid #fff733;
    border-radius:25px;

font-size:20px;

    margin-right:150px;
    margin-left:150px;

    padding-top:3px;
    padding-bottom:3px;

    padding-left:30px;

    background-color:rgba(250,130,30,1);
       }
و
یک پوشه به نام images کنار فایل است و فایل plane.png داخلش است.
 
آخرین ویرایش:

saalek110

Well-Known Member
شرح تغییرات :
یک کلاس به نام boing درست کردم. تا کارهای بوئینگ اونجا انجام بشه.
در کلاس component کارهای دیوارها و رسم امتیاز ، حالا فقط انجام میشه.
اسم متغیر هواپیما هم boing است. یعنی با کلاس هم نام است. الزاما نباید هم نام باشد... سلیقه ای بود.
یک کمی هم اعداد اضافه و کم کردم تا برخوردها درست انجام بشه ولی فعلا با بلوک های پایینی برخوردشان خوب نیست. بلوک های زمینی اگر کوچک باشند برخوردی نداریم ، ولی اگر بلوک های پایینی کمی مرتفع باشند و هواپیما بر سطح زمین باشد ، آنگاه برخورد خواهیم داشت. با بلوک های بالایی برخورد تقریبا خوب انجام میشه.
کلا چون قهرمان قبلا مربع بوده و الان عکس است ، این کدهای برخورد به کارش نمی آید... باید کدهای عکس جایگزین بشه. شاید بعدا تصحیح کردم.

یک تغییر دیگر اینه که هواپیما یک فاکتور elevation فقط الان داره. می توانید بالارو یا پایین رو یا ایستا تنظیم کنید با ۳ دکمه پایین. دیگه نمی خواد هی بالا و پایین را بزنید تا هواپیما یک جا بیایستد ، دکمه وسطی را بزنی مستقیم میره.

فایل gif جایگزین کردم قبول کرد ، ولی داخل کانواس gif متحرک نبود.
 
آخرین ویرایش:

saalek110

Well-Known Member
تانک قدرتمند:


Screenshot_۲۰۲۴-۰۲-۱۷_۱۹۲۶۲۳.jpg


عکس تانک گذاشتم در این خطوط:
HTML:
<body onload="startGame()">
<img id="img2" src="images/plane.png" alt="plane" width="10" height="10">
یعنی در پوشه images اول فایل را آپلود کردم و بعد در خطوط بالا از فایل اصلی اسم فایل جدید را وارد کردم..

اگر به آدرس بالا دقت کنید نوشته boing2 و پوشه بازی پست قبل boing بود... من اومدم کل پوشه boing را کپی کردم و به boing2 تغییر نام دادم..... دیگه لازم نیست فایلها را تک تک کپی کنید..کل پوشه و فایلهایش را با هم کپی می کنید و بازی بعدی را می سازید. و بازی قبلی بی تغییر باقی می ماند.

فایل boing2.js
در فایل اصلی با اسم بالا صدا زدم.
JavaScript:
function boing(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.speedX = 0;
    this.speedY = 0;
    this.x = x;
    this.y = y;
    this.gravity = 0;
    this.gravitySpeed = 0;
    this.ahead = 0;
    this.update = function() {
        ctx = myGameArea.context;

              var img = document.getElementById("plane");
                ctx.drawImage(   document.getElementById("img2") ,this.x,this.y,50,50);
     
 
    }
    this.newPos = function() {
       // this.gravitySpeed += this.gravity;
       // this.x += this.speedX;
      //  this.y += this.speedY + this.gravitySpeed;
       this.x += this.ahead;
        this.hitBottom();
    }
    this.hitBottom = function() {
        var rockbottom = myGameArea.canvas.height - this.height-35;
        if (this.y > rockbottom) {
          //  this.y = rockbottom;
        //    this.elevation=0;
           // this.gravitySpeed = 0;
        }
    }
    this.crashWith = function(otherobj) {
        var myleft = this.x;
        var myright = this.x + (this.width);
        var mytop = this.y+35;
        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;
    }
}

.... این خطش عوض شده:
JavaScript:
   this.x += this.ahead;
که به جای بالا و پایین ، جلو و عقب برود.
و خط زیر به صفات کلاس اضافه شده:
JavaScript:
    this.ahead = 0;
فایل اصلی:
JavaScript:
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="my_css.css">
<style>
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
</style>
</head>
<body onload="startGame()">
<img id="img2" src="images/tank2.png" alt="plane" width="10" height="10">

 <script type='text/javascript'>
 //saalek121.fast-page.org/test/a/boing/boing_1000h_sky.html
var boing;
var myObstacles = [];
var myScore;
let heart=1000;


function startGame() {

    boing = new boing(2, 2, "red", 10, 235 , "hero");
       boing.elevation = 0.0;
 
//boing.gravity = 0.05;
    myScore = new component("20px", "Consolas", "black", 280, 40, "text");
   document.getElementById("gamearea").innerHTML+="Ready" ;
myGameArea.start();
}

var myGameArea = {
    canvas : document.createElement("canvas"),
    start : function() {
document.getElementById("gamearea").innerHTML+=" start" ;
        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);
    }
}
</script>
<script src="component.js"></script>
<script src="boing2.js"></script>
<script src="updateGameArea.js"></script>
<script>
function everyinterval(n) {
    if ((myGameArea.frameNo / n) % 1 == 0) {return true;}
    return false;
}

function accelerate(n) {
    boing.ahead = n;
 
}
</script>
<br>
<br>
<br>

<center>
<p id="the_heart"></p>

<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(-1)">up</button>


<button type="button" style=" font-size:12px; height:55px; width:120px" onclick="accelerate(0)">stop</button>


<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(1)">down</button>
</center>

<p>Use the up and down button to stay in the air</p>


<p>How long can you stay alive?</p>
<p id="gamearea"></p>
</body>
</html>

در خط زیر اسم فایل عوض شده:
JavaScript:
<img id="img2" src="images/tank2.png" alt="plane" width="10" height="10">
در خط زیر y را طوری دادم تا تانک روی زمین قرار گیرد.یعنی ۲۳۵ :
JavaScript:
   boing = new boing(2, 2, "red", 10, 235 , "hero");
در تابع اکسلریشن ، صفت ahead را مقدار دادم. قبلا elevation بود:
JavaScript:
function accelerate(n) {
    boing.ahead = n;
 
}

فایل component.js تغییری نکرده ، از پستهای قبلی ، از پست sky کپی کنید و فایل css هم تغییری نکرده ، باز از پست sky کپی کنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
هواپیما را تبدیل به تانک کردم....
بالا و پایین رفتن ، تبدیل به جلو و عقب رفتن شد....
شاید تغییرات اندکی باشد... ولی شاید به درک برنامه به کسی کمک بکند.
 

saalek110

Well-Known Member
مشکلات کچ:

مشکل کچ cache: گاهی باید برویم به سابقه یا هیستوری

و کچ فایلهای فایل منیجر را پاک کنیم تا برنامه اجرا بشه.

یک بار هم عکس تانک ناقص می اومد ، رفتم کچ سایت fast page را پاک کردم درست شد.

وقتی مشکل عکس تانک داشتم که فایلهای فرزند همگی به روش include ارتباط داده شده بودند.



من فکر می کنم فایلهای با پسوند js و css کچ میشن ، چون مرسوم است این فایلها محتوای ثابت دارند، پس دوباره بارگیری نمیشن و از کچ استفاده می شوند...و برای من برنامه نویس این کچ ایجاد مشکل می کنه.



شاید یک راه حل این باشه که آفلاین کار کنی...البته شاید اونجا هم کچ مزاحم باشه.. ولی من عادت دارم در فایل منیجر هاست کار کنم....
------------------------

من یک روشی را می خوام تست کنم ببینم از کچ خلاص میشم یا نه.

فایلها را include بکنم.


فایل زیر component.php است....فقط اول و آخرش تگ php گذاشتم، همچنین اول و آخرش تگ ‌script گذاشتم تا معلوم بشه جاوا اسکریپت است.

JavaScript:
<?php
?>
<script>
function component(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.x = x;
    this.y = y;
    this.update = function() {
        ctx = myGameArea.context;
        if (this.type == "text") {
            ctx.font = this.width + " " + this.height;
            ctx.fillStyle = color;
            ctx.fillText(this.text, this.x, this.y);
        }  else {
            ctx.fillStyle = color;
            ctx.fillRect(this.x, this.y, this.width, this.height);
        }
    }
 
 
}
</script>
<?php
?>

در فایل اصلی هم این جوری نوشتم:
PHP:
<?php
include"component.php";
...
...
؟>
 
آخرین ویرایش:

saalek110

Well-Known Member
پوشه boing3 , شروع نوشتن فایلها با پسوند php:


الان من در فایل اصلی این جوری نوشتم برنامه تانک را:
PHP:
....
....
        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
    }
}
</script>
<?php
include"component.php";
include"boing2.php";
include"updateGameArea.php";
?>
<script>
function everyinterval(n) {
.....
.....
و در عکس زیر می بینید به جز فایل css ، بقیه فایلها پسوند php دارند. پوشه images را هم کنار فایلها می بینید.

Screenshot_۲۰۲۴-۰۲-۱۸_۰۶۴۰۵۱.jpg

و برنامه ام داره کار می کنه.


در لینک بالا پوشه boing3 را می بینید... پس پوشه boing3 حاوی فایلهای با پسوند php است. البته پسوند php هیچ تاثیری روی کار کدها ندارد ، فقط چون فکر می کردم فایلهای با پسوند js کچ می شوند ،این کارو کردم.

Restore point من:
حالا از پوشه boing3 کپی می گیریم و به نام biong4 تغییر نام می دهم. هر وقت کار گیج کننده شد... پوشه boing3 برام حکم یک نقطه ذخیره داره، یعنی یک کپی از پوشه boing3 می گیریم و دوباره از اونجا شروع می کنم.

اینها نکات رفاهی است که ربطی به کانواس و جاوا اسکریپت نداره ، من سعی می کنم نکات رفاهی کار را هم بگم تا شما راحت تر باشید.


پوشه junk , آخرین نقطه پیش روی دفعه قبل من:
دفعه پیش خیلی من رفته بودم جلو ، و مجبور شدم باز برگردم به نقطه restore point ولی پوشه اون کارها را دیلت نکردم و تغییر نام دادم به junk ، حالا که دوباره به یک کپی نو برگشتم ، میرم پوشه junk و ذره ذره کدهای پوشه junk را به پوشه جدید اضافه می کنم تا دوباره به همون نقطه برسم. گاهی وقتی نمیشه پروژه را رفع ایراد کرد باید رهایش کرد و از اول شروع کرد. من هنوز مهارت کافی از طرز کار کانواس و جاوا اسکریپت ندارم، در کدنویسی php مهارتم زیاد شده بود و سریع رفع ایراد می کردم ولی در کانواس و جا ا اسکریپت هنوز محیط کار کامل دستم نیومده و گاهی باید کلا پروژه را رها کنم و از صفر شروع کنم. بهتره وقتی یک مروژه کلافه کننده شده رهایش کنید و از اول کد بنویسید.

این اتفاقات برای هر کس می افتد، با بحث روی اون دفعه بعدی بهتر با موقعیت برخورد می کنیم. این مشکلات ، برای کسی که ذوق کار داشته باشه ، حل میشه. گر به شوق کعبه خواهی زد قدم..... سرزنش ها گر کند خار مغیلان غم مخور
فکر کنم خار که میره توی پای مسافر ، منظورشه... سوزش خار کم است ولی بعضی عوامل ، مثل افراد بدخواه اطراف شما اون را بزرگ جلوه می دهند. هر وقت دیدی برای یک مشکل کوچک ، گرد و خاک زیاد ایجاد شده ، مشکوک به حضور یک دشمن باش.
 
آخرین ویرایش:

saalek110

Well-Known Member
حالا من در پوشه boing4 کار را ادامه می دهم.
هر وقت برنامه را تغییر می دهید ، و برنامه از کار می افته ، فایلهای fast page را از هیستوری اول پاک کنید. در هستوری بروسر میگم. مثل کروم.

تغییر اول: من نام کلاس boing را به کلاس hero تغییر دادم، تا به همه پروژه ها اسمش بخوره . متغیرش را هم اسمش را گذاشتن hero. حالا در قستی از کدها چنین داریم:
JavaScript:
var hero;
var myObstacles = [];
var myScore;
let heart=1000;


function startGame() {

    hero = new hero(2, 2, "red", 10, 235 , "hero");
       hero.elevation = ;
...
...
..
این کد اول های فایل اصلی است. می بینید که متغیر قهرمان اسمش hero شده الان و کلاس قهرمان هم اسمش hero است.
این هم اول فایل hero.php است: (یعنی پس همچنین فایل boing را به hero تغییر نام دادم.)
JavaScript:
<?php
?>
<script>

function hero(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width
...
.....
 
آخرین ویرایش:

saalek110

Well-Known Member
ادامه ایجاد تغییرات در پوشه boing4;

JavaScript:
myScore.text="SCORE: " + myGameArea.frameNo;
    myScore.update();
 

        ctx = myGameArea.context;
        text="SCORE: " + myGameArea.frameNo;
           ctx.font = "20px" + " "+"Consolas" ;
            ctx.fillStyle = "black";
           ctx.fillText(text, 240, 30);
در کد بالا ، اون دو خط اولش ، قبلا جزو پروژه بود، و کارش اینه که از کلاس component برای چاپ امتیاز استفاده می کنه...
چند خط بعدی را من نوشتم... درمتغیر ctx کانتکست mygamearea را ریخته.... این برای کار با منطقه کانواس حکم گذرنانه را داره در این پروژه.. بعدش در خطوط بعدی text و font و رنگ تنظیم شده و در خط دارای fillText یعنی خط آخری ، چاپ امتیاز در منطقه کانواس انجام شده. الان در عکس زیر ببینید ، من دو تا امتیاز دارم در منطقه کانواس:

Screenshot_۲۰۲۴-۰۲-۱۸_۰۷۲۶۱۲.jpg

که یکی از این دو امتیاز را همون دو خط اول کد بالا نوشته و دومی را ۵ خط کدی که بالا توضیح دادم نوشته. حالا این دو خط را:
JavaScript:
myScore.text="SCORE: " + myGameArea.frameNo;

    myScore.update();
من می خوام از پروژه حذف کنم. چون نمی خوام کلاس component کار چاپ امتیاز را انجام بده. خودم با همین ۵ خط کد در انتهای فایل updategamearea.php امتیاز را فعلا در منطقه کانواس نوشتم. راستی اون filltext دو تا عدد هم توی پرانتز داره ، اونها x و y منطقه نوشتن متن است. می توانید هر جای کانواس بخواهید بنویسید.
بعدا ممکنه تابعی برای نوشتن در کانواس بسازم تا از هر جای پروژه بتوانیم چیزهایی داخل کانواس بنویسیم. فعلا همین ۵ خط کار چاپ نوشته در کانواس را انجام می دهد. برای جای دیگه هم فعلا می تونید این ۵ خط را کپی کنید ببرید.

حالا چرا این قدر دارم کلاس کامپوننت را خلوت می کنم؟
برای اینکه بعدا می خوام قابلیت های دیگری به دیوارهای بازی اضافه کنم. مثلا برای دیوارها جون تعیین کنم و تانک دیوارها را هدف قرار دهد و نابود کند.. یا کارها دیگر. و دلیل جدا کردن کلاس قهرمان از کلاس component هم این بود که قابلیت های دیگری به قهرمان بدهم. قبلا چون ۳ کار را همزمان کلاس کامپوننت انجام می داد... یعنی کارها hero و کارهای دیوارها و چاپ امتیاز ، برای خودم ایجاد گیجی می کرد، پس دارم اول خلوت سازی می کنم تا بعدا تجهیزات دیگر اضافه کنم.

حالا کلاس کامپوننت به این خلوتی شد:
JavaScript:
<?php
?>
<script>
function component(width, height, color, x, y) {
    this.width = width;
    this.height = height;
    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);
    }
}
</script>
<?php
?>
یعنی فقط یک تابع update داره ، شامل ۳ خط کد.
خط اولی مجوز کار در کانواس را دریافت می کند..خط دوم رنگ را تعیین می کند و خط سوم هم رسم دیوار است.

hero4 به جای boing4:
پس پوشه boing4 یکی از خلوت ترین کلاسهای component را داره. که الان اسم پوشه را به hero4 تغییر دادم. چون می خوام کلمه boing کلا حذف بشه و اسامی برای هر پروژه ای مناسب باشه. ممکن است با همین اسکلت کلی پروژه در این تاپیک بسازیم.
 
آخرین ویرایش:

saalek110

Well-Known Member
محتوای همه فایلهای پوشه hero4:
یک اسکلت برای شروع ساخت یک بازی.

چند فایل زیر را می توانید به عنوان اسکلت بازی خود استفاده کنید. در لینک زیر می بینید کار می کنه بازی:



عکس نمای بازی:

Screenshot_۲۰۲۴-۰۲-۱۸_۰۸۲۳۵۹.jpg


tank2.png
عکس بالا باید در پوشه images باشه. یا خودتون یک عکس با نام tank2.png داخل پوشه image قرار دهید. اگر می خواهید عکس با پسوند دیگری استفاده کنید بروید فایل اصلی و اونجایی که اسم فایل نوشته شده .....خط ۱۴ فایل اصلی است...
HTML:
<img id="img2" src="images/tank2.png" alt="plane" width="40" height="40">
اسم فایل و پسوندش را عوض کنید

توجه کنید در این پروژه ، اسم کلاس قهرمان hero است و متغیر قهرمان هم اسمش hero است.
فایل اولی ، نام دلخواه ولی با پسوند php باید باشه، چون include از دستورات زبان php است:
JavaScript:
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="my_css.css">
<style>
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
</style>
</head>
<body onload="startGame()">
<img id="img2" src="images/tank2.png" alt="plane" width="40" height="40">

 <script type='text/javascript'>
var hero;
var myObstacles = [];
var myScore;
let heart=1000;

function startGame() {
    hero = new hero(2, 2, "red", 10, 235 , "hero");
       //hero.elevation = ;
       //boing.gravity = 0.05;
myScore = new component("20px", "Consolas", "black", 280, 40, "text");
   document.getElementById("gamearea").innerHTML+="Ready" ;
myGameArea.start();
}
var myGameArea = {
    canvas : document.createElement("canvas"),
    start : function() {
document.getElementById("gamearea").innerHTML+=" start" ;
        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);
    }
}
</script>
<?php
include"component.php";
include"hero.php";
include"updateGameArea.php";
?>
<script>
function everyinterval(n) {
    if ((myGameArea.frameNo / n) % 1 == 0) {return true;}
    return false;
}
function accelerate(n) {
    hero.ahead = n;
 
}
</script>
<br><br><br>
<center>
<p id="the_heart"></p>

<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(-1)">up</button>
<button type="button" style=" font-size:12px; height:55px; width:120px" onclick="accelerate(0)">stop</button>
<button type="button" style=" font-size:35px; height:100px; width:220px" onclick="accelerate(1)">down</button>
</center>
<p>Use the up and down button to stay in the air</p>
<p>How long can you stay alive?</p>
<p id="gamearea"></p>
</body>
</html>

فایل component.php:

JavaScript:
<?php
?>
<script>
function component(width, height, color, x, y) {
    this.width = width;
    this.height = height;
    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);
    }
}
</script>
<?php
?>

فایل hero.php:

JavaScript:
<?php
?>
<script>

function hero(width, height, color, x, y, type) {
    this.type = type;
    this.score = 0;
    this.width = width;
    this.height = height;
    this.speedX = 0;
    this.speedY = 0;
    this.x = x;
    this.y = y;
    this.gravity = 0;
    this.gravitySpeed = 0;
    this.ahead = 0;
    this.update = function() {
        ctx = myGameArea.context;

              var img = document.getElementById("plane");
                ctx.drawImage(   document.getElementById("img2") ,this.x,this.y,50,50);
 
 
    }
    this.newPos = function() {
       // this.gravitySpeed += this.gravity;
       // this.x += this.speedX;
      //  this.y += this.speedY + this.gravitySpeed;
       this.x += this.ahead;
        this.hitBottom();
    }
    this.hitBottom = function() {
        var rockbottom = myGameArea.canvas.height - this.height-35;
        if (this.y > rockbottom) {
          //  this.y = rockbottom;
        //    this.elevation=0;
           // this.gravitySpeed = 0;
        }
    }
    this.crashWith = function(otherobj) {
        var myleft = this.x;
        var myright = this.x + (this.width);
        var mytop = this.y+35;
        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;
    }
}

</script>
<?php
?>
فایل my_css.css:
CSS:
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
  #the_heart {
    border:3px solid #fff733;
    border-radius:25px;
font-size:20px;
    margin-right:150px;
    margin-left:150px;
    padding-top:3px;
    padding-bottom:3px;

    padding-left:30px;

    background-color:rgba(250,130,30,1);
       }


فایل updateGameArea.php.... توجه کنید دو تا حرف بزرگ وسط اسمش است حرف G و حرف A
فکر کنم در اسم فایلها حروف بزرگ و کوچک مهم است ، پس رعایت کنید:

JavaScript:
<?php
?>
<script>

function updateGameArea() {
    var x, height, gap, minHeight, maxHeight, minGap, maxGap;
    for (i = 0; i < myObstacles.length; i += 1) {
   
        if (hero.crashWith(myObstacles[i])) {
heart--;
if (heart<0)
            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 = 100
        maxGap = 150;
        gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap)+50;
        if (height>120)
        {
        myObstacles.push(new component(40, height, "red", x, 0));
         myObstacles.push(new component(40, x - height - gap, "red", x, height + gap));

        }//height>120
                if (height<=120)
         {
        myObstacles.push(new component(40, height, "green", x, 0));
        myObstacles.push(new component(40, x - height - gap, "green", x, height + gap));
          }// height<=120
    }
    for (i = 0; i < myObstacles.length; i += 1) {
        myObstacles[i].x += -1;
        myObstacles[i].update();
    }
  //  myScore.text="SCORE: " + myGameArea.frameNo;
  //  myScore.update();
 
        ctx = myGameArea.context;
        text="SCORE: " + myGameArea.frameNo;
           ctx.font = "20px" + " "+"Consolas" ;
            ctx.fillStyle = "black";
           ctx.fillText(text, 240, 30);

document.getElementById("the_heart").innerHTML="heart= " + JSON.stringify(heart);
    hero.newPos();
    hero.update();
}

</script>
<?php
?>
گاهی نمی دونم چرا کدهای یک فایل دوبله یا حتی سه باره میشه.. الان که پست زدم دیدم کدهای فایل updategamearea دوبله بود که اصلاح کردم. رفتم در فایل منجیر هاست دیدم سه بار کدها در این فایل تکرار شده..حواستون به این خطا باشه.
 
آخرین ویرایش:

saalek110

Well-Known Member
در پست قبلی ، کل فایلهای پروژه را گذاشتم. شامل عکس داخل پوشه images
و فایل css.

من باز هم کدها را تغییر می دهم و در پستهای بعدی هم ممکن است پروژه کامل بزارم.
با پست قبل می تونید پروژه کامل را بسازید ، بازی کنید و یا تغییر بدهید و بازی خودتون را بسازید.
یعنی به عنوان یک اسکلت برای ساخت بازی استفاده کنید.

مزایای پروژه پست قبل یعنی پروژه hero4:
قهرمان یک مربع دیگه نیست و یک عکس است. شما هر عکس دلخواه می توانید جایگزین کنید و روح جدیدی به برنامه بدهید. البته باید در توابع نشستن روی زمین و برخورد با دیوارها کار بشه. این توابع موجود برای حالت مربع بود.
فایلها پسوند php دارند و شاید مشکل کچ نداشته باشند مثل فایلهای js که احتمالا js ها کچ میشد.
کلاسهای hero و کامپوننت از هم جداست و خوانایی برنامه بالاتر رفته. و چاپ امتیاز هم از کلاس کامپوننت خارج شد تا خوانایی کلاس کامپوننت باز هم بیشتر شود.
چون مقدارکدهای هر فایل کم است، موقع کپی کردن کدها از پست قبل شما راحت هستید.


همین جا از طراح این برنامه هر کس هست تشکر می کنم. Thank you friend
یک بار یک چینی چون به سایتش لینک داده بودم اومد در فروم عضو شد و پست زد... یعنی ممکن است صاحب اون صفحه ، مطالب مربوط به مطلبش را رصد کند.

بعدا امیدوارم تابعی برای چاپ روی صفحه بنویسم یا خودتون بنویسید که نخواهیم برای هر چاپی اون ۵ خط را کپی کنیم.
فکر کنم میشه اندازه کانواس را تغییر داد. در خط:

HTML:
        this.canvas.width = 480;
        this.canvas.height = 270;
می توانید سایز دلخواه بدهید.
 
آخرین ویرایش:

saalek110

Well-Known Member

لینک بالا ، را دارم رویش کار می کنم...ممکن است وقتی واردش بشید در حالت خطای برنامه باشه...پس فعلا توصیه به ورود نمی کنم.
همان طور که می بینید اسم پوشه hero5 است و اسم فایل اصلی هم hero_1 است.
الان برای دیوارها جون تعیین کردم. اگر موفق بشم دیوارهای قابل تخریب می خوام بسازم.. توکل بر خدا...

فایل کلاس دیوار:
JavaScript:
<?php
?>
<script>
function component(width, height, color, x, y , health) {
    this.health = health;
    this.width = width;
    this.height = height;
    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);
    }
}
</script>
<?php
?>
می بینید که یک صفت health اصافه کردم.
و در فایل updategamearea جایی که دیوارها متولد می شوند داریم:
JavaScript:
        if (height>120)
        {
        myObstacles.push(new component(40, height, "red", x, 0,100));
         myObstacles.push(new component(40, x - height - gap, "red", x, height + gap,100));

        }//height>120
                if (height<=120)
         {
        myObstacles.push(new component(40, height, "green", x, 0,100));
        myObstacles.push(new component(40, x - height - gap, "green", x, height + gap,100));
          }// height<=120
اون اعداد ۱۰۰ که من اضافه کردم ، جون دیوار است.
 
آخرین ویرایش:

saalek110

Well-Known Member
تانک منهدم کننده دیوارها:

images.jpeg

در بازی زیر ، وقتی تانک به دیواری می خورد ، رنگ دیوار قهوه ای می شود:


JavaScript:
<?php
?>
<script>
function component(width, height, color, x, y , health) {
    this.health = health;
    this.color=color;
    this.width = width;
    this.height = height;
    this.x = x;
    this.y = y;
    this.update = function() {
     ctx = myGameArea.context;
     if   ( this.health==100)   ctx.fillStyle= this.color;
     if   ( this.health==50)  ctx.fillStyle = "#ffaa66";

     ctx.fillRect(this.x, this.y, this.width, this.height);
    }
}
</script>
<?php
?>
کد بالا کلاس کامپوننت است.
می بینید که با توجه به صفت health رنگ دیوارها تعیین می شود. یعنی دیوار کم جون رنگ قهوه ای می خورد.

در اول فایل updategamearea داریم:
JavaScript:
function updateGameArea() {
    var x, height, gap, minHeight, maxHeight, minGap, maxGap;
    for (i = 0; i < myObstacles.length; i += 1) {
 
        if (hero.crashWith(myObstacles[i])) {
//heart--;
myObstacles[i].health=50;
if (heart<0)
            return;
        }
یعنی وقتی تانک به دیوار می خوره ، جون دیوار ۵۰ میشه.قبلا جون کلی بازی کم میشد...حالا جون دیوار کم میشه.

شما می توانید این تغییرات را با من انجام بدهید یا صبر کنید در یک پست ، کل فایلهای پروژه را بزارم.

گام بعدی ، به جای تغییر رنگ دیوار ، انهدام دیوار است.
مثلا اطراف تانک ، قطعاتی دیده بشه یا شعله و از این جور چیزها.....
من در این پست گفتم چطور برای یک دیوار جون تعیین بشه و چطور کلاس کامپوننت را تغییر بدهیم و صفات جدیدی به اشیا بدهیم. حالا راه باز است تا شما از کلاس کامپوننت هر استفاده دیگری بکنید. و گفتم چطور در موقع برخورد میشه صفات دیوارها را تغییر داد.ممکن است فقط صفات دیوارها تغییر نکند و جون کاربر هم کمی کم شود. مثلا باید با شلیک دیوار را نابود کند نه با برخورد با بدنه تانک. داستان را باید خودتان با سلیقه خودتان بسازید. ولی برنامه قبلی من این بود دیوارهای بالایی را با شلیک نابود کند و دیوارهای پایینی را با بدنه.
 
آخرین ویرایش:

saalek110

Well-Known Member

یک نکته را توجه کنید ، ما داریم با زبان جاوا اسکریپت کار می کنیم و در این زبان داریم ماهر می شویم....
بعدا می توانیم با چیز دیگه بازی بسازیم نه کانواس...
یا با جاوا اسکریپت کار دیگه بکنیم نه بازی سازی....

و دوما ، جاوا اسکریپت شباهت های زیادی به زبان سی و php و سی شارپ دارد...پس در دیگر زبانها هم جای پا خواهید داشت..

اینها را گفتم تا بدانید کارتان با ارزش است.
 

saalek110

Well-Known Member
شاید بعدا یک آموزش کلاس در جاوا اسکریپت زدم...خودتان یک سرچی بکنید ، سایت فارسی نبود ، سایت انگلیسی...
فعلا تئوری چیزهایی بگم.
ببینید دیوارهایی که بوجود می آیند در کلاس ثبت نام می شوند ،و موقع خلق شون هر چی اطلاعات به کلاس می فرستند ذخیره میشه. مثلا اگر هزار تا دیوار شما بسازید ، ما هزار تا مشخصات دیوار داریم... شامل طول و عرض و محل x و y و رنگ و من هم که سلامت دیوار را اضافه کردم. تمامی صفات این هزار تا دیوار دخیره شده هست..
درون برنامه بازی ما اونجا که می خواد برخورد دیوارها را با قهرمان بررسی کند ، یک loop یعنی حلقه ساخته و تعداد تکرار حقله برابر طول آرایه است. اول برنامه ما یک آرایه تعریف کردیم.اون حلقه طول آرایه را بدست می آورد و هر چند تا دیوار که باشه را بررسی می کنه به قهرمان خورده اند یا نه.

اگر می خواستیم به جای کلاس یک چیز دیگه استفاده کنیم ، میشد یک آرایه دو بعدی استفاده کنیم...الان اون آرایه ای که در بازی هست تک بعدی است ، یعنی فقط شماره اشیا داخلشه ، ولی آرایه دو بعدی مثلا مثل هزار تا فرم ثبت نام چاپ شده داشته باشی از هزار نفر مشخصات بگیری ، شامل نام و سن و وزن و ....یعنی آرایه دو بعدی از هر چیزی ،چند تا مشخصات داره. کلاس هم از هر شی ، چندین مشخصات داره..دیوارها طول و عرض و محل x و y و سلامت دارند. شبیه یک آرایه دو بعدی یا اون فرم های ثبت نام .... این از لحاظ متغیرهایی که یک کلاس اولش نوشته...بعدش کلاس یک سری تابع هم داره که میشه صدا زد... داخل تابع یک سری کد نوشته ، اون this که می گیم یعنی شی مورد بحث ، مثلا من نوشتم this.health یعنی سلامت دیوار.... و نوشتم اگر سلامت دیوار ۵۰ بود ، به رنگ قهوه ای نمایشش بده و اگر سلامت دیوار مساوی ۱۰۰ بود با همون this.color نمایش بده ، یعنی همان رنگ موقع خلقش....
 

جدیدترین ارسال ها

بالا