HTML5 Game Development – Lesson 10 Finally we can continue the series of articles on game development in HTML5 using canvas. Today I have prepared a new game – SkyWalker. Basically – this is a flight simulator with a plane and multiple enemies. Our goal – to get to the finish line. There are next key features: using sprites for the plane and explosions, possibility to press multiple keys (as example – you can move and attack at the same time), a certain level length, enhanced collision detections (now enemies can damage our plane), life and scores params. Our previous article you can read here: Developing Your First HTML5 Game – Lesson 9.

HTML5游戏开发–第10课最后,我们可以继续使用画布在HTML5中进行游戏开发的系列文章。 今天,我准备了一个新游戏-SkyWalker。 基本上-这是一架有飞机和多个敌人的飞行模拟器。 我们的目标–到达终点。 接下来的主要功能是:使用精灵进行平面和爆炸,可以按下多个键(例如,您可以同时移动和攻击),一定的水平长度,增强的碰撞检测能力(现在敌人可以破坏我们的飞机) ,生活和分数参数。 您可以在此处阅读我们以前的文章: 开发您的第一个HTML5游戏–第9课 。

Now you can check our demo and download the sources:

现在,您可以检查我们的演示并下载资源:

现场演示

[sociallocker]

[社交储物柜]

打包下载

[/sociallocker]

[/ sociallocker]

If you are ready – let’s start coding !

如果您准备好了,那就开始编码吧!

步骤1. HTML (Step 1. HTML)

As usual (for all canvas-based demos) we have a basic html markup:

像往常一样(对于所有基于画布的演示),我们有一个基本的html标记:


<!DOCTYPE html>
<html lang="en" ><head><meta charset="utf-8" /><meta name="author" content="Script Tutorials" /><title>HTML5 Game Development - Lesson 10 (SkyWalker) | Script Tutorials</title><!-- add styles --><link href="css/main.css" rel="stylesheet" type="text/css" /><!-- add scripts --><script src="js/jquery.js"></script><script src="js/script.js"></script></head><body><div class="container"><canvas id="scene" width="700" height="700" tabindex="1"></canvas></div></body>
</html>

<!DOCTYPE html>
<html lang="en" ><head><meta charset="utf-8" /><meta name="author" content="Script Tutorials" /><title>HTML5 Game Development - Lesson 10 (SkyWalker) | Script Tutorials</title><!-- add styles --><link href="css/main.css" rel="stylesheet" type="text/css" /><!-- add scripts --><script src="js/jquery.js"></script><script src="js/script.js"></script></head><body><div class="container"><canvas id="scene" width="700" height="700" tabindex="1"></canvas></div></body>
</html>

第2步:JS (Step 2. JS)

Now, please create an empty file ‘script.js’ (in ‘js’ folder) and put this code inside (this is full JS code of our SkyWalker game). I will explain the main functionality below this code.

现在,请创建一个空文件'script.js'(在'js'文件夹中)并将此代码放入其中(这是我们的SkyWalker游戏的完整JS代码)。 我将在此代码下方解释主要功能。

js / script.js (js/script.js)


