JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

// RequestAnimFrame: a browser API for getting smooth animations

window.requestAnimFrame = (function() {

return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||

function(callback) {

window.setTimeout(callback, 1000 / 60);

};

})();

var canvas = document.getElementById('canvas'),

ctx = canvas.getContext('2d');

var width = 422,

height = 552;

canvas.width = width;

canvas.height = height;

//Variables for game

var platforms = [],

image = document.getElementById("sprite"),

player, platformCount = 10,

position = 0,

gravity = 0.2,

animloop,

flag = 0,

menuloop, broken = 0,

dir, score = 0,

firstRun = true;

//Base object

var Base = function() {

this.height = 5;

this.width = width;

//Sprite clipping

this.cx = 0;

this.cy = 614;

this.cwidth = 100;

this.cheight = 5;

this.moved = 0;

this.x = 0;

this.y = height - this.height;

this.draw = function() {

try {

ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);

} catch (e) {}

};

};

var base = new Base();

//Player object

var Player = function() {

this.vy = 11;

this.vx = 0;

this.isMovingLeft = false;

this.isMovingRight = false;

this.isDead = false;

this.width = 55;

this.height = 40;

//Sprite clipping

this.cx = 0;

this.cy = 0;

this.cwidth = 110;

this.cheight = 80;

this.dir = "left";

this.x = width / 2 - this.width / 2;

this.y = height;

//Function to draw it

this.draw = function() {

try {

if (this.dir == "right") this.cy = 121;

else if (this.dir == "left") this.cy = 201;

else if (this.dir == "right_land") this.cy = 289;

else if (this.dir == "left_land") this.cy = 371;

ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);

} catch (e) {}

};

this.jump = function() {

this.vy = -8;

};

this.jumpHigh = function() {

this.vy = -16;

};

};

player = new Player();

//Platform class

function Platform() {

this.width = 70;

this.height = 17;

this.x = Math.random() * (width - this.width);

this.y = position;

position += (height / platformCount);

this.flag = 0;

this.state = 0;

//Sprite clipping

this.cx = 0;

this.cy = 0;

this.cwidth = 105;

this.cheight = 31;

//Function to draw it

this.draw = function() {

try {

if (this.type == 1) this.cy = 0;

else if (this.type == 2) this.cy = 61;

else if (this.type == 3 && this.flag === 0) this.cy = 31;

else if (this.type == 3 && this.flag == 1) this.cy = 1000;

else if (this.type == 4 && this.state === 0) this.cy = 90;

else if (this.type == 4 && this.state == 1) this.cy = 1000;

ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);

} catch (e) {}

};

//Platform types

//1: Normal

//2: Moving

//3: Breakable (Go through)

//4: Vanishable

//Setting the probability of which type of platforms should be shown at what score

if (score >= 5000) this.types = [2, 3, 3, 3, 4, 4, 4, 4];

else if (score >= 2000 && score < 5000) this.types = [2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4];

else if (score >= 1000 && score < 2000) this.types = [2, 2, 2, 3, 3, 3, 3, 3];

else if (score >= 500 && score < 1000) this.types = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];

else if (score >= 100 && score < 500) this.types = [1, 1, 1, 1, 2, 2];

else this.types = [1];

this.type = this.types[Math.floor(Math.random() * this.types.length)];

//We can't have two consecutive breakable platforms otherwise it will be impossible to reach another platform sometimes!

if (this.type == 3 && broken < 1) {

broken++;

} else if (this.type == 3 && broken >= 1) {

this.type = 1;

broken = 0;

}

this.moved = 0;

this.vx = 1;

}

for (var i = 0; i < platformCount; i++) {

platforms.push(new Platform());

}

//Broken platform object

var Platform_broken_substitute = function() {

this.height = 30;

this.width = 70;

this.x = 0;

this.y = 0;

//Sprite clipping

this.cx = 0;

this.cy = 554;

this.cwidth = 105;

this.cheight = 60;

this.appearance = false;

this.draw = function() {

try {

if (this.appearance === true) ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);

else return;

} catch (e) {}

};

};

var platform_broken_substitute = new Platform_broken_substitute();

//Spring Class

var spring = function() {

this.x = 0;

this.y = 0;

this.width = 26;

this.height = 30;

//Sprite clipping

this.cx = 0;

this.cy = 0;

this.cwidth = 45;

this.cheight = 53;

this.state = 0;

this.draw = function() {

try {

if (this.state === 0) this.cy = 445;

else if (this.state == 1) this.cy = 501;

ctx.drawImage(image, this.cx, this.cy, this.cwidth, this.cheight, this.x, this.y, this.width, this.height);

} catch (e) {}

};

};

