今天翻了翻以前的项目文件夹,发现了当初刚学前端的时候写的一个“小游戏”,遂决定整理到博客。

0、前言

写这个“游戏”是在三年前刚接触HTML+JS还不到三天的时候,纯粹是为了巩固刚学到的基础知识才自己“设计”并一步步的实现了这个“游戏”。只用到了HTML和JS的最基础的内容,碰撞检测等功能也是自己设计的“笨方法”。所以虽然当年在自己那 720P+火狐浏览器 的环境下运行并没有问题,但是如今在新设备跑却发现了在一些 屏幕分辨率+浏览器+放大设置 的组合上碰撞检测功能无法工作。

1、游戏概述

细心的读者可能会发现,在前言中,所有的游戏两字上都被我打上了双引号。没错,因为堂而皇之的称我写的这“玩意”叫游戏,实在是对广大游戏开发人员的不尊重,顶多算个小demo吧。所以被我高大上的标题吸引进来的朋友们可以考虑撤了。。。
整个游戏的内容就是一个小人在不断的向前跑,需要通过跳或二级跳躲开随机生成的方块,存活时间越久,得分越高。

2、代码实现

说好的只是为了巩固前端基础知识,所以以下实现部分以展示基础知识的用法为主。

2.1 游戏数据

首先是游戏界面的宽高以及方块出现的概率:

var BANNER_WIDTH = document.body.clientWidth;
var BANNER_HEIGHT = 100;
var PRB = 1/60; //方块生成的概率,会随游戏时间的增加而增加。

然后是用来储存方块(房子)的队列:

//创建一个队列用于储存房子
var house = [];

当然,跑酷游戏肯定少不了一个奔跑的小人:

var people = {x:BANNER_WIDTH/3,y:BANNER_HEIGHT*9/10,        //x,y为小人的位置。ground:BANNER_HEIGHT*9/10,  //小人的落地地面的位置ground_width:0,         //小人可在房子上行走的距离vy:0,                 //y方向的速度g:1,                    //重力加速度state:1,                 //小人的当前运动形态score:0,                 //当前得分failnum:0,                //失败次数mouseClick:2,             //剩余可连跳次数highest:0,             //最高纪录
}
2.2 功能函数

绘制小人的函数,一个奔跑的小人动画本应该是通过几张图片交替显示来实现。可是既然说了纯HTML+JS,那么,自然就得用代码来画呀!

//绘制小人的函数
function drawPeople(state,ctx){ //state为当前要绘制的小人的运动状态,ctx提供了在canvas上绘画的方法和属性。switch(state){case 1:                       //运动状态1的绘制。ctx.beginPath();ctx.moveTo(people.x,people.y);ctx.lineTo(people.x+9,people.y-20);ctx.lineTo(people.x+18,people.y-15);ctx.lineTo(people.x+12,people.y-6);ctx.moveTo(people.x+9,people.y-20);ctx.lineTo(people.x+12,people.y-37);ctx.arc(people.x+12,people.y-37,2,0,Math.PI*2);ctx.moveTo(people.x+10,people.y-30);ctx.lineTo(people.x+14,people.y-23);ctx.lineTo(people.x+17,people.y-30);ctx.moveTo(people.x+10,people.y-30);ctx.lineTo(people.x+4,people.y-20);ctx.stroke();break;case -1:                  //运动状态-1的绘制ctx.beginPath();ctx.moveTo(people.x-4,people.y-3);ctx.lineTo(people.x+11,people.y-15);ctx.lineTo(people.x+24,people.y-4);ctx.moveTo(people.x+11,people.y-15);ctx.lineTo(people.x+8,people.y-32);ctx.arc(people.x+8,people.y-32,2,0,Math.PI*2);ctx.moveTo(people.x+11,people.y-22);ctx.lineTo(people.x+14,people.y-22);ctx.lineTo(people.x+12,people.y-27);ctx.moveTo(people.x+10,people.y-25);ctx.lineTo(people.x,people.y-15);ctx.stroke();break;//运动状态1和-1交替,形成向前奔跑的动画。}
}

添加房子的函数:

//向队列中添加新的house
function addHouse(){var hus = {x:BANNER_WIDTH,y:BANNER_HEIGHT*9/10,        //初始位置在游戏界面的最右边。height:Math.ceil(Math.random()*5),  //高度一到五随机(向上取整)。width:Math.ceil(Math.random()*4), //宽度一到四随机(向上取整)。}house.push(hus);     //添加到队列。
}

绘制房子的函数:

//绘制house
function drawHouse(ctx){//循环绘制队列里面的每一座房子。for(var i=0;i<house.length;i++){ctx.lineWidth = 2;ctx.fillStyle = "#D8D8D8";ctx.beginPath();ctx.moveTo(house[i].x,house[i].y);ctx.lineTo(house[i].x,house[i].y-house[i].height*10);ctx.lineTo(house[i].x+house[i].width*10,house[i].y-house[i].height*10);ctx.lineTo(house[i].x+house[i].width*10,house[i].y);ctx.closePath();ctx.fill();}//更新house队列状态for(var i=0;i<house.length;i++){house[i].x-=3;  //将所有房子向左移三个像素,以形成人在向前跑的错觉。if(house[i].x<-40){house.shift();   //去掉已经移出屏幕的房子。}}//根据概率确定是否要添加新的房子。if(Math.random()<(PRB)){addHouse();}
}

计算小人运动状态的函数:

//计算小人运动的函数
function runpeople(){//如果小人的y坐标不等于小人此时的地面坐标或小人的y方向速度不等于0,则说明小人正在跳跃动作中,需要计算小人本帧的y坐标。if(people.y!=people.ground||people.vy!=0){ people.y+=people.vy;people.vy+=people.g;people.score++;}else{//否则增加分数并切换小人当前帧的运动状态即可。注:在跳跃动作中是不需要切换运动状态的。people.score+=3;if(people.score%2==0){people.state*=-1;}}//如果小人此时正在方块上,那需要减去当前前进的距离,以便在走过方块时下落。if(people.ground_width>0){people.ground_width-=3;}for(var i=0;i<house.length;i++){//碰撞检测,如果小人的x坐标加20(即小人图像的右边框位置)等于房子的x坐标,则说明此时小人与该房子处于位置交叉状态。//判断三个坐标是因为房子每次右移三个坐标,所以交叉时并不一定刚好和小人的坐标相等。if(house[i].x==people.x+20||house[i].x==people.x+21||house[i].x==people.x+19){//输赢检测,当处于交叉状态时,检测小人的y坐标是否高于房子的高度,若不高于,则小人与房子相撞,游戏失败。if(people.y>BANNER_HEIGHT*9/10-house[i].height*10){//初始化数据//更新最高分if(people.score>people.highest){people.highest=people.score;}PRB=1/60;people.score=0;people.failnum++;var j = house.length;for(var i=0;i<j;i++){house.shift();}break;}//如果小人跳上了房子,那么小人的落地地面就在房子上。if(people.ground>BANNER_HEIGHT*9/10-house[i].height*10){people.ground=BANNER_HEIGHT*9/10-house[i].height*10;//小人在房子上可行走的距离。people.ground_width=house[i].width*10+20;}}}//当小人在房子上可行走的距离小于零时,小人落地的地面重新回到游戏“地面”。if(people.ground_width<=0){people.ground=BANNER_HEIGHT*9/10;}//落地判断,如果落到了地面,则重置连跳次数等数据。if(people.y>=people.ground){people.vy=0;people.y=people.ground;people.mouseClick=2;//console.log(people.score);}//随着分数的增加,游戏难度也相应增加,添加房子的概率越来越大。PRB =(1/60)*(Math.pow(2,(Math.floor(people.score/1000))));//难度上限if(PRB>0.3){PRB=0.3;}
}

监听器

//定义canvas的单击监听器
function cvs_click(){if(people.mouseClick){people.vy=-10;  //跳跃获得y方向向上的10点初速度。people.mouseClick--; //可连跳次数减1.}
}

绘制游戏logo、背景、以及显示游戏数据:

function drawLogo(ctx){var image = new Image();image.onload = function(){ctx.drawImage(image,2,2,191,95);}image.src = "img/personalportfolio.png";ctx.fillStyle = "#FFFFFF";ctx.font = "normal 37px 楷体";ctx.textAlign = "center";ctx.fillText("千里之行 始于足下",BANNER_WIDTH*17/20+20,BANNER_HEIGHT*7/10+5);ctx.fillStyle = "#FFFFFF";ctx.font = "normal 15px 楷体";ctx.textAlign = "center";ctx.fillText("分数:"+people.score.toString(),BANNER_WIDTH/5,BANNER_HEIGHT*3/10);ctx.fillStyle = "#FFFFFF";ctx.font = "normal 15px 楷体";ctx.textAlign = "center";ctx.fillText("最高分:"+people.highest.toString(),BANNER_WIDTH/5,BANNER_HEIGHT*7/10);ctx.fillStyle = "#FFFFFF";ctx.font = "normal 15px 楷体";ctx.textAlign = "center";ctx.fillText("失败次数:"+people.failnum.toString(),BANNER_WIDTH/5,BANNER_HEIGHT*5/10);
}
2.3 游戏动画显示

通过定时调用函数来按帧绘制游戏图像:

window.onload = function(){//设置canvas标签var canvas = document.getElementById("forbanner");canvas.width = BANNER_WIDTH;canvas.height = BANNER_HEIGHT;canvas.addEventListener("mousedown",function(e){cvs_click();});var ctx = canvas.getContext("2d");var intT = setInterval(function(){ctx.clearRect(0,0,BANNER_WIDTH,BANNER_HEIGHT);  //清除上一帧图像。drawHouse(ctx); //绘制当前所有的房子。drawLogo(ctx);runpeople();  //计算小人的运动状态drawPeople(people.state,ctx);  //绘制小人图像},45   //每45ms绘制一帧);
}

3、总结

当时本只是想随便写写,但是,后来由于强迫症发作···硬是从晚上八九点写到了凌晨三四点(刚刚接触前端,debug占了大量的时间),把它变成了一个真正可以玩的“游戏”。所有的实现包括图像在内都纯粹只用到了HTML+JS的最基础内容,虽然游戏本身不具备多少的可玩性,但以巩固基础为目的,还是值得一试的。

纯HTML+JS实现跑酷游戏相关推荐

  1. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

  2. 扫雷html5简单初级,纯原生JS用面向对象class方法实现简易扫雷小游戏

    Demo介绍 纯原生js 实现 且用ES6语法class写的扫雷小游戏:布局为10*10的网格,随机生成10-20个雷. 左键点击扫雷.右键标记该地方有雷.该demo下载下来复制到html文件中直接可 ...

  3. 纯原生JS用面向对象class方法实现简易扫雷小游戏

    Demo介绍 纯原生js 实现 且用ES6语法class写的扫雷小游戏:布局为10*10的网格,随机生成10-20个雷. 左键点击扫雷.右键标记该地方有雷.该demo下载下来复制到html文件中直接可 ...

  4. html五子棋游戏原理讲解,纯JS实现五子棋游戏

    本文实例为大家分享了JS实现五子棋游戏的具体代码,供大家参考,具体内容如下 基本实现方式是表格,当时想用黑白圆棋代替的,但是尺寸没调好,就先上黑白底色了 说一下实现思路,刚开始是想每次落子的时候都把整 ...

  5. 1.Cocos跑酷游戏——List工具篇

    1.List工具篇 2.工具篇 Dictionary 3.工具篇 读取Json文件保存数据 4.资源管理ResourceManager 5.界面层级管理 LayerManager 6.界面管理 UIM ...

  6. 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)

    本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 采用的物理引擎是:Phaser.js 官网地址:http:// ...

  7. pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)

    2D的跑酷游戏有很多,著名的例如Chrome的彩蛋小游戏,手机上的天天酷跑等. 打开Chrome浏览器输入 chrome://dino/,按空格激活彩蛋 这篇文章来分析一下这类横版跑酷游戏的主角奔跑, ...

  8. 蓝图跑酷游戏教学的项目文件

    #虚幻4# 蓝图跑酷游戏教学的项目文件.总有人要这个,其实照着视频做一遍才好,因为工程很多东西体现不出来,功能拆分,编码思路,进度把控什么的都看不出来.连PPT一块发了. 链接: https://pa ...

  9. html css js 实战案例_使用html+css+js实现弹球游戏

    php中文网最新课程 每日17点准时技术干货分享 使用html+css+js实现弹球游戏 代码如下,复制即可使用: <head> <style type="text/css ...