// inner variables
var canvas, ctx;
// images
var backgroundImage;
var oRocketImage;
var oExplosionImage;
var introImage;
var oEnemyImage;
var iBgShiftY = 9300; //10000 (level length) - 700 (canvas height)
var bPause = true; // game pause
var plane = null; // plane object
var rockets = []; // array of rockets
var enemies = []; // array of enemies
var explosions = []; // array of explosions
var planeW = 200; // plane width
var planeH = 110; // plane height
var iSprPos = 2; // initial sprite frame for plane
var iMoveDir = 0; // move direction
var iEnemyW = 128; // enemy width
var iEnemyH = 128; // enemy height
var iRocketSpeed = 10; // initial rocket speed
var iEnemySpeed = 5; // initial enemy speed
var pressedKeys = []; // array of pressed keys
var iScore = 0; // total score
var iLife = 100; // total life of plane
var iDamage = 10; // damage per enemy plane
var enTimer = null; // random timer for a new enemy
// -------------------------------------------------------------
// objects :
function Plane(x, y, w, h, image) {this.x = x;this.y = y;this.w = w;this.h = h;this.image = image;this.bDrag = false;
}
function Rocket(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;
}
function Explosion(x, y, w, h, sprite, image) {this.x = x;this.y = y;this.w = w;this.h = h;this.sprite = sprite;this.image = image;
}
// -------------------------------------------------------------
// get random number between X and Y
function getRand(x, y) {return Math.floor(Math.random()*y)+x;
}
// Display Intro function
function displayIntro() {ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);ctx.drawImage(introImage, 0, 0,700, 700);
}
// Draw Main scene function
function drawScene() {if (! bPause) {iBgShiftY -= 2; // move main groundif (iBgShiftY < 5) { // Finish positionbPause = true;// draw scorectx.font = '40px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Finish, your score: ' + iScore * 10 + ' points', 50, 200);return;}// process pressed keys (movement of plane)processPressedKeys();// clear canvasctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);// draw backgroundctx.drawImage(backgroundImage, 0, 0 + iBgShiftY, 700, 700, 0, 0, 700, 700);// draw planectx.drawImage(plane.image, iSprPos*plane.w, 0, plane.w, plane.h, plane.x - plane.w/2, plane.y - plane.h/2, plane.w, plane.h);// draw rocketsif (rockets.length > 0) {for (var key in rockets) {if (rockets[key] != undefined) {ctx.drawImage(rockets[key].image, rockets[key].x, rockets[key].y);rockets[key].y -= rockets[key].speed;// if a rocket is out of screen - remove itif (rockets[key].y < 0) {delete rockets[key];}}}}// draw explosionsif (explosions.length > 0) {for (var key in explosions) {if (explosions[key] != undefined) {// display explosion spritesctx.drawImage(explosions[key].image, explosions[key].sprite*explosions[key].w, 0, explosions[key].w, explosions[key].h, explosions[key].x - explosions[key].w/2, explosions[key].y - explosions[key].h/2, explosions[key].w, explosions[key].h);explosions[key].sprite++;// remove an explosion object when it expiresif (explosions[key].sprite > 10) {delete explosions[key];}}}}// draw enemiesif (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].y -= enemies[ekey].speed;// remove an enemy object if it is out of screenif (enemies[ekey].y > canvas.height) {delete enemies[ekey];}}}}if (enemies.length > 0) {for (var ekey in enemies) {if (enemies[ekey] != undefined) {// collisions with rocketsif (rockets.length > 0) {for (var key in rockets) {if (rockets[key] != undefined) {if (rockets[key].y < enemies[ekey].y + enemies[ekey].h/2 && rockets[key].x > enemies[ekey].x && rockets[key].x + rockets[key].w < enemies[ekey].x + enemies[ekey].w) {explosions.push(new Explosion(enemies[ekey].x + enemies[ekey].w / 2, enemies[ekey].y + enemies[ekey].h / 2, 120, 120, 0, oExplosionImage));// delete enemy, rocket, and add +1 to scoredelete enemies[ekey];delete rockets[key];iScore++;}}}}// collisions with planeif (enemies[ekey] != undefined) {if (plane.y - plane.h/2 < enemies[ekey].y + enemies[ekey].h/2 && plane.x - plane.w/2 < enemies[ekey].x + enemies[ekey].w && plane.x + plane.w/2 > enemies[ekey].x) {explosions.push(new Explosion(enemies[ekey].x + enemies[ekey].w / 2, enemies[ekey].y + enemies[ekey].h / 2, 120, 120, 0, oExplosionImage));// delete enemy and make damagedelete enemies[ekey];iLife -= iDamage;if (iLife <= 0) { // Game overbPause = true;// draw scorectx.font = '38px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Game over, your score: ' + iScore * 10 + ' points', 25, 200);return;}}}}}}// display life and scorectx.font = '14px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Life: ' + iLife + ' / 100', 50, 660);ctx.fillText('Score: ' + iScore * 10, 50, 680);}
}
// Process Pressed Keys function
function processPressedKeys() {if (pressedKeys[37] != undefined) { // 'Left' keyif (iSprPos > 0) {iSprPos--;iMoveDir = -7;}if (plane.x - plane.w / 2 > 10) {plane.x += iMoveDir;}}else if (pressedKeys[39] != undefined) { // 'Right' keyif (iSprPos < 4) {iSprPos++;iMoveDir = 7;}if (plane.x + plane.w / 2 < canvas.width - 10) {plane.x += iMoveDir;}}
}
// Add Enemy function (adds a new enemy randomly)
function addEnemy() {clearInterval(enTimer);var randX = getRand(0, canvas.height - iEnemyH);enemies.push(new Enemy(randX, 0, iEnemyW, iEnemyH, - iEnemySpeed, oEnemyImage));var interval = getRand(1000, 4000);enTimer = setInterval(addEnemy, interval); // loop
}
// Main Initialization
$(function(){canvas = document.getElementById('scene');ctx = canvas.getContext('2d');// load background imagebackgroundImage = new Image();backgroundImage.src = 'images/levelmap.jpg';backgroundImage.onload = function() {}backgroundImage.onerror = function() {console.log('Error loading the background image.');}introImage = new Image();introImage.src = 'images/intro.jpg';// initialization of empty rocketoRocketImage = new Image();oRocketImage.src = 'images/rocket.png';oRocketImage.onload = function() { }// initialization of explosion imageoExplosionImage = new Image();oExplosionImage.src = 'images/explosion.png';oExplosionImage.onload = function() { }// initialization of empty enemyoEnemyImage = new Image();oEnemyImage.src = 'images/enemy.png';oEnemyImage.onload = function() { }// initialization of planevar oPlaneImage = new Image();oPlaneImage.src = 'images/plane.png';oPlaneImage.onload = function() {plane = new Plane(canvas.width / 2, canvas.height - 100, planeW, planeH, oPlaneImage);}$(window).keydown(function (evt){ // onkeydown event handlevar pk = pressedKeys[evt.keyCode];if (! pk) {pressedKeys[evt.keyCode] = 1; // add all pressed keys into array}if (bPause && evt.keyCode == 13) { // in case of Enter buttonbPause = false;// start main animationsetInterval(drawScene, 30); // loop drawScene// and add first enemyaddEnemy();}});$(window).keyup(function (evt) { // onkeyup event handlevar pk = pressedKeys[evt.keyCode];if (pk) {delete pressedKeys[evt.keyCode]; // remove pressed key from array}if (evt.keyCode == 65) { // 'A' button - add a rocketrockets.push(new Rocket(plane.x - 16, plane.y - plane.h, 32, 32, iRocketSpeed, oRocketImage));}if (evt.keyCode == 37 || evt.keyCode == 39) {// revert plane sprite to default positionif (iSprPos > 2) {for (var i = iSprPos; i >= 2; i--) {iSprPos = i;iMoveDir = 0;}} else {for (var i = iSprPos; i <= 2; i++) {iSprPos = i;iMoveDir = 0;}}}});// when intro is ready - display itintroImage.onload = function() {displayIntro(); // Display intro once}
});

// inner variables
var canvas, ctx;
// images
var backgroundImage;
var oRocketImage;
var oExplosionImage;
var introImage;
var oEnemyImage;
var iBgShiftY = 9300; //10000 (level length) - 700 (canvas height)
var bPause = true; // game pause
var plane = null; // plane object
var rockets = []; // array of rockets
var enemies = []; // array of enemies
var explosions = []; // array of explosions
var planeW = 200; // plane width
var planeH = 110; // plane height
var iSprPos = 2; // initial sprite frame for plane
var iMoveDir = 0; // move direction
var iEnemyW = 128; // enemy width
var iEnemyH = 128; // enemy height
var iRocketSpeed = 10; // initial rocket speed
var iEnemySpeed = 5; // initial enemy speed
var pressedKeys = []; // array of pressed keys
var iScore = 0; // total score
var iLife = 100; // total life of plane
var iDamage = 10; // damage per enemy plane
var enTimer = null; // random timer for a new enemy
// -------------------------------------------------------------
// objects :
function Plane(x, y, w, h, image) {this.x = x;this.y = y;this.w = w;this.h = h;this.image = image;this.bDrag = false;
}
function Rocket(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;
}
function Explosion(x, y, w, h, sprite, image) {this.x = x;this.y = y;this.w = w;this.h = h;this.sprite = sprite;this.image = image;
}
// -------------------------------------------------------------
// get random number between X and Y
function getRand(x, y) {return Math.floor(Math.random()*y)+x;
}
// Display Intro function
function displayIntro() {ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);ctx.drawImage(introImage, 0, 0,700, 700);
}
// Draw Main scene function
function drawScene() {if (! bPause) {iBgShiftY -= 2; // move main groundif (iBgShiftY < 5) { // Finish positionbPause = true;// draw scorectx.font = '40px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Finish, your score: ' + iScore * 10 + ' points', 50, 200);return;}// process pressed keys (movement of plane)processPressedKeys();// clear canvasctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);// draw backgroundctx.drawImage(backgroundImage, 0, 0 + iBgShiftY, 700, 700, 0, 0, 700, 700);// draw planectx.drawImage(plane.image, iSprPos*plane.w, 0, plane.w, plane.h, plane.x - plane.w/2, plane.y - plane.h/2, plane.w, plane.h);// draw rocketsif (rockets.length > 0) {for (var key in rockets) {if (rockets[key] != undefined) {ctx.drawImage(rockets[key].image, rockets[key].x, rockets[key].y);rockets[key].y -= rockets[key].speed;// if a rocket is out of screen - remove itif (rockets[key].y < 0) {delete rockets[key];}}}}// draw explosionsif (explosions.length > 0) {for (var key in explosions) {if (explosions[key] != undefined) {// display explosion spritesctx.drawImage(explosions[key].image, explosions[key].sprite*explosions[key].w, 0, explosions[key].w, explosions[key].h, explosions[key].x - explosions[key].w/2, explosions[key].y - explosions[key].h/2, explosions[key].w, explosions[key].h);explosions[key].sprite++;// remove an explosion object when it expiresif (explosions[key].sprite > 10) {delete explosions[key];}}}}// draw enemiesif (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].y -= enemies[ekey].speed;// remove an enemy object if it is out of screenif (enemies[ekey].y > canvas.height) {delete enemies[ekey];}}}}if (enemies.length > 0) {for (var ekey in enemies) {if (enemies[ekey] != undefined) {// collisions with rocketsif (rockets.length > 0) {for (var key in rockets) {if (rockets[key] != undefined) {if (rockets[key].y < enemies[ekey].y + enemies[ekey].h/2 && rockets[key].x > enemies[ekey].x && rockets[key].x + rockets[key].w < enemies[ekey].x + enemies[ekey].w) {explosions.push(new Explosion(enemies[ekey].x + enemies[ekey].w / 2, enemies[ekey].y + enemies[ekey].h / 2, 120, 120, 0, oExplosionImage));// delete enemy, rocket, and add +1 to scoredelete enemies[ekey];delete rockets[key];iScore++;}}}}// collisions with planeif (enemies[ekey] != undefined) {if (plane.y - plane.h/2 < enemies[ekey].y + enemies[ekey].h/2 && plane.x - plane.w/2 < enemies[ekey].x + enemies[ekey].w && plane.x + plane.w/2 > enemies[ekey].x) {explosions.push(new Explosion(enemies[ekey].x + enemies[ekey].w / 2, enemies[ekey].y + enemies[ekey].h / 2, 120, 120, 0, oExplosionImage));// delete enemy and make damagedelete enemies[ekey];iLife -= iDamage;if (iLife <= 0) { // Game overbPause = true;// draw scorectx.font = '38px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Game over, your score: ' + iScore * 10 + ' points', 25, 200);return;}}}}}}// display life and scorectx.font = '14px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Life: ' + iLife + ' / 100', 50, 660);ctx.fillText('Score: ' + iScore * 10, 50, 680);}
}
// Process Pressed Keys function
function processPressedKeys() {if (pressedKeys[37] != undefined) { // 'Left' keyif (iSprPos > 0) {iSprPos--;iMoveDir = -7;}if (plane.x - plane.w / 2 > 10) {plane.x += iMoveDir;}}else if (pressedKeys[39] != undefined) { // 'Right' keyif (iSprPos < 4) {iSprPos++;iMoveDir = 7;}if (plane.x + plane.w / 2 < canvas.width - 10) {plane.x += iMoveDir;}}
}
// Add Enemy function (adds a new enemy randomly)
function addEnemy() {clearInterval(enTimer);var randX = getRand(0, canvas.height - iEnemyH);enemies.push(new Enemy(randX, 0, iEnemyW, iEnemyH, - iEnemySpeed, oEnemyImage));var interval = getRand(1000, 4000);enTimer = setInterval(addEnemy, interval); // loop
}
// Main Initialization
$(function(){canvas = document.getElementById('scene');ctx = canvas.getContext('2d');// load background imagebackgroundImage = new Image();backgroundImage.src = 'images/levelmap.jpg';backgroundImage.onload = function() {}backgroundImage.onerror = function() {console.log('Error loading the background image.');}introImage = new Image();introImage.src = 'images/intro.jpg';// initialization of empty rocketoRocketImage = new Image();oRocketImage.src = 'images/rocket.png';oRocketImage.onload = function() { }// initialization of explosion imageoExplosionImage = new Image();oExplosionImage.src = 'images/explosion.png';oExplosionImage.onload = function() { }// initialization of empty enemyoEnemyImage = new Image();oEnemyImage.src = 'images/enemy.png';oEnemyImage.onload = function() { }// initialization of planevar oPlaneImage = new Image();oPlaneImage.src = 'images/plane.png';oPlaneImage.onload = function() {plane = new Plane(canvas.width / 2, canvas.height - 100, planeW, planeH, oPlaneImage);}$(window).keydown(function (evt){ // onkeydown event handlevar pk = pressedKeys[evt.keyCode];if (! pk) {pressedKeys[evt.keyCode] = 1; // add all pressed keys into array}if (bPause && evt.keyCode == 13) { // in case of Enter buttonbPause = false;// start main animationsetInterval(drawScene, 30); // loop drawScene// and add first enemyaddEnemy();}});$(window).keyup(function (evt) { // onkeyup event handlevar pk = pressedKeys[evt.keyCode];if (pk) {delete pressedKeys[evt.keyCode]; // remove pressed key from array}if (evt.keyCode == 65) { // 'A' button - add a rocketrockets.push(new Rocket(plane.x - 16, plane.y - plane.h, 32, 32, iRocketSpeed, oRocketImage));}if (evt.keyCode == 37 || evt.keyCode == 39) {// revert plane sprite to default positionif (iSprPos > 2) {for (var i = iSprPos; i >= 2; i--) {iSprPos = i;iMoveDir = 0;}} else {for (var i = iSprPos; i <= 2; i++) {iSprPos = i;iMoveDir = 0;}}}});// when intro is ready - display itintroImage.onload = function() {displayIntro(); // Display intro once}
});

In the main initialization the script loads all necessary images (level map, intro screen, rocket, explosion sprite, enemy and plane sprite). Then, in order to handle with multiple pressed keys we have to use Array (pressedKeys) to keep all pressed keys (then, during rendering of the main scene, we will use this array to manipulate with our plane), and finally, once the Intro page is loaded – we display intro screen. One of important moments – handling of multiple pressed keys, look at this code:

在主初始化中,脚本会加载所有必需的图像(关卡地图,简介屏幕,火箭,爆炸精灵,敌人和飞机精灵)。 然后,为了处理多个按下的键,我们必须使用Array(pressedKeys)保留所有按下的键(然后,在渲染主场景期间,我们将使用此数组来操纵平面),最后,一旦简介页面已加载-我们显示简介屏幕。 重要时刻之一–处理多个按下的键,请看以下代码:


var pressedKeys = []; // array of pressed keys
$(window).keydown(function (evt){ // onkeydown event handlevar pk = pressedKeys[evt.keyCode];if (! pk) {pressedKeys[evt.keyCode] = 1; // add all pressed keys into array}
});
$(window).keyup(function (evt) { // onkeyup event handlevar pk = pressedKeys[evt.keyCode];if (pk) {delete pressedKeys[evt.keyCode]; // remove pressed key from array}
});

var pressedKeys = []; // array of pressed keys
$(window).keydown(function (evt){ // onkeydown event handlevar pk = pressedKeys[evt.keyCode];if (! pk) {pressedKeys[evt.keyCode] = 1; // add all pressed keys into array}
});
$(window).keyup(function (evt) { // onkeyup event handlevar pk = pressedKeys[evt.keyCode];if (pk) {delete pressedKeys[evt.keyCode]; // remove pressed key from array}
});

This technique allows us to handle multiple keys. Well, during rendering of the main scene we draw next objects: level background, the main plane, rockets (of our plane), enemies and explosions. Once we hit an enemy – we draw explosion sprite at the last place of the enemy. And finally, our opponents are not harmless, as soon as they touch our plane – they explode and cause damage to our aircraft. And, if our life value is under zero – game over. To implement collisions and explosions, I used the following code:

这种技术使我们可以处理多个键。 好吧,在渲染主场景期间,我们绘制了下一个对象:关卡背景,主平面,(我们飞机的)火箭,敌人和爆炸。 击中敌人后,我们会在敌人的最后一个位置绘制爆炸精灵。 最后,我们的对手一旦碰到我们的飞机就不会受到伤害-爆炸并损坏我们的飞机。 而且,如果我们的生活价值低于零,那就结束游戏。 为了实现碰撞和爆炸,我使用了以下代码:


if (plane.y - plane.h/2 < enemies[ekey].y + enemies[ekey].h/2 && plane.x - plane.w/2 < enemies[ekey].x + enemies[ekey].w && plane.x + plane.w/2 > enemies[ekey].x) {explosions.push(new Explosion(enemies[ekey].x + enemies[ekey].w / 2, enemies[ekey].y + enemies[ekey].h / 2, 120, 120, 0, oExplosionImage));// delete enemy and make damagedelete enemies[ekey];iLife -= iDamage;if (iLife <= 0) { // Game overbPause = true;// draw scorectx.font = '38px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Game over, your score: ' + iScore * 10 + ' points', 25, 200);return;}
}

if (plane.y - plane.h/2 < enemies[ekey].y + enemies[ekey].h/2 && plane.x - plane.w/2 < enemies[ekey].x + enemies[ekey].w && plane.x + plane.w/2 > enemies[ekey].x) {explosions.push(new Explosion(enemies[ekey].x + enemies[ekey].w / 2, enemies[ekey].y + enemies[ekey].h / 2, 120, 120, 0, oExplosionImage));// delete enemy and make damagedelete enemies[ekey];iLife -= iDamage;if (iLife <= 0) { // Game overbPause = true;// draw scorectx.font = '38px Verdana';ctx.fillStyle = '#fff';ctx.fillText('Game over, your score: ' + iScore * 10 + ' points', 25, 200);return;}
}

步骤3.自定义图形 (Step 3. Custom graphics)

敌人.png,爆炸.png,intro.jpg,水平图.jpg,飞机.png,火箭.png (enemy.png, explosion.png, intro.jpg, levelmap.jpg, plane.png, rocket.png)

All used images are available in our package

所有使用的图像都在我们的包装中

现场演示

结论 (Conclusion)

Are you like our new SkyWalker game? :-) I will be glad to see your thanks and comments. Good luck!

您喜欢我们的新SkyWalker游戏吗? :-)很高兴看到您的感谢和评论。 祝好运!

翻译自: https://www.script-tutorials.com/html5-game-development-lesson-10/

HTML5游戏开发–第10课相关推荐

  1. html5游戏开发_HTML5游戏开发–第10课

    html5游戏开发 HTML5 Game Development – Lesson 10 Finally we can continue the series of articles on game ...

  2. html5游戏开发_HTML5游戏开发–第9课

    html5游戏开发 HTML5 Game Development – Lesson 9 Today we continue the series of articles on game develop ...

  3. HTML5游戏开发系列教程5(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...

  4. HTML5游戏开发pdf

    下载地址:网盘下载 迈耶编著的<HTML5游戏开发>共10章,通过10个具体的游戏示例详细介绍HTML5的用法.每章都先列出相关的技术特性并给出了应用的描述,然后讨论了实现这个应用的关键需 ...

  5. CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎

    CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5  2D 渲染引擎,可以用于游戏开发.它是开源的,跨平台的,与现代的浏览器和移动设备兼容.CutJS 提供了一个类似 DOM 树的 ...

  6. html5游戏开发-零基础开发RPG游戏-开源讲座(四)

    了解上三篇的内容请点击: html5[color=rgb(68, 68, 68) !important]游戏开发-零基础开发RPG游戏-开源讲座(一) http://www.html5cn.org/a ...

  7. Html5游戏开发-145行代码完成一个RPG小Demo

    lufy前辈写过<[代码艺术]17行代码的贪吃蛇小游戏>一文,忽悠了不少求知的兄弟进去阅读,阅读量当然是相当的大.今天我不仿也搞一个这样的教程,目地不在于忽悠人,而在于帮助他人. 先看de ...

  8. html5游戏开发-零基础开发《圣诞老人送礼物》小游戏

    开言: 以前lufy前辈写过叫"html5游戏开发-零基础开发RPG游戏"的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识. ...

  9. html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend

    一.前言 本次教程将向大家讲解如何用html5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏. 首先让我们来了解了解如何用html5实现动画,毕竟& ...

最新文章

  1. opencv 一堆算法,图像处理等
  2. 【每周NLP论文推荐】 生成式聊天机器人论文介绍
  3. skype for business server2015部署向导启动服务失败
  4. 面试题汇总---深度学习(图像识别,NLP内容)
  5. 三维图形几何变换算法实验_计算机视觉方向简介 | 深度学习视觉三维重建
  6. Springcloud服务如何在Eureka安全优雅的下线
  7. Java进程与子进程交互
  8. 2022年最新版初级商业数字营销师直通车题库
  9. JavaScript截取文件扩展名
  10. elementUI_drawer踩坑_抽屉关闭问题
  11. 计算机网络拓扑结构功能是,计算机网络拓扑结构
  12. android 网络文件系统,android在手机上的文件系统框架的阐述
  13. 【手机】手机选购指南
  14. 北大青鸟资源管理系统
  15. 【解读】山香科技:互联网从软件革命到移动革命
  16. Java中关于数组的初始化方式
  17. 计算机视觉最新进展概览2021年8月15日到2021年8月21日
  18. matlab使用教训
  19. 洛谷P3386:网络流之二分图匹配,最大流算法
  20. 【2016——-编程语言排行以及优缺点分析】

热门文章

  1. python简单笔试题_python编程简单笔试题
  2. uniapp中字体加粗问题
  3. 计算机设备维修预算申,维修费用申请报告
  4. react脚手架创建项目报错,ReactDOM.render is no longer supported in React 18.
  5. 商城系统建设:如何搭建自己的网上商城平台
  6. 免费css布局和模板集合
  7. 黑莓招聘 BlackBerry Developer Evangelist (based in China)
  8. 会计未来十年发展趋势_CFO眼中未来十年财务变化【值得收藏】
  9. OmniPlan,一款让你爱不释手的项目管理工具
  10. mac系统如何进入系统偏好设置_技巧:5 种迅速定位 Mac「系统偏好设置」选项的方法...