var Spring = new spring();

function init() {

//Variables for the game

var dir = "left",

jumpCount = 0;

firstRun = false;

//Function for clearing canvas in each consecutive frame

function paintCanvas() {

ctx.clearRect(0, 0, width, height);

}

//Player related calculations and functions

function playerCalc() {

if (dir == "left") {

player.dir = "left";

if (player.vy < -7 && player.vy > -15) player.dir = "left_land";

} else if (dir == "right") {

player.dir = "right";

if (player.vy < -7 && player.vy > -15) player.dir = "right_land";

}

//Adding keyboard controls

document.onkeydown = function(e) {

var key = e.keyCode;

if (key == 37) {

dir = "left";

player.isMovingLeft = true;

} else if (key == 39) {

dir = "right";

player.isMovingRight = true;

}

if (key == 32) {

if (firstRun === true)

init();

else

reset();

}

};

document.onkeyup = function(e) {

var key = e.keyCode;

if (key == 37) {

dir = "left";

player.isMovingLeft = false;

} else if (key == 39) {

dir = "right";

player.isMovingRight = false;

}

};

//Accelerations produces when the user hold the keys

if (player.isMovingLeft === true) {

player.x += player.vx;

player.vx -= 0.15;

} else {

player.x += player.vx;

if (player.vx < 0) player.vx += 0.1;

}

if (player.isMovingRight === true) {

player.x += player.vx;

player.vx += 0.15;

} else {

player.x += player.vx;

if (player.vx > 0) player.vx -= 0.1;

}

// Speed limits!

if (player.vx > 8)

player.vx = 8;

else if (player.vx < -8)

player.vx = -8;

//console.log(player.vx);

//Jump the player when it hits the base

if ((player.y + player.height) > base.y && base.y < height) player.jump();

//Gameover if it hits the bottom

if (base.y > height && (player.y + player.height) > height && player.isDead != "lol") player.isDead = true;

//Make the player move through walls

if (player.x > width) player.x = 0 - player.width;

else if (player.x < 0 - player.width) player.x = width;

//Movement of player affected by gravity

if (player.y >= (height / 2) - (player.height / 2)) {

player.y += player.vy;

player.vy += gravity;

}

//When the player reaches half height, move the platforms to create the illusion of scrolling and recreate the platforms that are out of viewport...

else {

platforms.forEach(function(p, i) {

if (player.vy < 0) {

p.y -= player.vy;

}

if (p.y > height) {

platforms[i] = new Platform();

platforms[i].y = p.y - height;

}

});

base.y -= player.vy;

player.vy += gravity;

if (player.vy >= 0) {

player.y += player.vy;

player.vy += gravity;

}

score++;

}

//Make the player jump when it collides with platforms

collides();

if (player.isDead === true) gameOver();

}

//Spring algorithms

function springCalc() {

var s = Spring;

var p = platforms[0];

if (p.type == 1 || p.type == 2) {

s.x = p.x + p.width / 2 - s.width / 2;

s.y = p.y - p.height - 10;

if (s.y > height / 1.1) s.state = 0;

s.draw();

} else {

s.x = 0 - s.width;

s.y = 0 - s.height;

}

}

//Platform's horizontal movement (and falling) algo

function platformCalc() {

var subs = platform_broken_substitute;

platforms.forEach(function(p, i) {

if (p.type == 2) {

if (p.x < 0 || p.x + p.width > width) p.vx *= -1;

p.x += p.vx;

}

if (p.flag == 1 && subs.appearance === false && jumpCount === 0) {

subs.x = p.x;

subs.y = p.y;

subs.appearance = true;

jumpCount++;

}

p.draw();

});

if (subs.appearance === true) {

subs.draw();

subs.y += 8;

}

if (subs.y > height) subs.appearance = false;

}

function collides() {

//Platforms

platforms.forEach(function(p, i) {

if (player.vy > 0 && p.state === 0 && (player.x + 15 < p.x + p.width) && (player.x + player.width - 15 > p.x) && (player.y + player.height > p.y) && (player.y + player.height < p.y + p.height)) {

if (p.type == 3 && p.flag === 0) {

p.flag = 1;

jumpCount = 0;

return;

} else if (p.type == 4 && p.state === 0) {

player.jump();

p.state = 1;

} else if (p.flag == 1) return;

else {

player.jump();

}

}

});

//Springs

var s = Spring;

if (player.vy > 0 && (s.state === 0) &&

(player.x + 15 < s.x + s.width) &&

(player.x + player.width - 15 > s.x) &&

(player.y + player.height > s.y) &&

(player.y + player.height < s.y + s.height)) {

s.state = 1;

player.jumpHigh();

}

}

function updateScore() {

var scoreText = document.getElementById("score");

scoreText.innerHTML = score;

}

function gameOver() {

platforms.forEach(function(p, i) {

p.y -= 12;

});

if (player.y > height / 2 && flag === 0) {

player.y -= 8;

player.vy = 0;

} else if (player.y < height / 2) flag = 1;

else if (player.y + player.height > height) {

showGoMenu();

hideScore();

player.isDead = "lol";

var tweet = document.getElementById("tweetBtn");

tweet.href = 'http://techbrood.com/?q=game';

}

}

//Function to update everything

function update() {

paintCanvas();

platformCalc();

springCalc();

playerCalc();

player.draw();

base.draw();

updateScore();

}

menuLoop = function() {

return;

};

animloop = function() {

update();

requestAnimFrame(animloop);

};

animloop();

hideMenu();

showScore();

}

