導航:首頁 > 編程語言 > 最簡單的js小游戲源碼

最簡單的js小游戲源碼

發布時間:2023-05-18 07:07:10

Ⅰ 如何用javascript寫一個網頁簡單的格鬥游戲

<pre t="code" l="js"><script type="text/灶信javascript"歷肆>
function demo()
{
this.test1 = function(){
alert('test1');
};
this.test2 = function(){
alert('test2');
}
}

var aa = new demo();
aa.test1();
aa.test2();
</script>肢辯轎結果會依次彈出test1test2

Ⅱ 如何使用Createjs來編寫HTML5游戲完成一個簡單的打飛機游戲

CreateJS包含4個部分,EaselJS、TweenJS、PreloadJS、SoundJS,其中最主要的部分EaselJS包含了開發Html5游戲的所有功能,僅僅使用EaselJS幾乎可以完成所有的開發工作,其餘三項可以看作EaselJS的輔助工具。比如響應tick事件然後改變元素坐標就可以實現動畫功能,而使用TweenJS來創建補間動畫,則可以省去你很多代碼,簡化了操作。一個簡單的tick動畫看起來是這樣的:<pre t="code" l="js">var stage, circle;
function init(){
stage = new createjs.Stage(document.getElementById('game'));
createjs.Ticker.addEventListener("tick", handleTick);
createjs.Ticker.setFPS(60);
circle = new createjs.Shape();
circle.graphics.f("red").dc(0,0,50);
circle.x = 0;
circle.y = 100;
stage.addChild(circle);

circle.addEventListener("click", function(event){
createjs.Ticker.setPaused(!createjs.Ticker.getPaused());
});

}

function handleTick(event){
if(!event.paused){
circle.x +=5;
if(circle.x > 1000){
circle.x = 0;
}
}
stage.update();
}

Ⅲ 求用原生js(不使用任何第三方庫)實現24點游戲的程序

你給的太少了

Ⅳ js簡單回合制小游戲

varboss=[
{name:"校長",energy:10000},
{name:"教務主任",energy:8000},
{name:"系主任",energy:6000},
{name:"輔導員",energy:5000},
{name:"任課老師",energy:12000}
];
varhero=[
{name:"小張",energy:7000},
{name:"小王",energy:7000},
{name:"小強",energy:7000}
];
varn=prompt("選擇一個英雄(0:小張,1:小王,2:小強)","");
varh=hero[n];
varb=boss[Math.floor(Math.random()*boss.length)];
vari=1;
while(true){
varhit=Math.floor(Math.random()*800);
varbit=Math.floor(Math.random()*1000);
h.energy-=bit;
b.energy-=hit;
if(b.energy>0&&h.energy<=0){
alert("winnerisboss");
break;
}elseif(h.energy>0&&b.energy<=0){
alert("winnerishero");
break;
}elseif(h.energy<=0&&b.energy<=0){
alert("DRAWGAME");
break;
}
alert("第"+i+++"次回合,英雄:"+h.name+"的能量剩餘:"+h.energy+",怪獸"+b.name+"的能量剩餘:"+b.energy);
}

Ⅳ 課程設計:使用JavaScript製作一個網頁上的貪吃蛇游戲

