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

saalek110

Well-Known Member
صفحه ۹:



آموزش ساخت جنگ گوریل ها بر ساختمان ها.





آموزش ساخت بازی مار به زبان فارسی.
 
آخرین ویرایش:

saalek110

Well-Known Member
JavaScript:
 window.innerWidth;
 window.innerHeight;

گویا برای بدست آوردن صفحه است تا اندازه پنجره کانواس را تعیین کنیم.

از:

JavaScript:
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;


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

saalek110

Well-Known Member
JavaScript:
Math.floor()

مثال:
JavaScript:
console.log(Math.floor(5.95));
// Expected output: 5

console.log(Math.floor(5.05));
// Expected output: 5

console.log(Math.floor(5));
// Expected output: 5

console.log(Math.floor(-5.05));
// Expected output: -6
اعشار را حذف می کند.
در اعداد منفی به پایین گرد می شود. مثالهای بالا را ببینید.
 
آخرین ویرایش:

saalek110

Well-Known Member
میشه چند تا کانواس در یک صفحه داشت:

در قسمت html:
HTML:
<canvas id="myCanvas" width="400" height="250" style="border:1px solid grey"></canvas>
<canvas id="myCanvas2" width="400" height="100" style="border:1px solid grey"></canvas>

و در قسمت اسکریپت:
JavaScript:
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
     canvas.width = window.innerWidth;
     canvas.height = 370;
const canvas2 = document.getElementById("myCanvas2");
const ctx2 = canvas2.getContext("2d");
    canvas2.width = window.innerWidth;
    canvas2.height = 100;
 

saalek110

Well-Known Member
من فکر می کنم که بهتره وقتی می خواهیم سمت راست کانواس چیزی قرار دهیم این طوری بنویسیم:

JavaScript:
       x = canvas.width;
           ctx.fillText(text, x-160, 77);
یعنی حداکثر x را اول بدست بیاوریم ، بعد ازش مقداری کم کنیم.
شاید این جوری در گوشی های مختلف احتمال بیرون افتادن از قسمت کانواس کمتر باشه
ثانیا ، پیدا کردن نقطه مورد نظر این طوری راحت تر است.
 

saalek110

Well-Known Member


Screenshot_۲۰۲۴-۰۲-۲۳_۰۸۲۲۳۴.jpg

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

فایل اصلی برنامه من این است:
JavaScript:
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>

<style>
<?php
include"my_css.php";
?>
body {background-color: #887722;}
</style>
</head>

<body onload="startGame()">


<canvas id="myCanvas" width="400" height="250" style="border:1px solid grey"></canvas>
<canvas id="myCanvas2" width="400" height="100" style="border:1px solid grey"></canvas>

<img id="img" src="../images/plane.png" alt="plane" width="30" height="10">
 <img id="img2" src="../images/building2.png" alt="plane" width="30" height="9">
 <img id="img3" src="../images/building3.png" alt="plane" width="30" height="9">
 <img id="img4" src="../images/building4.png" alt="plane" width="30" height="9">
<p id="gamearea2"></p>
 <script type='text/javascript'>
....
.....
.....

const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
     canvas.width = window.innerWidth;
     canvas.height = 370;
const canvas2 = document.getElementById("myCanvas2");
const ctx2 = canvas2.getContext("2d");
    canvas2.width = window.innerWidth;
    canvas2.height = 100;

   
var FPS = 50;
setInterval(function(){
   updateGameArea();
}, 1000/FPS);
setInterval(function(){
   updateGameArea2();
}, 1000/FPS);

function startGame() {
 
     hero = new hero(73, 25 ,"red", 10,120);
    hero2 = new hero2(36, 12 ,"red", 10,25);
 
}


</script>
<?php
include"component.php";
include"hero.php";
include"hero2.php";
include"updateGameArea.php";
include"updateGameArea2.php";
?>
<script>
function everyinterval(n) {
    if ((frameNo / n) % 1 == 0) {return true;}
    return false;
}
function accelerate(n) {
    hero.gravity = n;
 if(n==0)
 {
    hero.gravity = 0;
   hero.gravitySpeed = 0;

 }//n==0
}
</script>
<center>
<p id="the_heart"></p>
<p id="the_heart2"></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)">stop</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>
<p id="gamearea"></p>