function reset() {

hideGoMenu();

showScore();

player.isDead = false;

flag = 0;

position = 0;

score = 0;

base = new Base();

player = new Player();

Spring = new spring();

platform_broken_substitute = new Platform_broken_substitute();

platforms = [];

for (var i = 0; i < platformCount; i++) {

platforms.push(new Platform());

}

}

//Hides the menu

function hideMenu() {

var menu = document.getElementById("mainMenu");

menu.style.zIndex = -1;

}

//Shows the game over menu

function showGoMenu() {

var menu = document.getElementById("gameOverMenu");

menu.style.zIndex = 1;

menu.style.visibility = "visible";

var scoreText = document.getElementById("go_score");

scoreText.innerHTML = "You scored " + score + " points!";

}

//Hides the game over menu

function hideGoMenu() {

var menu = document.getElementById("gameOverMenu");

menu.style.zIndex = -1;

menu.style.visibility = "hidden";

}

//Show ScoreBoard

function showScore() {

var menu = document.getElementById("scoreBoard");

menu.style.zIndex = 1;

}

//Hide ScoreBoard

function hideScore() {

var menu = document.getElementById("scoreBoard");

menu.style.zIndex = -1;

}

function playerJump() {

player.y += player.vy;

player.vy += gravity;

if (player.vy > 0 &&

(player.x + 15 < 260) &&

(player.x + player.width - 15 > 155) &&

(player.y + player.height > 475) &&

(player.y + player.height < 500))

player.jump();

if (dir == "left") {

player.dir = "left";

if (player.vy < -7 && player.vy > -15) player.dir = "left_land";

} else if (dir == "right") {

player.dir = "right";

if (player.vy < -7 && player.vy > -15) player.dir = "right_land";

}

//Adding keyboard controls

document.onkeydown = function(e) {

var key = e.keyCode;

if (key == 37) {

dir = "left";

player.isMovingLeft = true;

} else if (key == 39) {

dir = "right";

player.isMovingRight = true;

}

if (key == 32) {

if (firstRun === true) {

init();

firstRun = false;

} else

reset();

}

};

document.onkeyup = function(e) {

var key = e.keyCode;

if (key == 37) {

dir = "left";

player.isMovingLeft = false;

} else if (key == 39) {

dir = "right";

player.isMovingRight = false;

}

};

//Accelerations produces when the user hold the keys

if (player.isMovingLeft === true) {

player.x += player.vx;

player.vx -= 0.15;

} else {

player.x += player.vx;

if (player.vx < 0) player.vx += 0.1;

}

if (player.isMovingRight === true) {

player.x += player.vx;

player.vx += 0.15;

} else {

player.x += player.vx;

if (player.vx > 0) player.vx -= 0.1;

}

//Jump the player when it hits the base

if ((player.y + player.height) > base.y && base.y < height) player.jump();

//Make the player move through walls

if (player.x > width) player.x = 0 - player.width;

else if (player.x < 0 - player.width) player.x = width;

player.draw();

}

function update() {

ctx.clearRect(0, 0, width, height);

playerJump();

}

menuLoop = function() {

update();

requestAnimFrame(menuLoop);

};

menuLoop();