<html>
<head>
<title>貪吃蛇 Snake v2.4</title>
<style>
body{
font-size:9pt;
}
table{
border-collapse: collapse;
border:solid #333 1px;
}
td{
height: 10px;
width: 10px;
font-size: 0px;
}
.filled{
background-color:blue;
}
</style>
</head>
<script>
function $(id){return document.getElementById(id);}
/**************************************************************
* javascript貪吃蛇 v2.4 <br />
* author: sunxing007 05/14/2009<br />
* 轉載請註明來自http://blog.csdn.net/sunxing007 謝謝!<br />
* v2.4修正了蛇身顏色可以隨著蛇前進而移動
**************************************************************/
//貪吃蛇類
var Snake = {
tbl: null,
/**
* body: 蛇身,數組放蛇的每一節,
* 數據結構{x:x0, y:y0, color:color0},
* x,y表示坐標,color表示顏色
**/
body: [],
//當前移動的方向,取值0,1,2,3, 分別表示向上,右,下,左, 按鍵盤方向鍵可以改變它
direction: 0,
//定時器
timer: null,
//速度
speed: 250,
//是否已經暫停
paused: true,
//行數
rowCount: 30,
//列數
colCount: 30,
//初始化
init: function(){
var colors = ['red','orange','yellow','green','blue','purple','#ccc'];
this.tbl = $("main");
var x = 0;
var y = 0;
var colorIndex = 0;
//產生初始移動方向
this.direction = Math.floor(Math.random()*4);
//構造table
for(var row=0;row<this.rowCount;row++){
var tr=this.tbl.insertRow(-1);
for(var col=0;col<this.colCount;col++) {
var td=tr.insertCell(-1);
}
}
//產生20個鬆散節點
for(var i=0; i<10; i++){
x = Math.floor(Math.random()*this.colCount);
y = Math.floor(Math.random()*this.rowCount);
colorIndex = Math.floor(Math.random()*7);
if(!this.isCellFilled(x,y)){
this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];
}
}
//產生蛇頭
while(true){
x = Math.floor(Math.random()*this.colCount);
y = Math.floor(Math.random()*this.rowCount);
if(!this.isCellFilled(x,y)){
this.tbl.rows[y].cells[x].style.backgroundColor = "black";
this.body.push({x:x,y:y,color:'black'});
break;
}
}
this.paused = true;
//添加鍵盤事件
document.onkeydown= function(e){
if (!e)e=window.event;
switch(e.keyCode | e.which | e.charCode){
case 13: {
if(Snake.paused){
Snake.move();
Snake.paused = false;
}
else{
//如果沒有暫停,則停止移動
Snake.pause();
Snake.paused = true;
}
break;
}
case 37:{//left
//阻止蛇倒退走
if(Snake.direction==1){
break;
}
Snake.direction = 3;
break;
}
case 38:{//up
//快捷鍵在這里起作用
if(event.ctrlKey){
Snake.speedUp(-20);
break;
}
if(Snake.direction==2){//阻止蛇倒退走
break;
}
Snake.direction = 0;
break;
}
case 39:{//right
if(Snake.direction==3){//阻止蛇倒退走
break;
}
Snake.direction = 1;
break;
}
case 40:{//down
if(event.ctrlKey){
Snake.speedUp(20);
break;
}
if(Snake.direction==0){//阻止蛇倒退走
break;
}
Snake.direction = 2;
break;
}
}
}
},
//移動
move: function(){
this.timer = setInterval(function(){
Snake.erase();
Snake.moveOneStep();
Snake.paint();
}, this.speed);
},
//移動一節身體
moveOneStep: function(){
if(this.checkNextStep()==-1){
clearInterval(this.timer);
alert("Game over!\nPress Restart to continue.");
return;
}
if(this.checkNextStep()==1){
var _point = this.getNextPos();
var _x = _point.x;
var _y = _point.y;
var _color = this.getColor(_x,_y);
this.body.unshift({x:_x,y:_y,color:_color});
//因為吃了一個食物,所以再產生一個食物
this.generateDood();
return;
}
//window.status = this.toString();
var point = this.getNextPos();
//保留第一節的顏色
var color = this.body[0].color;
//顏色向前移動
for(var i=0; i<this.body.length-1; i++){
this.body[i].color = this.body[i+1].color;
}
//蛇尾減一節, 蛇尾加一節,呈現蛇前進的效果
this.body.pop();
this.body.unshift({x:point.x,y:point.y,color:color});
//window.status = this.toString();
},
//探尋下一步將走到什麼地方
pause: function(){
clearInterval(Snake.timer);
this.paint();
},
getNextPos: function(){
var x = this.body[0].x;
var y = this.body[0].y;
var color = this.body[0].color;
//向上
if(this.direction==0){
y--;
}
//向右
else if(this.direction==1){
x++;
}
//向下
else if(this.direction==2){
y++;
}
//向左
else{
x--;
}
//返回一個坐標
return {x:x,y:y};
},
//檢查將要移動到的下一步是什麼
checkNextStep: function(){
var point = this.getNextPos();
var x = point.x;
var y = point.y;
if(x<0||x>=this.colCount||y<0||y>=this.rowCount){
return -1;//觸邊界,游戲結束
}
for(var i=0; i<this.body.length; i++){
if(this.body[i].x==x&&this.body[i].y==y){
return -1;//碰到自己的身體,游戲結束
}
}
if(this.isCellFilled(x,y)){
return 1;//有東西
}
return 0;//空地
},
//擦除蛇身
erase: function(){
for(var i=0; i<this.body.length; i++){
this.eraseDot(this.body[i].x, this.body[i].y);
}
},
//繪制蛇身
paint: function(){
for(var i=0; i<this.body.length; i++){
this.paintDot(this.body[i].x, this.body[i].y,this.body[i].color);
}
},
//擦除一節
eraseDot: function(x,y){
this.tbl.rows[y].cells[x].style.backgroundColor = "";
},
paintDot: function(x,y,color){
this.tbl.rows[y].cells[x].style.backgroundColor = color;
},
//得到一個坐標上的顏色
getColor: function(x,y){
return this.tbl.rows[y].cells[x].style.backgroundColor;
},
//用於調試
toString: function(){
var str = "";
for(var i=0; i<this.body.length; i++){
str += "x:" + this.body[i].x + " y:" + this.body[i].y + " color:" + this.body[i].color + " - ";
}
return str;
},
//檢查一個坐標點有沒有被填充
isCellFilled: function(x,y){
if(this.tbl.rows[y].cells[x].style.backgroundColor == ""){
return false;
}
return true;
},
//重新開始
restart: function(){
if(this.timer){
clearInterval(this.timer);
}
for(var i=0; i<this.rowCount;i++){
this.tbl.deleteRow(0);
}
this.body = [];
this.init();
this.speed = 250;
},
//加速
speedUp: function(time){
if(!this.paused){
if(this.speed+time<10||this.speed+time>2000){
return;
}
this.speed +=time;
this.pause();
this.move();
}
},
//產生食物。
generateDood: function(){
var colors = ['red','orange','yellow','green','blue','purple','#ccc'];
var x = Math.floor(Math.random()*this.colCount);
var y = Math.floor(Math.random()*this.rowCount);
var colorIndex = Math.floor(Math.random()*7);
if(!this.isCellFilled(x,y)){
this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];
}
}
};
</script>
<body onload="Snake.init();">
/*************************************************************<br />
* javascript貪吃蛇 v2.4<br />
* author: sunxing007 05/14/2009<br />
* 轉載請註明來自 <a href="http://blog.csdn.net/sunxing007">http://blog.csdn.net/sunxing007</a> 謝謝!<br />
**************************************************************/<br />
<table id="main" border="1" cellspacing="0" cellpadding="0"></table>
<input type="button" id="btn" value="開始/暫停" />點左邊按鈕或按Enter開始/暫停游戲<br />
<input type="button" id="reset" value="重新開始" /><br />
<input type="button" id="upSpeed" value="加速" />點左邊按鈕或按Ctrl + ↑加速<br />
<input type="button" id="downSpeed" value="減速" />點左邊按鈕或按Ctrl + ↓減速
<script>
$('btn').onclick = function(){
if(Snake.paused){
Snake.move();
Snake.paused = false;
}
else{
Snake.pause();
Snake.paused = true;
}
};
$("reset").onclick = function(){
Snake.restart();
this.blur();
};
$("upSpeed").onclick = function(){
Snake.speedUp(-20);
};
$("downSpeed").onclick = function(){
Snake.speedUp(20);
};
</script>
</body>
</html>

