模仿开发H5游戏,看你有多色

开发记录

前言

之前跟着慕课网学习开发H5小游戏开心鱼,勾起我的兴趣。

在写代码的过程中,不怎么会遇到问题。虽然代码是亲手敲出来的,但是由于并没有对游戏的整体思路,所以并不知道开发与优化的过程。

为了巩固知识,和了解优化的过程。我用了半天时间写出《看你有多色》游戏,(在网上找了一张游戏截图,之后自己写)

由于是第一次自己构思、自己动手的游戏,所以还有很多地方有待完善。

基本界面的实现的过程

就像切图一样,在我找到截图的时候,先利用HTML搭出框架,再用CSS填充样式。

随后是加入JS去实现不同的逻辑与活动。

HTML

我把控制输出信息(得分、倒计时、按钮)与画板(Canvas)分开,这样方便用JS控制。

<div class="message">
    <div class="score" id="score">
        Score:0
    </div>
    <div class="timer">
        <strong id="timer">
            &nbsp;60&nbsp;
        </strong>
    </div>
    <div class="stop">
        <button>暂停</button>
    </div>
</div>

<div class="colorGame">
    <canvas id="canvas" width="500" height="500"></canvas>
</div>

CSS

CSS的实现没什么难度,只是在写的时候发现一个问题:

如果我想把倒计时写成div,并且用display:inline-block;控制其显示为有长宽的矩形时,文字好像脱离了div。原因暂时还没想到,目前的解决方式是改变显示方式。

*{padding: 0;margin: 0;}
.gameView{margin: 0 auto;width: 500px;height: 100px;position: relative;}
.message{margin: 0 auto;width: 500px;height: 100px;background: #D1FFA2;
    margin-top: 20px;}
.score,.timer,.stop{width: 160px;height: 100px;display: inline-block;
    text-align: center;font: 32px/100px "Tahoma";margin-right: -8px;}