html跳一跳小游戏,HTML5涂鸦跳跃(Doodle Jump)小游戏相关推荐

  1. html5抢红包游戏,HTML5手机微信抢红包福利袋游戏代码

    HTML5手机微信抢红包福利袋游戏代码 HTML5手机微信抢红包福利袋游戏代码是一款手机移动端红包雨效果源码. js代码 $(function(){ var countdown=$(".co ...

  2. 基于HTML5canvars的小游戏,HTML5之canvas简单射箭小游戏

    最近折腾一个自己个人主页,无奈履历太渣,能放在首页的东西不多,于是想给自己的个人主页上添加一个小游戏.遂参考了各种教程,使用HTML5的canvas元素做了一个相当原始的东西出来,效果如图~ QQ截图 ...

  3. 迷宫游戏html5代码,css3实现的迷宫游戏

    css3实现的迷宫游戏_网页代码站(www.webdm.cn) *{margin:0px;padding:0px;} body{background:#b1b1b1;margin:0px;paddin ...

  4. HTML5中canvas实现拼图游戏,HTML5 Canvas学习笔记(6)拼图游戏(数字版)

    今天网上发现了一段代码,只有界面,很不错,学习了并完成了逻辑. 效果图: 点击这里试玩 http://www.108js.com/article/canvas/6/play.html 欢迎访问博主的网 ...

  5. Android 仿doodle jump小游戏

    这个游戏的逻辑主要在上升和下降以及触碰原理 图片: 4eb3cc2601e30b38736028f1ed4ba31.jpg 20190523_094047.gif 没有做开始游戏 暂停游戏 和结束游戏 ...

  6. 物品分类游戏html5,整理物品的幼儿园分类游戏设计

    整理物品的幼儿园分类游戏设计 设计思路: 在生活中,人们常需要将一些材料.物品进行收拾.整理,而学习收拾.整理物品对于中班幼儿来说就是一个学习分类的过程.让幼儿为分类并整理好的物品制作标记,能使幼儿对 ...

  7. 涂鸦跳跃 java,涂鸦跳跃java

    你好,我是[心事会变成天上的星星],很高兴为你解答.涂鸦跳跃(Doodle Jump),是一个富有趣味的技巧性游戏,左右倾斜你的手机让涂鸦弹簧小怪物不停地往上跳跃而不掉下来,在跳跃中要小心破碎的平台. ...

  8. “跳一跳”小游戏这么火爆,它是如何做的设计和开发?

    2018 伊始,最火爆的不是春晚和红包,而是从天而降的"跳一跳".这款来自微信的轻量级小游戏,以 2800 万人 / 小时的惊人 PCU 数据,稳据小游戏排行榜首位.如果你还不了解 ...

  9. 基于h5的跳一跳游戏的开发与实现_「南宁小程序开发」企业开发小程序有哪些好处?...

    现如今微信小程序成为了许多企业推广自身产品的一个平台,为什么他们会选择小程序呢?小程序到底有哪些好处?接下来,南宁小程序开发公司--视点网络告诉您开发小程序的好处有哪些. 轻量性:平时APP的转化过程 ...

最新文章

  1. 浅谈android的selector,背景选择器
  2. 按装oracle后 eclips提示jvm版本太低的问题
  3. FromBottomToTop团队项目总结
  4. Java中toString函数干嘛用?
  5. java 倒序分页_翻动100万级的数据(自定义的MSSQL分页查询过程)
  6. 【黑客帝国数字雨屏保】基于Win32的黑客帝国数字雨屏幕保护程序(附VS工程代码文件和可执行文件)
  7. python字典替换值_python字典改变value值方法总结
  8. 001 java_001Java开发环境
  9. markdown不允许还有人不会
  10. RabbitMQ的基本概念
  11. HDU 1695 GCD ★(容斥原理+欧拉函数)
  12. 讲道理 | 三维高斯积分公式
  13. Android Title标题栏的修改(隐藏,菜单)
  14. 实时网速怎么看快慢_怎么测试下载速度(教你安全检测网速快慢)
  15. 《Robust Consistent Video Depth Estimation》论文笔记
  16. python画图旋转图形_python简单实现旋转图片的方法
  17. mac pro M1(ARM)安装:ubuntu桌面版虚拟机(五)
  18. 计量经济学及Stata应用 第七章 异方差
  19. linux删除 0 字节文件,如何恢复 Linux 上删除的文件
  20. 【MIMO】两种空间相关信道生成方式的记录(公式+MATLAB代码)

热门文章

  1. 【Go】用 Go 访问 Redis
  2. hello world漫游
  3. Ntp校时客户端小工具
  4. 2020年年终总结_By 吾方羡
  5. 实验室方法检出限和定量限标准做法
  6. 【献计一刻】软件开发小工的学习和工作清单
  7. 创维电视android,当贝市场创维酷开专用版
  8. 计算机考试文科生报什么专业好就业,文科生也能报考理工科专业?这4个专业不仅能报考,毕业前景大好...
  9. 基因数据处理88之vcf2omim得到omim和dbSnpId信息
  10. 判断是否是回文字符串两种方法