Ⅵ javascript源碼移植到微信小游戲

微信小程序是運行在自身內置瀏覽器的一種程序語言,它對正常的html、css、js做了以下回要求:

1、html在小答程序里後綴已經改成了wxml,html中的div、p、a基本上所有的html標簽都去除或者做了改動,如div可以用view,img改成了image,所以前端html標簽你需要替換成wxml內置的標簽

2、其次css也變成了wxss,樣式定義跟原來到倒是完全以後,改下後綴即可

3、js也就是小程序的邏輯層,需要按照小程序的規定去寫,具體的可以參照網頁鏈接給的官方文檔去操作

4、總體來說換了一種格式去寫,移植過去也不是太復雜

Ⅶ javascript如何寫16格拼圖游戲

很簡單的嘛,分步走:
第一步 切圖 這個用background就能實現,就是把一張圖,在不同的格,利用背景的位置就行了,
並記錄圖片的順序,比如 01,02,03.。。16,也就是把你切好的圖作一個標記

第二步:分格,做手脊把指定的區域也就是拼圖區。分成17分,16格是放圖片,有一格是空白。。
第三步:隨機把薯伏切好的圖 顯示到相應的位置上
第四步:當點擊純滲非空白的格子的時候,判斷上下左右是否有空格,如果有,兩者替換位置。判斷當前的順序是否跟記錄的順序一樣了。如果一相,圖拼好了。如果不一樣,重復

