亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

html5游戲制作入門系列教程(七)

系統 2304 0

我們繼續這一系列文章,使用HTML5的canvas組件進行游戲開發。我們將要更新完善我們的 第4課html5游戲制作入門系列教程(四) 的游戲實例,并增加了火球,敵人和碰撞檢測等功能模塊。所以,現在我們的飛龍可以施放火球來殺死敵人(還有成績統計)?,F在,這個游戲的互動性更強了。你可以點擊這里閱讀這一系列教程的前一篇文章: html5游戲制作入門系列教程(六) 。我們將基于之前的程序和代碼進行開發。

?

這里有我們的演示和下載包:

在線演示 源碼下載

?

好吧,下載所需文件,讓我們開始編碼!

?

步驟1:HTML
下面是基本的HTML代碼:
這里是我演示的HTML,非常簡單,對不對?

        <!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="utf-8" />
<title>html5游戲制作入門系列教程(七)</title>
<link href="css/main.css" rel="stylesheet" type="text/css" />

<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script src="js/jquery.js"></script>
<script src="js/script.js"></script>
</head>
<body>
<header tabindex="0">
<h2>html5游戲制作入門系列教程(七)</h2>
<a  class="stuts">返回原文<span>HTML5GAME</span></a>
</header>
<div class="container">
<canvas id="scene" width="1000" height="600" tabindex="1"></canvas>
</div>
</body>
</html>
      

?

步驟2:CSS
下面是所使用的CSS樣式表文件。
css/main.css
今天就不把css樣式貼出來了,和以前的一樣,沒有什么特別之處。你可以在下載包里找到它。

?

步驟3:JS
js/script.js

        // inner variables
var canvas, ctx;
var backgroundImage;
var iBgShiftX = 100;

var dragon, enemy = null; // game objects
var balls = [];
var enemies = [];

var dragonW = 75; // dragon width
var dragonH = 70; // dragon height
var iSprPos = 0; // initial sprite frame
var iSprDir = 0; // initial dragon direction
var iEnemyW = 128; // enemy width
var iEnemyH = 128; // enemy height
var iBallSpeed = 10; // initial ball speed
var iEnemySpeed = 2; // initial enemy speed

var dragonSound; // dragon sound
var wingsSound; // wings sound
var explodeSound, explodeSound2; // explode sounds
var laughtSound; // wings sound

var bMouseDown = false; // mouse down state
var iLastMouseX = 0;
var iLastMouseY = 0;
var iScore = 0;
// -------------------------------------------------------------

// objects :
function Dragon(x, y, w, h, image) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.image = image;
this.bDrag = false;
}
function Ball(x, y, w, h, speed, image) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.speed = speed;
this.image = image;
}
function Enemy(x, y, w, h, speed, image) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.speed = speed;
this.image = image;
}
// -------------------------------------------------------------
// get random number between X and Y
function getRand(x, y) {
return Math.floor(Math.random()*y)+x;
}

// draw functions :
function drawScene() { // main drawScene function
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); // clear canvas

// draw background
iBgShiftX += 4;
if (iBgShiftX >= 1045) {
iBgShiftX = 0;
}
ctx.drawImage(backgroundImage, 0 + iBgShiftX, 0, 1000, 940, 0, 0, 1000, 600);

// update sprite positions
iSprPos++;
if (iSprPos >= 9) {
iSprPos = 0;
}

// in case of mouse down - move dragon more close to our mouse
if (bMouseDown) {
if (iLastMouseX > dragon.x) {
dragon.x += 5;
}
if (iLastMouseY > dragon.y) {
dragon.y += 5;
}
if (iLastMouseX < dragon.x) {
dragon.x -= 5;
}
if (iLastMouseY < dragon.y) {
dragon.y -= 5;
}
}

// draw dragon
ctx.drawImage(dragon.image, iSprPos*dragon.w, iSprDir*dragon.h, dragon.w, dragon.h, dragon.x - dragon.w/2, dragon.y - dragon.h/2, dragon.w, dragon.h);

// draw fireballs
if (balls.length > 0) {
for (var key in balls) {
if (balls[key] != undefined) {
ctx.drawImage(balls[key].image, balls[key].x, balls[key].y);
balls[key].x += balls[key].speed;

if (balls[key].x > canvas.width) {
delete balls[key];
}
}
}
}

// draw enemies
if (enemies.length > 0) {
for (var ekey in enemies) {
if (enemies[ekey] != undefined) {
ctx.drawImage(enemies[ekey].image, enemies[ekey].x, enemies[ekey].y);
enemies[ekey].x += enemies[ekey].speed;

if (enemies[ekey].x < - iEnemyW) {
delete enemies[ekey];

// play laught sound
laughtSound.currentTime = 0;
laughtSound.play();
}
}
}
}