</body>                                        
</html>

در قسمت html با کد زیر ، دو کانواس تعریف کردم:
HTML:
<canvas id="myCanvas" width="400" height="250" style="border:1px solid grey"></canvas>
<canvas id="myCanvas2" width="400" height="100" style="border:1px solid grey"></canvas>

و در قسمت جاوا اسکریپت از اون دو کانواس استفاده شده. کد زیر:

JavaScript:
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
     canvas.width = window.innerWidth;
     canvas.height = 370;
const canvas2 = document.getElementById("myCanvas2");
const ctx2 = canvas2.getContext("2d");
    canvas2.width = window.innerWidth;
    canvas2.height = 100;

در کد بالا می بینید که کل عرض صفحه را استفاده کردم ولی طول را خودم دادم.
ولی فکر کنم بهتر است اول طول صفحه را حساب کنم و بعد درصدی از اون را برای کانواس استفاده کنم. این جوری فکر کنم در دستگاههای کوچک مشکل کمتر ایجاد بشه.

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

در کد زیر:
JavaScript:
var FPS = 50;
setInterval(function(){
   updateGameArea();
}, 1000/FPS);
setInterval(function(){
   updateGameArea2();
}, 1000/FPS);

دو تابع updateGameArea1 و updateGameArea2 را به شکل دوره ای فعال کردم.

در تابع استارت:
JavaScript:
function startGame() {
   
     hero = new hero(73, 25 ,"red", 10,120);
    hero2 = new hero2(36, 12 ,"red", 10,25);
 
}

که تابع استارت توسط رویداد onload از body فعال میشه ، قهرمان را ساختم.
قبلادر تابع استارت ، mygamearea صدا زده میشد...ولی من mygamearea را حذف کردم و کانواس که در mygamearea ساخته میشد را همان طور که در بالا می بینید ساختم. یعنی قالب را به هم زدم.
فعلا در تابع استارت فقط دو قهرمان خلق میشه.
اینکه همه چیز دوبل است ، مثل دو قهرمان و دو تابع updateGameArea به این خاطر است که من دو تا کانواس دارم و ترجیح دادم کارهاشون جدا انجام شود.
 
آخرین ویرایش:

saalek110

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

saalek110

Well-Known Member
پرچم بکارید

من برنامه ام دچار اشکال شد...
در تابع update حدود ۱۰ تا پرچم کاشتم.
به شکل زیر:


JavaScript:
document.getElementById("error").innerHTML+="1";

اون بعلاوه مساوی است نه مساوی خالی.

این کد هم هدف پرچم است. در قسمت html باید باشه.


HTML:
<p id="error"></p>

کلمه error دلخواه است و این کلمه کاری انجام نمی دهد.
سه تا پرچم هم در تابع start کاشتم. متن اون start باشه ودومی اش s2 و s3
پرچم های من شماره ۱ تا ۷ داشت ، دیدم شماره ۵ کار نمی کنه ،فهمیدم کد قبلی اش مشکل داره... کد قبلی اش فراخوانی یک تابع از کلاس hero بود... بعدا فهمیدم کلاس مشکل داره ، در یکی از توابعش یک غلط داشت...عدد بعد مساوی پاک شده بود. شاید دستم خورده بود..نمی دونم.

در بالا روشی برای خطایابی گفتم.

یک راه هم اینه قطعات مختلف برنامه را بزاری بیرون یا به شکل کامنت دربیاری ببینی چی میشه.

در شکل زیر اون اعدادی که چاپ شده هست:

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