Ⅷ 如何用純js代碼面向對象寫個簡單的21點游戲

1,html寫好界面,定義好class和id
2,為了模擬出撲克牌21點游戲,應先定義卡牌池中有1-10,J,Q,K每個數字和字母分別有4個
3,js中實現界面交互,如點擊開始按鈕,隨機從卡牌池中抽取一個數字或字母存入臨時變數a,並附於點數之和num其相應的點數
4,點擊抽牌按鈕隨機從卡牌池剩餘的卡牌中抽取,對應的卡牌存入變數a中,點數之和num=num+本次抽卡的點數
5,當num>21時提示玩家爆點,小於21點時可選按鈕抽牌,等於21點時提示恭喜之類的話,如果點擊完成抽牌則記錄此玩家點數
6,同理可擴充玩家至2,3,4....個,原理相同,不同玩家存儲對應的變數就可以了,最終通過所有<=21點的玩家num,num1,num2來判斷輸贏
7,同理可設置莊家,莊家在與其他玩家點數相同時贏得對方
8,在此基礎上就能增添許多功能了,比如每個玩家默認100金幣,有底注,每輪開始的時候可加註,如玩家不跟則底注輸掉無法參加游戲,等等之類的各種規則隨便發揮

Ⅸ 求一javascript小游戲代碼。【註:不要叫我去下載,你直接給我復制過來就可以了】。thank!!

代碼比較長 沒有注釋

腳本說明:

把如下代碼加入<body>區域中
<style>

.bigcell {

background-color:#aa9966;

border:4px solid #aa9966;

text-align:center;

}

.cell {

width:40px;

height:40px;

font-family:Verdana, Arial;

font-size:10pt;

font-weight:bold;

background-color:#996633;

color:#ffff33;

border-top:2px solid #aa9966;

border-left:2px solid #aa9966;

border-right:2px solid #663300;

border-bottom:2px solid #663300;

text-align:center;

}

.hole {

width:40px;

height:40px;

background-color:#aa9966;

text-align:center;

}

body,h1,h2,h3,.msg,capt1,capt2 {font-family:Verdana,Comic Sans MS,Arial;}

body {margin:0px;}

h1 {font-size:28pt; font-weight:bold; margin-bottom:0px;}

h2 {font-size:16pt; margin:0px; font-weight:bold;}

h3 {font-size:8pt; margin:0px; font-weight:bold;}

.msg {font-size:8pt; font-weight:bold;}

.tab {cursor:hand;}