.score{background: #00CF95;}
.timer{width: 180px;background: #0098EF;}
.timer strong{color: #fff;margin: 0px auto;background: red;border-radius: 10px;
    font-weight: normal;}
.stop{background: #6D0AD3;}
.stop button{display: inline-block;height: 50px;width: 70px;border: none;
    border-radius: 10px;background: red;color: #fff;
    font: 24px/50px "微软雅黑";box-shadow: 5px 3px #ccc;}

.colorGame{margin: 0 auto;width: 500px;height: 500px;background: #D1FFA2;}

JS

JS的实现比较复杂,我的思路是先通过Canvas画出游戏刚开始的界面。

这里用到了Canvas绘图的函数。我封装了一个绘制圆角矩形的函数,drawRoundRect(),参数依次是绘图环境名称、圆角矩形的X\Y坐标、圆角矩形的半径、填充色。

function drawRoundRect(cxt,x,y,r,radius,fillColor){
    cxt.save();
    cxt.translate(x,y);

    cxt.beginPath();
    cxt.arc(r-radius,r-radius,radius,0,Math.PI/2);
    cxt.lineTo(radius,r);
    cxt.arc(radius,r-radius,radius,Math.PI/2,Math.PI);
    cxt.lineTo(0,radius);
    cxt.arc(radius,radius,radius,Math.PI,Math.PI*3/2);
    cxt.lineTo(r-radius,0);
    cxt.arc(r-radius,radius,radius,Math.PI*3/2,Math.PI*2);
    cxt.lineTo(r,r-radius);
    cxt.closePath();

    cxt.fillStyle = fillColor?fillColor:"black";
    cxt.fill();
    cxt.restore();
}

然后绘制游戏界面,drawGame()。

由于不同等级下的界面并不相同,所以我需要提前设置变量:level[ ](游戏等级分布)、

spacing[ ](不同等级下的方块间距)、squareW[ ](不同等级下的方块边长)。

又因为绘制时需要的参数是X\Y轴坐标,因为可以通过这三个变量算出来,所以我又封装了一个函数rectXY(),传入的参数是方块的位置值。

function rectXY(a){
    return (a+1)*spacing[levelNum]+a*squareW[levelNum];
}

function init(){
    /*MaxLevel : 136*/
    level = [
        2,2,
        3,3,3,
        4,4,4,4,
        5,5,5,5,5,5,5,5,5,5,
        6,6,6,6,6,6,6,6,6,6,6,6,
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,
        8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
        9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
        10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
        10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10];
    for (var i = 0; i < level.length; i++) {
        spacing[i] = level[i]*(-2)+24;
    }
    for (var i = 0; i < level.length; i++) {
        squareW[i] = Math.floor((w-(level[i]+1)*(level[i]*(-2)+24))/level[i]);
    }
}

function drawGame(levelNum){
    //画背景
    drawRoundRect(context,0,0,500,8,"#D1FFA2");
    //画方块
    for (var i = 0; i < level[levelNum]; i++){
        for (var j = 0; j < level[levelNum]; j++){
            drawRoundRect(context,rectXY(i),rectXY(j),squareW[levelNum],6,formerColor);
        }
    }
    drawRoundRect(context,rectXY(differentX),rectXY(differentY),squareW[levelNum],6,differentColor);
    canvas.addEventListener(‘click‘,detect);
}

这样基本的界面就已经画好了。

交互逻辑的实现

这个游戏的交互活动很简单,仅仅是需要添加点击的监听事件。

难点在于,Canvas是DOM对象,监听时获取到的结果是对整个Canvas的点击效果(Canvas内部的图样是没有办法独立的被监听)。

解决的逻辑是:先获取鼠标的坐标值,然后用isPointInPath()判断当前坐标是否在当前绘制路径内部。

  • canvas对象有一个方法getBoundClientRect(),返回的是canvas元素的边界框对象, 此对象的left与top属性即为canvas左上角点相对窗口的坐标,将事件坐标与canvas坐标相减,得到相对于canvas的坐标。
var x = event.clientX - canvas.getBoundingClientRect().left;
var y = event.clientY - canvas.getBoundingClientRect().top;
  • 获取后再进行判断是否在图形内。
if(context.isPointInPath(x,y)){}
  • 由于绘制差异方块时还需要注意颜色相近,所以我设置了一个数组,用于计算RGB模式下的颜色差值,差值越来越小是因为关卡难度上升导致颜色更加相近。
badNum = [38,28,18,12,10,8,6,4,3,2];

具体的实现方法,包含之前的监听与判断,还有随机色与之相近色的获取和统计分数并更新。

function scoreNum(){
    var scoreObj = document.getElementById("score");
    score++;
    scoreObj.innerHTML = "Score:"+score;
}

 function detect(event){
    var x = event.clientX - canvas.getBoundingClientRect().left;
    var y = event.clientY - canvas.getBoundingClientRect().top;

    drawRoundRect(context,rectXY(differentX),rectXY(differentY),squareW[levelNum],6,differentColor);

    if(context.isPointInPath(x,y)){
        levelNum++;
        differentX = Math.floor(Math.random()*level[levelNum]);
        differentY = Math.floor(Math.random()*level[levelNum]);
        R = Math.floor(Math.random()*255);
        G = Math.floor(Math.random()*255);
        B = Math.floor(Math.random()*255);
        formerColor = "rgb("+R+","+G+","+B+")";
        nR = R+badNum[0];
        nG = G+badNum[0];
        nB = B+badNum[0];
        differentColor = "rgb("+nR+","+nG+","+nB+")";
        context.clearRect(0,0,500,500);
        drawGame(levelNum);
        scoreNum();
    }
}

汇总

  • 总的来说这个游戏并不复杂,稍微有一些不一样的地方就是对Canvas添加监听事件时,与对DOM添加事件相比更麻烦一点。
  • 暂时来说没有卡住的地方,但是存在一个很大的问题:这个程序并没有体现面向对象的思想,二次浏览的时候会感到逻辑混乱。
  • 还有一些小功能并没有添加进去:

    1.没有暂停功能。

    2.没有GameOver后的提示功能。

时间: 2024-11-03 22:18:24

模仿开发H5游戏,看你有多色的相关文章

用canvas开发H5游戏小记

自神经猫风波之后,微信中的各种小游戏如雨后春笋般目不暇接,这种低成本,高效传播的案例很是受开发者青睐.作为一名前端,随手写个这样的小游戏出来应该算是必备技能吧.恰逢中秋节,部门决定上线一个小游戏,在微信里传播一下与用户互动互动.这任务自然落在了我头上.前段时间用DOM+CSS3写了个小游戏,在Android机器上巨卡无比,有了上次的经验,这次决定用canvas来写.其实这些小游戏在业界也都是canvas来做,已经有很成熟的技术和框架,由于不会频繁修改DOM树,所有的动画都是在一块画布上完成,所以

白鹭引擎开发H5游戏(项目结构)

孙广东   2016.12.8 http://blog.csdn.net/u010019717 主要使用 EgretWing  (是白鹭扩展的 VisualStudio Code) 新建 项目中  选择 生成的项目的结构: src 是TypeScript源码目录 resource 是我们项目中的资源路径,一般我们把图片音频等素材放置asset目录下,json等配置文件放置config目录下,default.res.json是我们用于加载资源的json配置文件,一般不修改名字,后面会讲到怎么使用.

HTML5小游戏——看你有多色

使用了封装了canvas的create.js库来实现的. 最终效果: 工程: Rect.js /* * 方块类 */ function Rect(n,color,specialColor){ createjs.Shape.call(this); /** * 设置方块的类型 */ this.setRectType=function(type){ this._RectType=type; switch(type){ case 1: this.setColor(color); break; case

开发H5牛牛大厅游戏引擎的选择:Egret或Laya?

Q1446595067官网:h5.haozibbs.com一.H5游戏开发的引擎介绍 开发H5游戏的引擎有很多,比如egret.laya.cocos-js等等.这里主要是分析的是egret和laya,因为我们团队是从as3转过来的.所以天然地在有as3基因的egret和laya之中挑选一个. Egret Egret Framework是一款使用JavaScript(TypeScript)编写的HTML5开源免费游戏框架.核心定位是开放,高效,优雅.基于它,你可以快速轻松地构建属于自己的HTML5

H5游戏:碎片时间的生意经

在技术上逐步拉近和手机App游戏.PC端网页游戏.客户端游戏之间的距离,逐步发挥自己跨屏的优势,并让自身的内容不再受限于极简小游戏范畴,才可以逐步延长玩家的游戏时间和黏合度,自然收益模式也就慢慢和其他游戏类型趋同并稳定.在业内,对于H5游戏的未来,观点已经趋于一致. 文/张书乐 刊载于<互联网经济>杂志2014年11月刊,刊载时有删节 整个夏季,微信朋友圈被一只表情很欠.身材妖娆的猫无情"刷屏"了."我用了11步围住神经猫,击败89%的人,你能超过我吗?"

最近这两天看了关于H5游戏开发的一个教程,实践很短暂,看了很多理论的东西,现在呢也只是想回忆回忆关于EUI的部分知识吧

首先我了解了什么是Egret: Egret中文就是白鹭的意思,Egret是一套H5游戏开发的软件.(纯粹属于个人理解) 其次我对以下几款软件的相关知识做了些了解: Egret Engine(引擎),Egret Wing(编辑器),Texture Merger(可将零散纹理拼合为整图,同时也可以解析SWF.GIF动画,导出可供Egret使用的配置文件),Egret Feather(是一款粒子效果编辑器)ResDepot(是针对资源配置文件的创建,编辑和管理工具)等.......ps:现在我只看了这

今天我看了一个H5游戏EUI的例子,我都快分不清我到底是在用什么语言编译了代码了,作为刚刚学习H5游戏开发的菜鸟只能默默的收集知识

今天看了一个EUI的demo,也是接触H5游戏开发的第五天了,我想看看我能不能做点什么出来,哎,自己写果然还是有问题的.在看EUI哪一个demo的时候就遇见了一些摇摆不定的问题,我觉得提出来 1.toast 当时看见它的时候我不确定是不是我以为的那样,所以就百度了一下,果然它就是我印象中android里面的一种显示信息的机制.(ps:真的是一门汇聚大千语言的技术啊)toast是没有焦点的而且toast显示的时间有限,过一会儿就会自动消失.toast主要用于向用户显示提示消息.项目中它用了一个To

H5游戏开发之抓住小恐龙

第一次写技术性博文,以前都只是写一些生活感想,记录一些生活发生的事情. 博主大三学生一枚,目前学习JS一年多,还处于学习阶段,有什么说的不好的希望大牛指点下,由于第一次写博文,排版什么的有待改进,希望大家谅解. 这是我学习H5 canvas以来写的第一个游戏,第一次接触H5游戏呢,是看了一位大哥码农终结者的博客(http://www.cnblogs.com/chaogex/)(基础要求有点高,等以后一定要研究透彻),正好实验室老师准备喊我写H5的游戏游戏,看了很多canvas的API和大神vaj

H5游戏开发的那些坑(一) 客户端

[客户端] 1.关于游戏引擎 在15年3月开始准备做h5游戏的时候,首先遇到的问题就是引擎选型的问题. 当时市面上的2d引擎主要有3个:白鹭egret,layabox和cocos2d-js. 一方面,是因为我以前用cocos2d-x(c++)做了一年多的手游客户端,所以,很自然就选择了cocos2d-js.另一方面,是因为当时市面上其他两个引擎的成功项目还不多. cocos引擎的每一次版本更新,我们都会第一时间在我们的游戏里面进行测试. 如果发现游戏在android手机上的性能有明显提升,我们就