// collision detection
if (balls.length > 0) {
for (var key in balls) {
if (balls[key] != undefined) {

if (enemies.length > 0) {
for (var ekey in enemies) {
if (enemies[ekey] != undefined && balls[key] != undefined) {
if (balls[key].x + balls[key].w > enemies[ekey].x && balls[key].y + balls[key].h > enemies[ekey].y && balls[key].y < enemies[ekey].y + enemies[ekey].h) {
delete enemies[ekey];
delete balls[key];
iScore++;

// play explode sound #2
explodeSound2.currentTime = 0;
explodeSound2.play();
}
}
}
}
}
}
}

// draw score
ctx.font = '16px Verdana';
ctx.fillStyle = '#fff';
ctx.fillText('Score: ' + iScore * 10, 900, 580);
ctx.fillText('Plese click "1" to cast fireball', 100, 580);

}

// -------------------------------------------------------------

// initialization
$(function(){
canvas = document.getElementById('scene');
ctx = canvas.getContext('2d');

var width = canvas.width;
var height = canvas.height;

// load background image
backgroundImage = new Image();
backgroundImage.src = 'images/hell.jpg';
backgroundImage.onload = function() {
}
backgroundImage.onerror = function() {
console.log('Error loading the background image.');
}

// 'Dragon' music init
dragonSound = new Audio('media/dragon.wav');
dragonSound.volume = 0.9;

// 'Laught' music init
laughtSound = new Audio('media/laught.wav');
laughtSound.volume = 0.9;

// 'Explode' music inits
explodeSound = new Audio('media/explode1.wav');
explodeSound.volume = 0.9;
explodeSound2 = new Audio('media/explosion.wav');
explodeSound2.volume = 0.9;

// 'Wings' music init
wingsSound = new Audio('media/wings.wav');
wingsSound.volume = 0.9;
wingsSound.addEventListener('ended', function() { // loop wings sound
this.currentTime = 0;
this.play();
}, false);
wingsSound.play();

// initialization of empty ball
var oBallImage = new Image();
oBallImage.src = 'images/fireball.png';
oBallImage.onload = function() { }

// initialization of empty enemy
var oEnemyImage = new Image();
oEnemyImage.src = 'images/enemy.png';
oEnemyImage.onload = function() { }

// initialization of dragon
var oDragonImage = new Image();
oDragonImage.src = 'images/dragon.gif';
oDragonImage.onload = function() {
dragon = new Dragon(400, 300, dragonW, dragonH, oDragonImage);
}

$('#scene').mousedown(function(e) { // binding mousedown event (for dragging)
var mouseX = e.layerX || 0;
var mouseY = e.layerY || 0;
if(e.originalEvent.layerX) { // changes for jquery 1.7
mouseX = e.originalEvent.layerX;
mouseY = e.originalEvent.layerY;
}

bMouseDown = true;

if (mouseX > dragon.x- dragon.w/2 && mouseX < dragon.x- dragon.w/2 +dragon.w &&
mouseY > dragon.y- dragon.h/2 && mouseY < dragon.y-dragon.h/2 +dragon.h) {

dragon.bDrag = true;
dragon.x = mouseX;
dragon.y = mouseY;
}
});

$('#scene').mousemove(function(e) { // binding mousemove event
var mouseX = e.layerX || 0;
var mouseY = e.layerY || 0;
if(e.originalEvent.layerX) {
mouseX = e.originalEvent.layerX;
mouseY = e.originalEvent.layerY;
}

// saving last coordinates
iLastMouseX = mouseX;
iLastMouseY = mouseY;

// perform dragon dragging
if (dragon.bDrag) {
dragon.x = mouseX;
dragon.y = mouseY;
}

// change direction of dragon (depends on mouse position)
if (mouseX > dragon.x && Math.abs(mouseY-dragon.y) < dragon.w/2) {
iSprDir = 0;
} else if (mouseX < dragon.x && Math.abs(mouseY-dragon.y) < dragon.w/2) {
iSprDir = 4;
} else if (mouseY > dragon.y && Math.abs(mouseX-dragon.x) < dragon.h/2) {
iSprDir = 2;
} else if (mouseY < dragon.y && Math.abs(mouseX-dragon.x) < dragon.h/2) {
iSprDir = 6;
} else if (mouseY < dragon.y && mouseX < dragon.x) {
iSprDir = 5;
} else if (mouseY < dragon.y && mouseX > dragon.x) {
iSprDir = 7;
} else if (mouseY > dragon.y && mouseX < dragon.x) {
iSprDir = 3;
} else if (mouseY > dragon.y && mouseX > dragon.x) {
iSprDir = 1;
}
});

$('#scene').mouseup(function(e) { //綁定鼠標鍵松開事件
dragon.bDrag = false;
bMouseDown = false;

// play dragon sound
dragonSound.currentTime = 0;
dragonSound.play();
});

$(window).keydown(function(event){ // 鍵盤事件處理
switch (event.keyCode) {
case 49: // '1' key
balls.push(new Ball(dragon.x, dragon.y, 32, 32, iBallSpeed, oBallImage));

// 播放爆炸聲音片段1 #1
explodeSound.currentTime = 0;
explodeSound.play();
break;
}
});

setInterval(drawScene, 30); // 循環渲染場景

// generate enemies randomly
var enTimer = null;
function addEnemy() {
clearInterval(enTimer);

var randY = getRand(0, canvas.height - iEnemyH);
enemies.push(new Enemy(canvas.width, randY, iEnemyW, iEnemyH, - iEnemySpeed, oEnemyImage));

var interval = getRand(5000, 10000);
enTimer = setInterval(addEnemy, interval); // 循環渲染場景(添加敵人)
}
addEnemy();
});
      

