精华内容
下载资源
问答
  • canvas小游戏

    2018-03-26 20:29:59
    canvas制作的小游戏,全面实现教学效果,公司自己研发框架,欢迎各位下载.
  • canvas小游戏-爱心鱼

    2018-02-27 11:30:35
    前端canvas小游戏-爱心鱼,大鱼吃到水中的浮游生物后喂给小鱼吃,维持小鱼生存。
  • canvas小游戏 启动 clone项目到本地,执行node server.js打开 localhost:8899 查看 直接访问 操作 上下左右方向键移动 点击【提示】答案可以查看答案路线 点击【重来】可以重新游戏
  • canvas小游戏-连连看

    2016-12-02 16:04:58
    js 小游戏 canvas版连连看 内置20张地图 图片素材来源于网络 仅限学习使用 js 小游戏 canvas版连连看 内置20张地图 图片素材来源于网络 仅限学习使用
  • 个人练手用的,很多东西都是瞎写的,看看就好
  • 见缝插针 一个canvas小游戏

    千次阅读 2017-12-01 10:10:36
    一个canvas小游戏 https://github.com/Web-ZhangJian/jianfengchazhen JavaScript代码: var canvas=document.querySelector("#canvas"); var ctx=canvas.getContext("2d"); var centerX = 400;//大圆X轴坐标 var ...

    一个canvas小游戏

    https://github.com/Web-ZhangJian/jianfengchazhen

    JavaScript代码:
    var canvas=document.querySelector("#canvas");
    var ctx=canvas.getContext("2d");
    var centerX = 400;//大圆X轴坐标
    var centerY = 200;//大圆Y轴坐标
    var bigRadius = 50;// 大圆半径
    var smallRadius = 10;//小球半径
    var line = 100;//线条的长度
    var balls = [];//定义一个用于存储转动小球数组 =  {'angle':120,numStr:''}
    var waitBalls = [];//定义一个用于存储等待小球数组
    //游戏模拟数据
    var level;//定义游戏关卡
    //重置关卡
    var re=document.querySelector("#reset");
    re.οnclick=function(){
        window.location.href = "index.html#"+0;
    };
    if(parseInt(window.location.href.split("#")[1])){
        level = parseInt(window.location.href.split("#")[1]);
        console.log(level);
    }else{
        level = 0;
    }
    var levelArr=[          //设置关卡  ballNum转动小球  waitNum等待小球  speed速度
        {"ballNum":3, "waitNum":5, "speed":1},
        {"ballNum":4, "waitNum":8, "speed":1},
        {"ballNum":5, "waitNum":5, "speed":1},
        {"ballNum":6, "waitNum":8, "speed":1},
        {"ballNum":7, "waitNum":10, "speed":1},
        {"ballNum":8, "waitNum":12, "speed":1},
        {"ballNum":9, "waitNum":15, "speed":1},
        {"ballNum":10, "waitNum":18, "speed":1},
        {"ballNum":5, "waitNum":8, "speed":2},
        {"ballNum":6, "waitNum":10, "speed":2},
        {"ballNum":7, "waitNum":12, "speed":2},
        {"ballNum":6, "waitNum":8, "speed":3},
        {"ballNum":7, "waitNum":10, "speed":3},
        {"ballNum":8, "waitNum":12, "speed":3},
        {"ballNum":9, "waitNum":14, "speed":3}
    ];
    var ballNum = levelArr[level].ballNum;//定义转动小球数量
    var waitNum = levelArr[level].waitNum;//定义等待小球数量
    var speed=levelArr[level].speed;//定义旋转速度  用以控制游戏难度
    //定义全局的画笔样式
    ctx.textAlign="center";//水平居中
    ctx.textBaseline="middle";//垂直居中


    function drawBig(){
        //绘制大圆
        ctx.beginPath();
        ctx.arc(centerX,centerY,bigRadius,0,Math.PI*2);
        ctx.closePath();
        ctx.fillStyle="#000";
        ctx.fill();
        //绘制关卡数
        ctx.fillStyle="#fff";
        ctx.font = "50px 微软雅黑";
        ctx.fillText(level+1,centerX,centerY);
    }


    //小球转动数据
        for(var i=0;i<ballNum;i++){
            var angle=360/ballNum*i;
            balls.push({
                angle:angle,
                numStr:''
            })
        }


    //整体旋转
    function drawBalls(){
        ctx.save();
        ctx.clearRect(200,20,400,350);
        drawBig();
        ctx.translate(centerX,centerY);//设置圆心位置
        //绘制转动小球
        balls.forEach(function(item){//通过循环遍历绘制小球,item 为数组每次遍历的元素
            ctx.save();//保存
            //旋转
            ctx.rotate(Math.PI/180*item.angle);
            item.angle+=speed;//增加角度   用以控制游戏难度
            if(item.angle>=360)item.angle=item.angle-360;//角度恢复
            //绘制小球线条
            ctx.beginPath();
            ctx.moveTo(0,-bigRadius);
            ctx.lineTo(0,-(bigRadius+line));
            ctx.stroke();
            ctx.closePath();
            //绘制小球
            ctx.beginPath();
            ctx.fillStyle="#000";
            ctx.arc(0,-(bigRadius+line),smallRadius,0,Math.PI*2);
            ctx.fill();
            ctx.closePath();
            //绘制数字
            if(item.numStr!=''){
                ctx.fillStyle="#fff";
                ctx.font="12px 微软雅黑";
                ctx.fillText(item.numStr,0,-(bigRadius+line));
            }
            ctx.restore();//恢复
        });
        ctx.restore();
        window.requestAnimationFrame(drawBalls);
    }
    drawBalls();


    //小球储存信息
        for(var i=waitNum;i>0;i--){
            waitBalls.push({
                angle:'',
                numStr:i
            })
        }


    //绘制等待小球
    function drawWaitBalls(){
        //清空等待小球区域位置
        ctx.clearRect(390,350,20,450);
        //等待的小球
        waitBalls.forEach(function(item,index){//通过循环遍历绘制小球,item 为数组每次遍历的元素 index是索引值
            ctx.save();//保存
            //位移
            ctx.translate(0,30*index);
            //绘制等待小球
            ctx.beginPath();
            ctx.fillStyle="#000";
            ctx.arc(centerX,centerY+200,smallRadius,0,Math.PI*2);
            ctx.fill();
            ctx.closePath();
            ctx.fillStyle="#fff";
            ctx.font = "12px 微软雅黑";
            ctx.fillText(item.numStr,centerX,centerY+200);
            ctx.restore();
        });
    }
    drawWaitBalls();


    //canvas 点击事件
    var gameOver=false;
    canvas.οnclick=function(){
        //删除等待小球,并且把删除的小球插入到转动小球的末尾处
        var obj = waitBalls.shift();
        //更改小球的角度
        obj.angle=180;
        //通过循环判断小球是否被撞
        for(var i=0;i<balls.length;i++){
            //console.log(balls[i].angle);
            if(balls[i].angle>=172.4&&balls[i].angle<=187.6){
                gameOver=true;
                break;
            }
        }
        //如果等待小球撞到旋转小球,游戏就结束
        if(gameOver){
            alert('闯关失败');
            //重置当前关卡
            window.location.href = "index.html#"+level;
            gameOver=false;
        }else if(waitBalls.length==0){
            alert('成功过关');
            level++;
            if(level>=levelArr.length)alert('通关');
            window.location.href = "index.html#"+level;
            //drawBalls();
            //drawWaitBalls();
            //location.reload();//重新加载页面  刷新
        }
        //将删除的小球插入
        balls.push(obj);
        //重新绘制等待小球区域
        drawWaitBalls();
    };
    展开全文
  • 一个纯canvas小游戏,无图片,纯js脚本canvas游戏,初学者!

    html 部分

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>canvas小游戏_打地鼠</title>
        <script src="main.js"></script>
    </head>
    <body οnlοad="drawcanvas()">
        <canvas id="canvas" style="border:2px green solid">
           您的浏览器不支持canvas,请您更换后使用。
        </canvas>
        <div style="float: right; border: 2px red solid; width: 200px; height: 100px;">
            <p id="countdown" style="font-size:80px;text-align:center;padding:0;margin:0;">30s</p>
    </div>
        <div style="float: right; border: 2px red solid; width: 200px; height: 100px;">
            <div>
                <a style="font-size: 20px;">你的成绩是:</a>
                <span id="scope" style="font-size: 35px;">0</span>
            </div>
           <!--  点击正确-->
            <div>
            <audio src="2734.wav" controls="controls" id="audio" style="display: none">
                您的浏览器不支持audio
          </audio>
                  <!--  点击错误-->
            <audio src="error.mp3" controls="controls" id="audio1" style="display: none">
                您的浏览器不支持audio
          </audio>
                  <!-- 开始的音乐-->
              <audio src="readygo.wav" controls="controls" id="audio2" style="display:none">
                您的浏览器不支持audio
          </audio>
                  <!--  游戏的bgm-->
            </audio>
              <audio src="bgm.wav" controls="controls" id="audio3" style="display: none">
                您的浏览器不支持audio
          </audio>
        </div>
      </div>
        <div style="border:2px solid #808080;float:right; width:390px;height:220px;margin-top:-450px;padding:10px;">
            <a>您选择的难度是:</a>
               <select id="test">
                 <option>简单</option>
                 <option>一般</option>
                <option>困难</option>
                <option>贼难</option>
                <option>变态难</option>
             </select>
              <input type="button" οnclick="start()"  style="width:200px;height:100px" value="30s练手速,点击开始"/>
             <div style="width:250px;color:red">游戏规则:点击游戏开始后,点击出现红叉;若点击成功则+1分,反之-1分。</div>
      </div>
         <img src="dishu.gif" id="dishu" />
     </body>

     </html>


    main.js部分:



     
    var mousex;//鼠标的XY轴坐标
    var mousey;
    var num =5;//一起性出现几个地鼠
    var circle = new Array();//地鼠
    var grade = "";//成绩
    var ck;//用于判断是否正确点击
    function update() {
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        //画布大小 
        canvas.width = 800;
        canvas.height = 600;
        for (var i = 0; i < num; i++) {
            circle[i] = {
                x: Math.floor(Math.random() * 8) * 100 + 50,
                y: Math.floor(Math.random() * 6) * 100 + 50,
                mouse: false,
            }
        }
        drawcanvas();
        show();
        //定一个监听器
        canvas.addEventListener("mousemove", updatecanvas, false);
        canvas.addEventListener("click", response, false);
    }
    //实时更新鼠标当前的位置的XY坐标
    function updatecanvas(e) {
        mousex = e.pageX - 8;
        mousey = e.pageY - 8;
        show();
    }
    //画目标点(画地鼠)
    function show() {
        var img = new Image();
        img.src = "dishu.gif";
        for (var i = 0; i < circle.length; i++) {
            var context = canvas.getContext("2d");
            context.save();//保存当前的路劲
            //两只地鼠
            context.beginPath();
            context.lineWidth = 3;
            context.strokeStyle = "gray";
            context.fillStyle = "red";
            context.arc(circle[i].x, circle[i].y, 40, 0, 2 * Math.PI, true);
            //  context.drawImage(img, circle[i].x - 25, circle[i].y - 30, 50, 50)
            //鼠标是否在目标内的检测
            if (context.isPointInPath(mousex, mousey)) {
                circle[i].mouse = true;
                ck = true;
            }
            else {
                circle[i].mouse = false;
                ck = false;
            }
            context.fill();
            context.stroke();
            context.closePath();
            //画布外边框的绘制
            context.beginPath();
            context.lineWidth = 5;
            context.strokeStyle = "white";
            context.moveTo(circle[i].x - 28, circle[i].y - 28);
            context.lineTo(circle[i].x + 28, circle[i].y + 28)
            context.moveTo(circle[i].x + 28, circle[i].y - 28);
            context.lineTo(circle[i].x - 28, circle[i].y + 28)
            context.fill();
            context.stroke();
            context.closePath();
            context.restore();
        }
    }
    //点击时做出响应  点击正确或者错误  加分或者扣分
    function response() {
        var scope = document.getElementById("scope");//成绩
        var aio = document.getElementById("audio");
        var aio1 = document.getElementById("audio1");
        var context = canvas.getContext("2d");
        for (var i = 0; i < circle.length; i++) {
            if (circle[i].mouse == true) {
                circle.splice(i, 1);
                grade = grade + 1;//打地鼠的成绩
                scope.innerHTML = grade;//显示成绩的值
                aio.play();
                context.clearRect(0, 0, 800, 600);
                // alert(circle.length);
                drawcanvas();
                show();
                return;
            }
        }
        if (ck == false) {
            aio1.play();
            grade = grade - 1;
            scope.innerHTML = grade;
        }
    }
    //画背景
    function drawcanvas() {
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        //定义画布的格子
        for (var i = 100; i <= 800; i = i + 100) {
            context.strokeStyle = "green";
            context.beginPath();
            context.lineWidth = 1;
            context.moveTo(0, i);
            context.lineTo(800, i);
            context.stroke();
            context.closePath();
        }
        for (var i = 100; i <= 800; i = i + 100) {
            context.beginPath();
            context.lineWidth = 1;
            context.moveTo(i, 0);
            context.lineTo(i, 800);
            context.stroke();
            context.closePath();
        }
        //定义各个格子的黄色的    圆
        for (var i = 0; i < 8; i++) {
            for (var j = 0; j < 6; j++) {
                var hole = context.createRadialGradient(50 + i * 100, 50 + j * 100, 30, 50 + i * 100, 50 + j * 100, 40);
                hole.addColorStop(0, "#ffd800");
                hole.addColorStop(1, "white");
                context.beginPath();
                context.lineWidth = 1;
                context.strokeStyle ="gray";
                context.fillStyle = hole;
                context.arc(50 + i * 100, 50 + j * 100, 40, 0, 2 * Math.PI, true);
                context.fill();
                context.stroke();
                context.closePath();
            }
        }
    }
    //开始函数
    function start() {
        var canvas = document.getElementById("canvas");
        var a = document.getElementById("countdown");//倒计时对象
        var b = document.getElementById("test");          //难度对象
        var c = 30;
        var aio2 = document.getElementById("audio2");
        var aio3= document.getElementById("audio3");
        aio2.play();
        aio3.play();
        aio3.volume = 0.2;
        //重置成绩
        if(parseInt(grade)!= 0) {
            grade= 0;
            document.getElementById("scope").innerHTML = grade;
        }
        //countdown秒倒计时
        var time = setInterval(function () {
            c--;
            a.innerHTML = c;
            if (a.innerHTML == 0) {
                clearInterval(time);
                a.innerHTML = 30;
            }
        }, 1000);
        //选择难度
        if (b.value == "简单") {
            update();
            show();
            var  timer = setInterval(update, 6000);//总分25
            setTimeout(function () {
                clearInterval(timer);
                aio3.pause();
                if (grade>20) {
                    alert("哇。。"+grade+"分,老牛逼了。");
                }
                else{
                    alert("才" + grade + "分,还要继续努力呀");
                }
                canvas.removeEventListener("mousemove", updatecanvas, false);
            }, 30000);
        }
        if (b.value == "一般") {
            update();
            show();
            var timer = setInterval(update, 5000);//总分30
            setTimeout(function () {
                aio3.pause();
                clearInterval(timer);
                if (grade >30) {
                    alert("哇。。" + grade + "分,老牛逼了。");
                }
                else {
                    alert("才" + grade + "分,还要继续努力呀");
                }
                canvas.removeEventListener("mousemove", updatecanvas, false);
            }, 30000);
        }
        if (b.value == "困难") {
            update();
            show();
            var timer = setInterval(update, 3000);//总分50
            setTimeout(function () {
                aio3.pause();
                clearInterval(timer);
                if (grade > 38) {
                    alert("哇。。" + grade + "分,老牛逼了。");
                }
                else {
                    alert("才" + grade + "分,还要继续努力呀");
                }
                canvas.removeEventListener("mousemove", updatecanvas, false);
            }, 30000);
        }
        if (b.value == "贼难") {
            update();
            show();
            var timer = setInterval(update, 2000);//总分75
            setTimeout(function () {
                aio3.pause();
                clearInterval(timer);
                if (grade > 45) {
                    alert("哇。。" + grade + "分,老牛逼了。");
                }
                else {
                    alert("才" + grade + "分,还要继续努力呀");
                }
                canvas.removeEventListener("mousemove", updatecanvas, false);
            }, 30000);
        }
        if (b.value == "变态难") {
            update();
            show();
            var timer = setInterval(update, 1000);//总分150
            setTimeout(function () {
                aio3.pause();
                clearInterval(timer);
                if (grade > 25&&grade<=35) {
                    alert("哇。。" + grade + "分,那么快都有"+grade+"分,");
                }
                if (grade > 35) {
                    alert("哇。。" + grade + "分,老牛逼了,那么快的手速!!!!");
                }
                if (grade > 0 && garde <= 25) {
                    alert("才" + grade + "分,还要继续努力呀");
                }
                else {
                    alert(grade + "分,突然觉你有点宛如一个智障了");
                }
                canvas.removeEventListener("mousemove", updatecanvas, false);
            }, 30000);
        }
    }


    //结束了

    写写自己的编的canvas小游戏,还有挺有意思的。里面想把红叉换成一张地鼠的照片的,但是isPointInPath()这个判定的方法是有限定的,我把图片加上去就失去原来的功能了,有知道的小伙伴可以留言方法给我,谢谢咯。大笑


    展开全文
  • H5 的canvas小游戏实例

    2019-01-07 18:34:55
    html5 开发技术 游戏.很好玩的html5+canvas技术实现的拼图游戏
  • 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学。(如果你怀疑我的资历, A Wizard's Lizard这个游戏的半数以上开发是由我完成的) 我们直接来看源码里的game.js,当然你也可以在线体验...

    原文:How to make a simple HTML5 Canvas game

    想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学。(如果你怀疑我的资历, A Wizard's Lizard这个游戏的半数以上开发是由我完成的)

    我们直接来看源码里的game.js,当然你也可以在线体验一下游戏先。

    游戏截图

    游戏截图

    创建画布

    // Create the canvas
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    canvas.width = 512;
    canvas.height = 480;
    document.body.appendChild(canvas);

    首先我们需要创建一张画布作为游戏的舞台。这里通过JS代码而不是直接在HTML里写一个<canvas>元素目的是要说明代码创建也是很方便的。有了画布后就可以获得它的上下文来进行绘图了。然后我们还设置了画布大小,最后将其添加到页面上。

    准备图片

    // 背景图片
    var bgReady = false;
    var bgImage = new Image();
    bgImage.onload = function () {
        bgReady = true;
    };
    bgImage.src = "images/background.png";

    游戏嘛少不了图片的,所以我们先加载一些图片先。简便起见,这里仅创建简单的图片对象,而不是专门写一个类或者Helper来做图片加载。bgReady这个变量用来标识图片是否已经加载完成从而可以放心地使用了,因为如果在图片加载未完成情况下进行绘制是会报错的。

    整个游戏中需要用到的三张图片:背景英雄怪物我们都用上面的方法来处理。

    游戏对象

    // 游戏对象
    var hero = {
        speed: 256, // 每秒移动的像素
        x: 0,
        y: 0
    };
    var monster = {
        x: 0,
        y: 0
    };
    var monstersCaught = 0;

    现在定义一些对象将在后面用到。我们的英雄有一个speed属性用来控制他每秒移动多少像素。怪物游戏过程中不会移动,所以只有坐标属性就够了。monstersCaught则用来存储怪物被捉住的次数。

    处理用户的输入

    // 处理按键
    var keysDown = {};
    
    addEventListener("keydown", function (e) {
        keysDown[e.keyCode] = true;
    }, false);
    
    addEventListener("keyup", function (e) {
        delete keysDown[e.keyCode];
    }, false);

    现在开始处理用户的输入(对初次接触游戏开发的前端同学来说,这部分开始可能就需要一些脑力了)。在前端开发中,一般是用户触发了点击事件然后才去执行动画或发起异步请求之类的,但这里我们希望游戏的逻辑能够更加紧凑同时又要及时响应输入。所以我们就把用户的输入先保存下来而不是立即响应。

    为此,我们用keysDown这个对象来保存用户按下的键值(keyCode),如果按下的键值在这个对象里,那么我们就做相应处理。

    开始一轮游戏

    // 当用户抓住一只怪物后开始新一轮游戏
    var reset = function () {
        hero.x = canvas.width / 2;
        hero.y = canvas.height / 2;
    
        // 将新的怪物随机放置到界面上
        monster.x = 32 + (Math.random() * (canvas.width - 64));
        monster.y = 32 + (Math.random() * (canvas.height - 64));
    };

    reset方法用于开始新一轮和游戏,在这个方法里我们将英雄放回画布中心同时将怪物放到一个随机的地方。

    更新对象

    // 更新游戏对象的属性
    var update = function (modifier) {
        if (38 in keysDown) { // 用户按的是↑
            hero.y -= hero.speed * modifier;
        }
        if (40 in keysDown) { // 用户按的是↓
            hero.y += hero.speed * modifier;
        }
        if (37 in keysDown) { // 用户按的是←
            hero.x -= hero.speed * modifier;
        }
        if (39 in keysDown) { // 用户按的是→
            hero.x += hero.speed * modifier;
        }
    
        // 英雄与怪物碰到了么?
        if (
            hero.x <= (monster.x + 32)
            && monster.x <= (hero.x + 32)
            && hero.y <= (monster.y + 32)
            && monster.y <= (hero.y + 32)
        ) {
            ++monstersCaught;
            reset();
        }
    };

    这就是游戏中用于更新画面的update函数,会被规律地重复调用。首先它负责检查用户当前按住的是中方向键,然后将英雄往相应方向移动。

    有点费脑力的或许是这个传入的modifier 变量。你可以在main 方法里看到它的来源,但这里还是有必要详细解释一下。它是基于1开始且随时间变化的一个因子。例如1秒过去了,它的值就是1,英雄的速度将会乘以1,也就是每秒移动256像素;如果半秒钟则它的值为0.5,英雄的速度就乘以0.5也就是说这半秒内英雄以正常速度一半的速度移动。理论上说因为这个update 方法被调用的非常快且频繁,所以modifier的值会很小,但有了这一因子后,不管我们的代码跑得快慢,都能够保证英雄的移动速度是恒定的。

    现在英雄的移动已经是基于用户的输入了,接下来该检查移动过程中所触发的事件了,也就是英雄与怪物相遇。这就是本游戏的胜利点,monstersCaught +1然后重新开始新一轮。

    渲染物体

    // 画出所有物体
    var render = function () {
        if (bgReady) {
            ctx.drawImage(bgImage, 0, 0);
        }
    
        if (heroReady) {
            ctx.drawImage(heroImage, hero.x, hero.y);
        }
    
        if (monsterReady) {
            ctx.drawImage(monsterImage, monster.x, monster.y);
        }
    
        // 计分
        ctx.fillStyle = "rgb(250, 250, 250)";
        ctx.font = "24px Helvetica";
        ctx.textAlign = "left";
        ctx.textBaseline = "top";
        ctx.fillText("Monsterrs caught: " + monstersCaught, 32, 32);
    };

    之前的工作都是枯燥的,直到你把所有东西画出来之后。首先当然是把背景图画出来。然后如法炮制将英雄和怪物也画出来。这个过程中的顺序是有讲究的,因为后画的物体会覆盖之前的物体。

    这之后我们改变了一下Canvas的绘图上下文的样式并调用fillText来绘制文字,也就是记分板那一部分。本游戏没有其他复杂的动画效果和打斗场面,绘制部分大功告成!

    主循环函数

    // 游戏主函数
    var main = function () {
        var now = Date.now();
        var delta = now - then;
    
        update(delta / 1000);
        render();
    
        then = now;
    
        // 立即调用主函数
        requestAnimationFrame(main);
    };

    上面的主函数控制了整个游戏的流程。先是拿到当前的时间用来计算时间差(距离上次主函数被调用时过了多少毫秒)。得到modifier后除以1000(也就是1秒中的毫秒数)再传入update函数。最后调用render 函数并且将本次的时间保存下来。

    关于游戏中循环更新画面的讨论可参见「Onslaught! Arena Case Study」。

    关于循环的进一步解释

    // requestAnimationFrame 的浏览器兼容性处理
    var w = window;
    requestAnimationFrame = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame;

    如果你不是完全理解上面的代码也没关系,我只是觉得拿出来解释一下总是极好的

    为了循环地调用main函数,本游戏之前用的是setInterval。但现今已经有了更好的方法那就是requestAnimationFrame。使用新方法就不得不考虑浏览器兼容性。上面的垫片就是出于这样的考虑,它是Paul Irish 博客原版的一个简化版本。

    启动游戏!

    // 少年,开始游戏吧!
    var then = Date.now();
    reset();
    main();

    总算完成了,这是本游戏最后一段代码了。先是设置一个初始的时间变量then用于首先运行main函数使用。然后调用 reset 函数来开始新一轮游戏(如果你还记得的话,这个函数的作用是将英雄放到画面中间同时将怪物放到随机的地方以方便英雄去捉它)。

    到此,相信你已经掌握了开发一个简单H5小游戏需要的基本功了。玩玩这个游戏或者下载代码自己研究研究吧 :)

    展开全文
  • html5 canvas 小游戏

    2012-12-26 22:59:13
    这是用canvas画布写的一个小游戏,代码还是比较容易理解的,游戏可玩性也挺不错,值得初学者学习
  • h5的canvas小游戏实例

    千次阅读 2018-02-01 18:04:50
    最近看了一些canvas小游戏例子,参照写了个实例。 原理大致讲一下:主要是通过requestAnimationFrame无间断刷新canvas实现动画,监听一些事件,实现操作。 流程大致是,准备容器,准备相关角色,事件绑定,更新...

    最近看了一些canvas的小游戏例子,参照写了个实例。

    原理大致讲一下:主要是通过requestAnimationFrame无间断刷新canvas实现动画,监听一些事件,实现操作。

    流程大致是,准备容器,准备相关角色,事件绑定,更新数据,初始化画布,主流程函数(这里循环调用requestAnimationFrame)。

    简单的说就是 设置数据,更新画布,再更新数据,更新画布。

    在线实例:http://www.lightconmos.com/plane/index.html代码如下:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>plane</title>
    </head>
    
    <body>
    <div class="bg">
    	<canvas id="bgd" width="400" height="600"></canvas>
    </div>
    </body>
    <script>
    // 创建容器
    var con = document.getElementById("bgd")
    var ctx = con.getContext("2d")
    // 创建背景
    var bg = {
    	src: "img/bg.png",
    	x: 0,
    	y: 0,
    	speed: 0,
    	status: false
    }
    var bgImgo = new Image()
    bgImgo.src = bg.src
    bgImgo.onload = function () {
    	bg.status = true
    }
    var bgImgt = new Image()
    bgImgt.src = bg.src
    bgImgt.onload = function () {
    	bg.status = true
    }
    
    // 创建主角
    var plane = {
    	src: "img/p1.png",
    	x: 0,
    	y: 0,
    	status: false,
    	type: 1,
    	ammoType: 1,
    	speed: 256,
    }
    var planeImg = new Image()
    planeImg.src = plane.src
    planeImg.onload = function () {
    	plane.status = true
    }
    // 弹药
    var ammo = {
    	src: "",
    	x: 0,
    	y: 0,
    	speed: 512,
    	status: false
    }
    var ammos = []
    var shooting = function (val) {
    	ctx.fillStyle = "red"
    	ctx.beginPath()
    	ctx.arc(val.x,val.y,4,0,2*Math.PI)
    	ctx.fill()
    }
    // 创建怪物
    var enemyImg = new Image()
    var enemys = []
    var enemy = {
    	x: Math.random() * 368,
    	y: 0,
    	speed: 150,
    	status: false,
    	src: 'img/en.png',
    	width: 30,
    	height: 30
    }
    enemyImg.src = enemy.src
    enemyImg.onload = function () {
    	enemy.status = true
    }
    // 统计击落敌机数
    var num = 0
    // 敌机总数
    var sum = 1
    // 添加事件
    var keysDown = {}
    
    addEventListener("keydown", function (e) {
    	keysDown[e.keyCode] = true
    	console.log(keysDown)
    	console.log(e.keyCode)
    }, false)
    
    addEventListener("keyup", function (e) {
    	delete keysDown[e.keyCode]
    }, false)
    
    // 初始化界面
    var init = function () {
    	plane.x = con.width / 2
    	plane.y = con.height * 9 / 10
    }
    
    // 更新操作
    var update = function (speed) {
    	console.log(speed)
    	if (38 in keysDown) {
    		if (plane.y > 0) {
    			plane.y -= plane.speed * speed
    		}
    	}
    	if (40 in keysDown) {
    		if (plane.y - 548 < 0) {
    			plane.y += plane.speed * speed
    		}
    	}
    	if (37 in keysDown) {
    		if (plane.x > 0) {
    			plane.x -= plane.speed * speed
    		}
    	}
    	if (39 in keysDown) {
    		if (plane.x - 370 < 0) {
    			plane.x += plane.speed * speed
    		}
    	}
    	if (32 in keysDown) {
    		var temp = {
    			x: plane.x + 15,
    			y: plane.y,
    			status: true,
    			speed: 300
    		}
    		ammos.push(temp)
    		delete keysDown[32]
    	}
    	
    	// 背景拼接
    	if (bg.y - 1000 == 0) {
    		bg.y = 0
    	} else {
    		bg.y++
    	}
    	
    	// 弹药的移动
    	ammos.forEach(function (item, index) {
    		if (item.y + 1000 < 0) {
    			ammos.splice(index,1)
    		} else {
    			item.y -= item.speed * speed
    			// 击中敌机
    			
    			if ((item.y > enemy.y && item.y < enemy.y + 32) && (item.x > enemy.x && item.x < enemy.x + 32)) {
    				ammos.splice(index,1)
    				enemy.y = 0
    				enemy.x = Math.random() * 368
    				num++
    				sum++
    			}
    		}
    	})
    	// 敌机移动
    	if (enemy.y > 570) {
    		enemy.y = 0
    		enemy.x = Math.random() * 368
    		sum++
    	} else {
    		enemy.y += enemy.speed * speed 
    	}
    
    	
    }
    
    // 重载界面,更新数据
    var render = function () {
    	// 画背景图
    	if (bg.status) {
    		ctx.drawImage(bgImgo, bg.x, bg.y)
    		ctx.drawImage(bgImgt, bg.x, bg.y - 1000)
    	}
    	// 画飞机
    	if (plane.status) {
    		ctx.drawImage(planeImg, plane.x, plane.y)	
    	}
    	// 敌机
    	if (enemy.status) {
    		ctx.drawImage(enemyImg, enemy.x, enemy.y)	
    	}
    	// 弹药
    	ammos.forEach(function (item) {
    		shooting(item)
    	})
    	// 分数
    	ctx.fillStyle = "rgb(250, 250, 250)"
    	ctx.font = "24px Helvetica"
    	ctx.textAlign = "left"
    	ctx.textBaseline = "top"
    	ctx.fillText( "击落敌机数: " + num, 32, 32)
    	ctx.fillText("敌机总数: " + sum, 32, 64)
    }
    
    // 主程序
    var main = function () {
    	var now = Date.now()
    	var delta = now -then
    	
    	update(delta / 1000)
    	render()
    	
    	then = now
    	
    	requestAnimationFrame(main)
    }
    
    var w = window
    requestAnimationFrame = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame
    
    var then = Date.now()
    init()
    main()
    </script>
    <style>
    .bg{
    	width: 400px;
    	height: 600px;
    	margin:0 auto;
    	border:1px solid #666;
    }
    </style>
    </html>
    
    比较简单大家可以再扩展一下。

    参考地址http://www.cnblogs.com/Wayou/p/how-to-make-a-simple-html5-canvas-game.html

    展开全文
  • 整个游戏过程比较简单,玩家只需要点击手机屏幕来使中间粉红的那个小方块跳动起来便可,如果小方块被带到了屏幕的左边,那么游戏结束;在屏幕的最中>间有一个时间计数器,每隔10s,计数器上的数字变换一次颜色,玩家...
  • html5 贪吃蛇canvas小游戏

    千次阅读 2014-02-10 12:41:47
    基于canvas实现的html5贪吃蛇小游戏
  • 什么是canvascanvas元素用于图形的绘制,通过脚本(js)来完成。canvas元素用于图形的绘制,通过脚本(js)来完成。 Canvas相关函数: 画长方形:  实心:  1. ctx.fillStyle=“#eee”;  2. ctx.fillRect(x...
  • 楼主在复现这个开源的小游戏时,发现了在外挂.js文件时,无法设置画布居中,总是会报错。 (Uncaught TypeError: Cannot read property ‘getContext’ of null) 教学代码请点击这里:实验楼小游戏教学链接 html...
  • H5 canvas 实现小游戏

    2018-06-25 20:37:10
    H5 canvas 实现小游戏 H5 canvas 实现小游戏 H5 canvas 实现小游戏 H5 canvas 实现小游戏
  • canvas端午节小游戏

    2017-08-25 13:31:41
    canvas端午节小游戏
  • canvas端午小游戏

    2017-06-29 15:43:11
    canvas端午节吃粽子小游戏,兼容移动端
  • HTML5 Canvas射箭小游戏源码是一款简单实用的HTML5小游戏代码。
  • 采用 canvas 绘制小游戏,可通过重置速度、分数来重新体验游戏。适合学习绘制 canvas 小游戏的初学者
  • HTML5 Canvas推箱子小游戏 HTML5 Canvas推箱子小游戏 HTML5 Canvas推箱子小游戏
  • Canvas刀枪不入躲避小游戏代码是一款网页游戏源文件代码。
  • HTML5 canvas弹球小游戏

    2017-04-27 16:47:54
    用HTML5 canvas开发的简易弹球小游戏,原理简单。
  • js H5 canvas投篮小游戏

    2020-12-28 20:51:10
    本文实例为大家分享了H5 canvas投篮小游戏实现代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset=UTF-8> <title></title> </head> <...
  • html5 canvas绘制射箭小游戏下载 html5 canvas绘制射箭小游戏下载
  • HTML5 canvas激流勇进小游戏代码,迷宫逃生小游戏
  • HTML5 Canvas激流勇进小游戏代码是一款激流勇进迷宫逃生小游戏源码下载。
  • canvas转盘小游戏

    2013-12-09 19:17:01
    canvas做的转盘,参考大神的学习学习,整体的感觉还是不错
  • HTML5 canvas射击鸭子小游戏,是基于canvas和javascript编写的在线网页小游戏,直接解压打开HTML文件即可,可供休闲玩耍也可以供需要学习的朋友观看源码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,965
精华内容 11,586
关键字:

canvas小游戏