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

saalek110

Well-Known Member
صفحه ۶ :
من فکر می کنم اگر از عکس استفاده کنیم بازی جلوه دیگری پیدا می کند.
از اشکال میشه برای ایجاد افکت ها اطراف عکس ها استفاده کرد. مثل خروج آتش از پشت هواپیما ، حتی اون را هم با عکس میشه ایجاد کرد.
حالا که از ساختار بازیها سر در آوردیم ، می توانیم به جزییات بازی ها بیشتر برسیم.
 

saalek110

Well-Known Member
در بازی snake کلمات pop و unshift داریم. اینها یعنی چه؟

کد:
JavaScript:
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon","Pineapple");
در کد بالا با کلمه unshift دو عضو به اول آرایه اضافه شده.
اینجا را ببینید:

شیفت ، عضو اول آرایه را حذف می کند:

push به انتهای آرایه یکی اضافه می کند:

pop عضو آخر را برمی دارد، یعنی حذف می کند:



در بازی snake ، کلمه unshift اول تابع update است و کلمه pop آخر تابع update.
چرا؟

بحث سر دم مار است. آرایه مربوط به دم مار یا بدنه مار است.سر مار جداست.
اول تابع update , با unshift یک عضو به اول آرایه اضافه میشه..
و آخر تابع update ، با pop عضو آخر برداشته میشه.

احتمالا این طوری از انتهای دم کوتاه میشه ، چون مار داره میره جلو ، و اون تکه که از انتها حذف شده ، میاید سر مار...

خط اول تابع update اینه:

JavaScript:
    Snake.body.unshift([Snake.head_x, Snake.head_y]);
گویا معنی اش اینه که اولین تکه بدنه مار ، جانشین سر مار میشه ، با اون pop که در انتهای تابع update است ، یک تکه انتهای مار حذف میشه ، و این طوری مار به جلو حرکت می کند. یعنی هر بار سر مار که رفته جلو و جایش خالی شده ، با استفاده از unshift ، یک عضو به بدنه اضافه میشه تا جای سر مار را پر کنه. و از دم مار هم در انتهای تابع update یک تکه از مار کم میشه.

البته pop انتهای تابع update مشروط به این است که به غذا برخورد نکرده باشد. اگر به غذا برخورد کرده باشه ، pop نمیشه... چون جایزه برخورد به غذا در این بازی رشد مار است.
 
آخرین ویرایش:

saalek110

Well-Known Member


مار با دو غذا
همین الان ساختم:
JavaScript:
<?php
?>
<script>
var canvas = undefined;
var canvasContext = undefined;

const size = 40;
const rows = 20;
const cols = 20;

const col1 = "#79e332";      // body
const col2 = "#0e3fed";      // head
const col3 = "#ed460e";      // food1
const col4 = "#ed4fff";      // food2


var Snake = {
    head_x : undefined,
    head_y : undefined,
    body : undefined,
    direction : 1,
    food1_x : undefined,
    food1_y : undefined,
    food2_x : undefined,
    food2_y : undefined

}

var direction_mapper = {
    1 : [0, -1],        // up
    2 : [1, 0],         // right
    3 : [0, 1],         // down
    4 : [-1, 0]         // left
}

const generateFood1 = () => {
    Snake.food1_x = Math.floor(Math.random()*rows);
    Snake.food1_y = Math.floor(Math.random()*cols);

}
const generateFood2 = () => {
    Snake.food2_x = Math.floor(Math.random()*rows);
    Snake.food2_y = Math.floor(Math.random()*cols);

}
const start = () => {
    canvas = document.getElementById("myCanvas");
    canvasContext = canvas.getContext("2d");
    init();
    mainLoop();
}

const init = () => {
    generateFood1();
    generateFood2();

    canvasContext
        .clearRect(
            0,
            0,
            canvas.width,
            canvas.height
        );

    canvasContext.fillStyle = "#ff3300";
    canvasContext
        .fillRect(
            0,
            0,
            canvas.width,
            canvas.height
        );
    
    Snake.head_x = 20;
    Snake.head_y = 20;
    Snake.body = [];
    
    drawPixel(col2, Snake.head_x,Snake.head_y);
    drawPixel(col3, Snake.food1_x,Snake.food1_y);
    drawPixel(col3, Snake.food2_x,Snake.food2_y);

    setTimeout(()=> console.log("Started"), 1000);
}