?

        在一開始,我增加了兩個新的對象:火球和敵人。每個對象都有自己的屬性集(如位置,大小,形象,速度)。之后,我加入我們的drawScene()函數,負責繪制火球和敵人。另外,在這個函數的底部,你可以看到碰撞檢測方法:
      
        // collision detection
if (balls.length > 0) {
for (var key in balls) {
if (balls[key] != undefined) {

if (enemies.length > 0) {
for (var ekey in enemies) {
if (enemies[ekey] != undefined && balls[key] != undefined) {
if (balls[key].x + balls[key].w > enemies[ekey].x && balls[key].y + balls[key].h > enemies[ekey].y && balls[key].y < enemies[ekey].y + enemies[ekey].h) {
delete enemies[ekey];
delete balls[key];
iScore++;

// 播放爆炸聲音片段#2
explodeSound2.currentTime = 0;
explodeSound2.play();
}
}
}
}
}
}
}
      
        ?
      

最后,我們必須定期添加我們的敵人(隨機):

        // 產生隨機敵人
var enTimer = null;
function addEnemy() {
clearInterval(enTimer);

var randY = getRand(0, canvas.height - iEnemyH);
enemies.push(new Enemy(canvas.width, randY, iEnemyW, iEnemyH, - iEnemySpeed, oEnemyImage));

var interval = getRand(5000, 10000);
enTimer = setInterval(addEnemy, interval); // 循環繪制場景(添加敵人)
}
addEnemy();
      

?

?

步驟4:資源文件
游戲制作需要使用如下的游戲資源文件,包括圖片和聲音文件,這些你都可以在下載包中找到。
images/dragon.gif, images/enemy.png, images/fireball.png, images/hell.jpg
media/dragon.wav, media/explode1.wav, media/explosion.wav, media/laught.wav, media/wings.wav

?

結論
超級酷,不是嗎?我會很高興看到您的評論和意見。祝你好運!

在線演示 源碼下載

轉載請注明: HTML5游戲開發者社區 ? html5游戲制作入門系列教程(七)

html5游戲制作入門系列教程(七)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美日韩成人一区在线 | 狠狠色丁香婷婷综合精品视频 | 久久国产免费观看精品 | 国产精品ady9 | 波多野结衣一区二区三区四区 | 完整日本特级毛片 | 国产视频二区在线观看 | 久久精品久久久久久久久人 | 俄罗斯一级毛片免费播放 | 国产一区二区视频在线播放 | 国产伦精品一区二区三区免费迷 | 久久99久久99 | 美女超爽久久久久网站 | 1000部羞羞禁止免费观看视频 | 曰批免费视频播放在线看片二 | 亚洲欧美日韩在线一区 | 国产精品久久久久久一级毛片 | 日本欧美日韩 | 免费爱爱视频网站 | 大学生不戴套毛片视频 | 成人免费视频在 | a v在线男人的天堂观看免费 | 操野逼| 免费在线a | 毛片在线看网站 | 超97在线观看精品国产 | 久久在线免费视频 | 欧美日韩高清一区二区三区 | chinese国产在线视频 | 久草在线视频免费 | 一级毛片一级毛片a毛片欧美 | 5060一级毛片 | 中文字幕精品视频在线观看 | 青青青视频精品中文字幕 | 成年女人看片免费视频频 | 国产一区二区三区视频在线观看 | 四虎免费在线视频 | a一级黄色片 | 九九九热在线精品免费全部 | 五月久久亚洲七七综合中文网 | 日本毛片在线 |