با یک نگاه میشه فهمید اجرای برنامه کجا گیر کرده. اون نوشته بالاییربطی به قضیه نداره ، که نوشته How long can you...

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

saalek110

Well-Known Member

در این ورژن ، فرودگاه ساخته شده ، و می توانید فرود بیایید و بلند شوید.

Screenshot_۲۰۲۴-۰۲-۲۳_۲۰۴۸۴۰.jpg

راهنمای بازی: یک قسمت سفید روی قسمت بنفش است ، روی اون قسمت فرود بیایید. فرود خودکار انجام میشه ، بعد تکمیل فرود ، با دکمه take off می توانید بلند شوید.
 
آخرین ویرایش:

saalek110

Well-Known Member
فاز ساخت ، فاز عرضه:

تا می توانید چاپ کنید.

این طوری با نگاه به چیزهای چاپ شده می فهمید برنامه چطوری کار می کنه.

فاز ساخت ، با فاز عرضه بازی فرق داره ، این دو را با هم اشتباه نگیرید.

در همون خود کانواس تمام متغیرهای بازی را چاپ کنید تا جلوی چشمتون باشه.
 

saalek110

Well-Known Member


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


در اجرای برنامه یک آدمک می بینید که حین حرکت به سمت راست ، دست و پایش هم تکان می خورد..
برنامه جالبی است... می تواند یک سبک باشد برای ساخت قهرمان بازی.... من خودم داشتم به یک تانک فکر می کردم که اجزایش مثل آدمک بالا متحرک باشد....

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

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

این سبک ایجاد قهرمان جای بحث بسیار دارد.
 
آخرین ویرایش:

saalek110

Well-Known Member

این هم بازی خودم است که خورشید و آسمان اضافه کردم.

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

ده روز از افتتاح این تاپیک می گذرد ، به زودی به صفحه ۱۰ تاپیک می رسیم. حدود هزار بازدید ، تاپیک داشته تابحال.
 
آخرین ویرایش:

saalek110

Well-Known Member

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

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

saalek110

Well-Known Member
تغییرات در ورژن های مختلف:







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

البته جنس تجربیات فرق داره. کارهای بد ، بد است و مضر ، مثل دروغ گفتن. باید کلا کنار گذاشته شود چون مخرب است.

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


کلا تاپیک ۱۱ روزه باز شده. ۱۶ فوریه باز شده.
 
آخرین ویرایش:

saalek110

Well-Known Member
بازی بدون سوختن چطوری میشه؟


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

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

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


شما هم به این قضیه فکر کنید...بازی بدون استرس سوختن ، چه شکلی میشه.. هدف گذاری بازی چطوری میشه؟
 

saalek110

Well-Known Member

بازی تغییر نکرده ، فقط سایز دکمه ها با نگاه به اندازه window تنظیم شده تا در گوشی های کوچک مشکل ایجاد نشه.

JavaScript:
<table><tr><td>
<button type="button" id="up_down1" style=" font-size:20px;  " onclick="accelerate(-1)">up</button>
<button type="button" id="middle"  style=" font-size:12px;   " onclick="accelerate(0)">stop</button>
<button type="button" id="up_down2" style=" font-size:20px;  " onclick="accelerate(1)">down</button>
</td></tr><tr><td>
<button type="button" id="take_off" style=" font-size:12px;  " onclick="start(1)">take off</button>
<script>
   document.getElementById('up_down1').style.width =  window.innerWidth/ 3;
   document.getElementById('up_down1').style.height =  window.innerWidth/ 6;
   document.getElementById('up_down2').style.width =  window.innerWidth/ 3;
   document.getElementById('up_down2').style.height =  window.innerWidth/ 6;
   document.getElementById('middle').style.width =  window.innerWidth/ 5;
   document.getElementById('middle').style.height =  window.innerWidth/ 10;
   document.getElementById('take_off').style.width =  window.innerWidth/ 5;
   document.getElementById('take_off').style.height =  window.innerWidth/ 10;
</script>
 

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

بالا