.capt1 {font-size:10pt; font-weight:bold;}

.capt2 {font-size:9pt; font-weight:bold;}

.capt3 {font-size:14pt; font-weight:bold; color:yellow;}

.capt4 {font-size:10pt; font-weight:bold; color:yellow;}

.but {font-size:9pt; font-weight:bold; height:30px;background-color:#aaaa99;}

</style>
<BODY onLoad="loadBoard(4)">
<script>

var gsize, ghrow, ghcol, gtime, gmoves, gintervalid=-1, gshuffling;

function toggleHelp()

{

if (butHelp.value == "Hide Help")

{

help.style.display = "none";

butHelp.value = "Show Help";

}

else

{

help.style.display = "";

butHelp.value = "Hide Help";

}

}

//random number between low and hi

function r(low,hi)

{

return Math.floor((hi-low)*Math.random()+low);

}

//random number between 1 and hi

function r1(hi)

{

return Math.floor((hi-1)*Math.random()+1);

}

//random number between 0 and hi

function r0(hi)

{

return Math.floor((hi)*Math.random());

}

function startGame()

{

shuffle();

gtime = 0;

gmoves = 0;

tickTime();

gintervalid = setInterval("tickTime()",1000);

}

function stopGame()

{

if (gintervalid==-1) return;

clearInterval(gintervalid);

fldStatus.innerHTML = "";

gintervalid=-1;

}

function tickTime()

{

showStatus();

gtime++;

}

function checkWin()

{

var i, j, s;

if (gintervalid==-1) return; //game not started!

if (!isHole(gsize-1,gsize-1)) return;

for (i=0;i<gsize;i++)

for (j=0;j<gsize;j++)

{

if (!(i==gsize-1 && j==gsize-1)) //ignore last block (ideally a hole)

{

if (getValue(i,j)!=(i*gsize+j+1).toString()) return;

}

}

stopGame();

s = "<table cellpadding=4>";

s += "<tr><td align=center class=capt3>!! CONGRATS !!</td></tr>";

s += "<tr class=capt4><td align=center>You have done it in " + gtime + " secs ";

s += "with " + gmoves + " moves!</td></tr>";

s += "<tr><td align=center class=capt4>Your speed is " + Math.round(1000*gmoves/gtime)/1000 + " moves/sec</td></tr>";

s += "</table>";

fldStatus.innerHTML = s;

// shuffle();

}

function showStatus()

{

fldStatus.innerHTML = "Time: " + gtime + " secs Moves: " + gmoves

}

function showTable()

{

var i, j, s;

stopGame();

s = "<table border=3 cellpadding=0 cellspacing=0 bgcolor='#666655'><tr><td class=bigcell>";

s = s + "<table border=0 cellpadding=0 cellspacing=0>";

for (i=0; i<gsize; i++)

{

s = s + "<tr>";

for (j=0; j<gsize; j++)

{

s = s + "<td id=a_" + i + "_" + j + " onclick='move(this)' class=cell>" + (i*gsize+j+1) + "</td>";

}

s = s + "</tr>";

}

s = s + "</table>";

s = s + "</td></tr></table>";

return s;

}

function getCell(row, col)

{

return eval("a_" + row + "_" + col);

}

function setValue(row,col,val)

{

var v = getCell(row, col);

v.innerHTML = val;

v.className = "cell";

}

function getValue(row,col)

{

// alert(row + "," + col);

var v = getCell(row, col);

return v.innerHTML;

}

function setHole(row,col)

{

var v = getCell(row, col);

v.innerHTML = "";

v.className = "hole";

ghrow = row;

ghcol = col;

}

function getRow(obj)

{

var a = obj.id.split("_");

return a[1];

}

function getCol(obj)

{

var a = obj.id.split("_");

return a[2];

}

function isHole(row, col)

{

return (row==ghrow && col==ghcol) ? true : false;

}

function getHoleInRow(row)

{

var i;

return (row==ghrow) ? ghcol : -1;

}

function getHoleInCol(col)

{

var i;

return (col==ghcol) ? ghrow : -1;

}

function shiftHoleRow(src,dest,row)

{

var i;

//conversion to integer needed in some cases!

src = parseInt(src);

dest = parseInt(dest);

if (src < dest)

{

for (i=src;i<dest;i++)

{

setValue(row,i,getValue(row,i+1));

setHole(row,i+1);

}

}

if (dest < src)

{

for (i=src;i>dest;i--)

{

setValue(row,i,getValue(row,i-1));

setHole(row,i-1);

}

}

}

function shiftHoleCol(src,dest,col)

{

var i;

//conversion to integer needed in some cases!

src = parseInt(src);

dest = parseInt(dest);

if (src < dest)

{//alert("src=" + src +" dest=" + dest + " col=" + col);

for (i=src;i<dest;i++)

{//alert(parseInt(i)+1);

setValue(i,col,getValue(i+1,col));

setHole(i+1,col);

}

}

if (dest < src)

{

for (i=src;i>dest;i--)

{

setValue(i,col,getValue(i-1,col));

setHole(i-1,col);

}

}

}

function move(obj)

{

var r, c, hr, hc;

if (gintervalid==-1 && !gshuffling)

{

alert('請點擊"開始游戲"按鈕')

return;

}

r = getRow(obj);

c = getCol(obj);

if (isHole(r,c)) return;

hc = getHoleInRow(r);

if (hc != -1)

{

shiftHoleRow(hc,c,r);

gmoves++;

checkWin();

return;

}

hr = getHoleInCol(c);

if (hr != -1)

{

shiftHoleCol(hr,r,c);

gmoves++;

checkWin();

return;

}

}

function shuffle()

{

var t,i,j,s,frac;

gshuffling = true;

frac = 100.0/(gsize*(gsize+10));

s = "% ";

for (i=0;i<gsize;i++)

{

s += "|";

for (j=0;j<gsize+10;j++)

{

window.status = "Loading " + Math.round((i*(gsize+10) + j)*frac) + s

if (j%2==0)

{

t = r0(gsize);

while (t == ghrow) t = r0(gsize); //skip holes

getCell(t,ghcol).click();

}

else

{

t = r0(gsize);

while (t == ghcol) t = r0(gsize); //skip holes

getCell(ghrow,t).click();

}

}

}

window.status = "";

gshuffling = false;

}

function loadBoard(size)

{

gsize = size;

board.innerHTML = showTable(gsize);

setHole(gsize-1,gsize-1);

//shuffle();

}

</script>
<div id=test></div>

<table cellpadding=4>

<tr><td align=center>

<b>請選擇難度: </B>

<select id=level onchange="loadBoard(parseInt(level.value))">

<option value='3'>3</option>

<option value='4' selected>4</option>

<script>

for (var i=5;i<=10;i++)

{

document.write("<option value='" + i + "'>" + i + "</option>");

}

</script>

</select>

</td></tr>

<tr><td align=center>

<input type=button class=but value="開始游戲" onclick="startGame();">

<tr><td align=center id=fldStatus class=capt2>

</td></tr>

</table>

<div id=board></div>

Ⅹ 如何開發一個簡單的html5小游戲

創建畫布
// Create the canvas
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = 512;
canvas.height = 480;
document.body.appendChild(canvas);

首先我們需要創建一張畫布作為游戲的舞台。這里通過JS代碼而不是直接在HTML里寫一個<canvas>元素目的是要說明代碼創建也是很方便的。有了畫布後就可以獲得它的上下文來進行繪圖了。然後我們還設置了畫布大小,最後將其添加到頁面上。
准備圖片
// 背景圖片
var bgReady = false;
var bgImage = new Image();
bgImage.onload = function () {
bgReady = true;
};
bgImage.src = "images/background.png";

游戲嘛少不了圖片的,所以我們先載入一些圖片先。簡便起見,這里僅創建簡單的圖片對象,而不是專門寫一個類或者Helper來做圖片載入。bgReady這個變數用來標識圖片是否已經載入完成從而可以放心地使用了,因為如果在圖片載入未完成情況下進行繪制是會報錯的。
整個游戲中需要用到的三張圖片:背景,英雄及怪物我們都用上面的方法來處理。
游戲對象
// 游戲對象
var hero = {
speed: 256, // 每秒移動的像素
x: 0,
y: 0
};
var monster = {
x: 0,
y: 0
};
var monstersCaught = 0;

現在定義一些對象將在後面用到。我們的英雄有一個speed屬性用來控制他每秒移動多少像素。怪物游戲過程中不會移動,所以只有坐標屬性就夠了。monstersCaught則用來存儲怪物被捉住的次數。
處理用戶的輸入
// 處理按鍵
var keysDown = {};

addEventListener("keydown", function (e) {
keysDown[e.keyCode] = true;
}, false);

addEventListener("keyup", function (e) {
delete keysDown[e.keyCode];
}, false);

現在開始處理用戶的輸入(對初次接觸游戲開發的前端同學來說,這部分開始可能就需要一些腦力了)。在前端開發中,一般是用戶觸發了點擊事件然後才去執行動畫或發起非同步請求之類的,但這里我們希望游戲的邏輯能夠更加緊湊同時又要及時響應輸入。所以我們就把用戶的輸入先保存下來而不是立即響應。
為此,我們用keysDown這個對象來保存用戶按下的鍵值(keyCode),如果按下的鍵值在這個對象里,那麼我們就做相應處理。
開始一輪游戲
// 當用戶抓住一隻怪物後開始新一輪游戲
var reset = function () {
hero.x = canvas.width / 2;
hero.y = canvas.height / 2;

// 將新的怪物隨機放置到界面上
monster.x = 32 + (Math.random() * (canvas.width - 64));
monster.y = 32 + (Math.random() * (canvas.height - 64));
};

reset方法用於開始新一輪和游戲,在這個方法里我們將英雄放回畫布中心同時將怪物放到一個隨機的地方。
更新對象
// 更新游戲對象的屬性
var update = function (modifier) {
if (38 in keysDown) { // 用戶按的是↑
hero.y -= hero.speed * modifier;
}
if (40 in keysDown) { // 用戶按的是↓
hero.y += hero.speed * modifier;
}
if (37 in keysDown) { // 用戶按的是←
hero.x -= hero.speed * modifier;
}
if (39 in keysDown) { // 用戶按的是→
hero.x += hero.speed * modifier;
}

// 英雄與怪物碰到了么?
if (
hero.x <= (monster.x + 32)
&& monster.x <= (hero.x + 32)
&& hero.y <= (monster.y + 32)
&& monster.y <= (hero.y + 32)
) {
++monstersCaught;
reset();
}
};

這就是游戲中用於更新畫面的update函數,會被規律地重復調用。首先它負責檢查用戶當前按住的是中方向鍵,然後將英雄往相應方向移動。
有點費腦力的或許是這個傳入的modifier 變數。你可以在main 方法里看到它的來源,但這里還是有必要詳細解釋一下。它是基於1開始且隨時間變化的一個因子。例如1秒過去了,它的值就是1,英雄的速度將會乘以1,也就是每秒移動256像素;如果半秒鍾則它的值為0.5,英雄的速度就乘以0.5也就是說這半秒內英雄以正常速度一半的速度移動。理論上說因為這個update 方法被調用的非常快且頻繁,所以modifier的值會很小,但有了這一因子後,不管我們的代碼跑得快慢,都能夠保證英雄的移動速度是恆定的。
現在英雄的移動已經是基於用戶的輸入了,接下來該檢查移動過程中所觸發的事件了,也就是英雄與怪物相遇。這就是本游戲的勝利點,monstersCaught +1然後重新開始新一輪。
渲染物體
// 畫出所有物體
var render = function () {
if (bgReady) {
ctx.drawImage(bgImage, 0, 0);
}

if (heroReady) {
ctx.drawImage(heroImage, hero.x, hero.y);
}

if (monsterReady) {
ctx.drawImage(monsterImage, monster.x, monster.y);
}

// 計分
ctx.fillStyle = "rgb(250, 250, 250)";
ctx.font = "24px Helvetica";
ctx.textAlign = "left";
ctx.textBaseline = "top";
ctx.fillText("Monsterrs caught: " + monstersCaught, 32, 32);
};

之前的工作都是枯燥的,直到你把所有東西畫出來之後。首先當然是把背景圖畫出來。然後如法炮製將英雄和怪物也畫出來。這個過程中的順序是有講究的,因為後畫的物體會覆蓋之前的物體。
這之後我們改變了一下Canvas的繪圖上下文的樣式並調用fillText來繪制文字,也就是記分板那一部分。本游戲沒有其他復雜的動畫效果和打鬥場面,繪制部分大功告成!
主循環函數
// 游戲主函數
var main = function () {
var now = Date.now();
var delta = now - then;

update(delta / 1000);
render();

then = now;

// 立即調用主函數
requestAnimationFrame(main);
};

上面的主函數控制了整個游戲的流程。先是拿到當前的時間用來計算時間差(距離上次主函數被調用時過了多少毫秒)。得到modifier後除以1000(也就是1秒中的毫秒數)再傳入update函數。最後調用render 函數並且將本次的時間保存下來。
關於游戲中循環更新畫面的討論可參見「Onslaught! Arena Case Study」。
關於循環的進一步解釋
// requestAnimationFrame 的瀏覽器兼容性處理
var w = window;
requestAnimationFrame = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame;

如果你不是完全理解上面的代碼也沒關系,我只是覺得拿出來解釋一下總是極好的
為了循環地調用main函數,本游戲之前用的是setInterval。但現今已經有了更好的方法那就是requestAnimationFrame。使用新方法就不得不考慮瀏覽器兼容性。上面的墊片就是出於這樣的考慮,它是Paul Irish 博客原版的一個簡化版本
啟動游戲!
// 少年,開始游戲吧!
var then = Date.now();
reset();
main();

總算完成了,這是本游戲最後一段代碼了。先是設置一個初始的時間變數then用於首先運行main函數使用。然後調用 reset 函數來開始新一輪游戲(如果你還記得的話,這個函數的作用是將英雄放到畫面中間同時將怪物放到隨機的地方以方便英雄去捉它)。
到此,相信你已經掌握了開發一個簡單H5小游戲需要的基本功了。玩玩這個游戲或者下載代碼自己研究研究吧 :)

Feel free to repost but keep the link to this page please!

閱讀全文

與最簡單的js小游戲源碼相關的資料

熱點內容
cad新文件能找回來嗎 瀏覽:951
導出手機qq文件到u盤 瀏覽:456
電腦如何打開ppt文件怎麼打開方式 瀏覽:782
魅族鎖定區文件夾 瀏覽:357
刻字cnc怎麼編程 瀏覽:182
學校的網路拓撲結構圖 瀏覽:784
收集100個pdf文件里關鍵詞 瀏覽:594
蘋果關閉4g網路設置 瀏覽:289
如何監測資料庫 瀏覽:967
拷貝過來的pdf文件 瀏覽:751
抖音小店的訪客數據怎麼看 瀏覽:670
怎麼把c語言編程的字元向下移動 瀏覽:786
sql刪除文件組代碼 瀏覽:978
安卓post請求多重json 瀏覽:776
微信消除數據怎麼恢復 瀏覽:918
小米刷機顯示系統找不到指定文件 瀏覽:528
蘋果手機小風扇圖app叫什麼 瀏覽:292
繁體中文輸入工具 瀏覽:916
pc桌面壁紙文件夾 瀏覽:473
微信怎麼添加群 瀏覽:781

友情鏈接