最新文章

  1. QR分解原理与C实现(一般实矩阵)
  2. php的filter input,记一个php://filter和php://input的CTF题
  3. Windows Phone 7 Image Controller: Zoom In, Zoom Out, and Rotate (WP 7 图像控制器:放大,缩小,旋转)...
  4. git 与github 命令行操作与控制
  5. 构建LAMP平台(一)(软件版本:httpd-2.4.16,php-5.6.12,mysql-5.6.26)
  6. 微信小程序第三方服务公司有哪些
  7. 【数据结构与算法】【算法思想】Dijkstra算法
  8. 移动端常用的四个框架
  9. OkHttp之BridgeInterceptor简单分析
  10. AJAX最大的特点以及作用是什么?经典面试题
  11. javascript高级程序设计pdf_Java、C语言、Python、PHP、JavaScript五大编程语言,要学哪个?...
  12. 学妹QQ被盗!我连夜用Python制作密码强度检查器!
  13. ssm学生助学贷款系统毕业设计(附源码、运行环境)
  14. HTTP请求时POST参数到底应该怎么传?
  15. windows快捷键完整版分享
  16. input输入密码的时候调用纯数字键盘和加密,js弹出键盘
  17. python pandas 增加一列_Python Pandas 向DataFrame中添加一行/一列
  18. 【EXCEL VBA】字符函数
  19. OS知识点汇总(考研用)——第二章:进程管理(下)
  20. stm32 外部中断不起作用

热门文章

  1. vue+django2.0.2-rest-framework 生鲜项目(三)
  2. 我是如何在毕业不久只用1年就升为开发组长的?
  3. ppt制作教程与原理介绍(学习记录)
  4. 直播系统源码的基础功能有哪些?
  5. [动态规划]最长公共子序列
  6. OpenCV打开相机
  7. 如何查看谷歌账户的实际消费金额和扣款金额是否一致?
  8. 人人都想买湖景房!湖景房优缺点你知道吗?
  9. 远程linux还原本地bak文件,Linux -- 服务器数据备份恢复策略
  10. 微信小程序01---小程序初始