const update = () => {

    Snake.body.unshift([Snake.head_x, Snake.head_y]);

    Snake.head_x = Snake.head_x+direction_mapper[Snake.direction][0];
    Snake.head_y = Snake.head_y+direction_mapper[Snake.direction][1];

    if(Snake.head_x>=rows)
        Snake.head_x = 0;
    if(Snake.head_y>=cols)
        Snake.head_y = 0;
    if(Snake.head_x<0)
        Snake.head_x = rows-1;
    if(Snake.head_y<0)
        Snake.head_y = cols-1;

    Snake.body.forEach(bod => {
        if(Snake.head_x==bod[0] && Snake.head_y==bod[1])
        {
            console.log("Lost!");
          //  init();
        }
    });

    if(Snake.head_x==Snake.food1_x && Snake.head_y==Snake.food1_y)
    {
        generateFood1();
    }
    else if(Snake.head_x==Snake.food2_x && Snake.head_y==Snake.food2_y)
{
            generateFood2();

}
else         Snake.body.pop();


}//update

const draw = () => {
    canvasContext.fillStyle = "#998855";
    canvasContext
        .fillRect(
            0,
            0,
            canvas.width,
            canvas.height
        );

    drawPixel(col2, Snake.head_x,Snake.head_y);

    Snake
        .body
        .forEach(bod => {
            drawPixel(col1, bod[0], bod[1]);
        });

    drawPixel(col3, Snake.food1_x,Snake.food1_y);
    drawPixel(col4, Snake.food2_x,Snake.food2_y);

}

const drawPixel = (col, x, y) => {
    canvasContext.fillStyle = col;
    canvasContext.fillRect(x*size+1,y*size+1,size-1,size-1);
}

const keyHandler = (e) => {
    // W : 119
    // S : 115
    // A : 97
    // D : 100
    switch(e.keyCode)
    {
        case 119 :
            Snake.direction = 1;
            break;
        case 115 :
            Snake.direction = 3;
            break;
        case 97 :
            Snake.direction = 4;
            break;
        case 100 :
            Snake.direction = 2;
            break;
    }
}

const mainLoop = () => {
    update();
    draw();
    window.setTimeout(mainLoop, 150);
}

document.addEventListener('DOMContentLoaded', start);
document.addEventListener("keypress", keyHandler, true);

function accelerate(n) {
     if (n==1)    Snake.direction = 1;
     if (n==2)    Snake.direction = 2;
     if (n==3)    Snake.direction = 3;
     if (n==4)    Snake.direction = 4;
 }
 </script>
<?php
?>
شما از روی این می توانید مار با ۳ غذا و بیشتر را بسازید.
 

saalek110

Well-Known Member

کلی کد داره ، یک کلکسیون است.
شاید بگیم یک دوره آموزش است.
بهرحال باید استفاده کرد.
 

saalek110

Well-Known Member

کاری ازquachngocxuan:

۸ تا پروژه

پروژه ۱ تا ۳ ، شاید طراحی صفحه باشه فقط. نمی دونم.
پروژه ۴ ، یک جور اسپریت ساز است ، همین امروز فکر ساختنش بودم.داشتم فکر می کردم یک ابزاری بسازیم تا اسپریت بسازه داخل بازی ها استفاده کنیم. یعنی مثلا ۱۰ در ۳۰ خونه شطرنجی بده ، خونه ها را رنگی کنیم.

پروژه ۵ اش ، کارت های برعکس است که رویشان می زنی یک لحظه محتوایشان معلوم میشه. بازی حافظه.
پروژه شماره ۶ را من می خواستم درست کنم. یک چیزی مثل از خیابان رد شدن. البته ویندوزی است ، حدس می زنم این طور بازیی باشه.

Screenshot_۲۰۲۴-۰۲-۲۱_۱۵۲۲۲۶.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member

یک کلاس نوشته تا اندامهای یک آدمک را تکان دهد. کیبورد کامپیوتر می خواد.

در پستهای بعدی ، باز این سورس مطرح شده. آپلودش کردم و حرکت سمت راست را دائمی کردم تا طرز حرکت آدمک را ببینید.
 
آخرین ویرایش:

saalek110

Well-Known Member

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

بالا