HTML5的canvas+JavaScript打造一个“贪吃饼”

先上效果图:

HTML代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>小游戏</title>
</head>
<br/>
<body style="text-align: center;padding: 20px">
</body>
<script src="1.js"></script>
</html>

JavaScript代码:

var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = 1200    ;
canvas.height = 600;
canvas.style="border:5px solid #000000;";
var val=0
var r_max=200
var keysDown = {};
var zd_zb=[]

addEventListener("keydown", function (e) {
    keysDown[e.keyCode] = true;

    // console.log(keysDown)
    // console.log(Object.keys(keysDown).length==0)
}, false);

addEventListener("keyup", function (e) {
    if (e.keyCode==32){
        zd_zb.push([yuan.x,yuan.y])
    }

    delete keysDown[e.keyCode];
    // console.log(keysDown)
    // console.log(Object.keys(keysDown).length==0)//没按下
}, false);

var yuan= {
    x :canvas.width / 2,
    y : canvas.height / 2,
    r:12
};

function randomNum(minNum,maxNum){
    switch(arguments.length){
        case 1:
            return parseInt(Math.random()*minNum+1,10);
               break;
        case 2:
            return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
            break;
        default:
            return 0;
            break;
    }
} 

var sw={
    x:randomNum(0,canvas.width),
    y:randomNum(0,canvas.height),
    zb:[]
}
for(var i=0;i<20;i++){
    sw.zb.push([randomNum(0,canvas.width),randomNum(0,canvas.height/2)])

    }

var update = function (xx=10) {

    if (38 in keysDown) { //  up
        yuan.y -= xx;
    }
    if (40 in keysDown) { // down
        yuan.y += xx;
    }
    if (37 in keysDown) { //  left
        yuan.x -=xx;
    }
    if (39 in keysDown) { // right
        yuan.x += xx;
    }
    if (32 in keysDown) { //  发射子弹
        // yuan.y -= xx;
        //自动
         //zd_zb.push([yuan.x,yuan.y])//注释掉这段即可关闭全自动模式
        //break
    }

        // console.log(zd_zb)

    if(yuan.x>canvas.width){
        yuan.x=canvas.width
    }
    if(yuan.x<0){
        yuan.x=0
    }
    if(yuan.y>canvas.height){
        yuan.y=canvas.height
    }
    if(yuan.y<0){
        yuan.y=0
    }
    if(Object.keys(keysDown).length==0){
        //自动

    }

for (var o = 0; o < sw.zb.length; o++) {
                sw_x=sw.zb[o][0]
                sw_y=sw.zb[o][1]
                sw.zb[o][1]+=1
                if(sw.zb[o][1]>canvas.height){
                        sw.zb.splice(o,1)
                        sw.zb.push([randomNum(0,canvas.width),randomNum(0,canvas.height/2)])
                        continue
                }
     var z = Math.abs(((sw_x-yuan.x)**2+(sw_y-yuan.y)**2)**0.5)-yuan.r

    if (z<10){
         // sw={
            // x:randomNum(0,canvas.width),
            // y:randomNum(0,canvas.height),
            //     }
        sw.zb.splice(o,1)
        sw.zb.push([randomNum(0,canvas.width),randomNum(0,canvas.height/2)])
        yuan.r += xx/8;
        val+=1
        //限制大小
        if(yuan.r>r_max){
            yuan.r=r_max
        }
    continue

    }
}

};
// for(var i=0;i<10;i++){
//             console.log("zd.zb")
//         }
var t=0
var render = function () {
        //清空画布
        canvas.height=canvas.height; //清空画布

        //显示子弹
        //
        t+=1
        //if(t==20){
            t=0
        flx=1
        for(var i=0;i<zd_zb.length;i++){
            t+=1
            zd_x=zd_zb[i][0]
            zd_y=zd_zb[i][1]
            zd_zb[i][1]-=5
             // if(zd_zb[i][1]<0){
             //     delete zd_zb[i]
             // }

            for (var o = 0; o < sw.zb.length; o++) {
                sw_x=sw.zb[o][0]
                sw_y=sw.zb[o][1]

            zd_z = Math.abs(((sw_x-zd_x)**2+(sw_y-zd_y)**2)**0.5)
            if (zd_z<10){
                 // sw={
                    // x:randomNum(0,canvas.width),
                    // y:randomNum(0,canvas.height),
                    // }
                sw.zb.splice(o,1)
                sw.zb.push([randomNum(0,canvas.width),randomNum(0,canvas.height/2)])
                zd_zb.splice(i,1)
                //continue
                //delete zd_zb。a.splice(1)[i]
                yuan.r += xx/8;
                val+=1
                //限制大小
                if(yuan.r>r_max){
                    yuan.r=r_max
                }
                flx=0
                continue

            }
            }
            if(flx==0){
                flx=1
                continue
            }
            if(zd_zb[i][1]>0){
                ctx.beginPath()//开始画
                ctx.fillStyle="#FF0000";//颜色
                ctx.arc(zd_x,zd_y,3,0,360);//画圆
                ctx.fill()//填充
                ctx.closePath()//画完
            }

        }
    //}
        ctx = canvas.getContext("2d");
        ctx.beginPath()
        ctx.arc(yuan.x,yuan.y,yuan.r,0,360);
        ctx.fillStyle="#000000";
        ctx.fill()
        ctx.closePath()

        ctx.beginPath()
        ctx.fillStyle="#FFFFFF";
        ctx.textBaseline="alphabetic";
        ctx.textAlign="center";
        ctx.fillText(val,yuan.x,yuan.y+4)
        // ctx.measureText()
        ctx.closePath()

        for(var i=0;i<sw.zb.length;i++){
            ctx.beginPath()
            ctx.fillStyle="#FF0000";
            ctx.arc(sw.zb[i][0],sw.zb[i][1],10,0,360);
            ctx.fill()
            ctx.closePath()
    }
};
var main=function () {

        update(xx=5);
        render()
        requestAnimationFrame(main);
}
render()
main()
document.body.appendChild(canvas);

原文地址:https://www.cnblogs.com/ksxh/p/11330760.html

时间: 2024-07-31 18:45:10

HTML5的canvas+JavaScript打造一个“贪吃饼”的相关文章

用html5的canvas和JavaScript创建一个绘图程序

本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. 1 <canvas id="canvasInAPerfectWorld" width="490" height="220"></canvas> 获取绘图环境,context对象提供了用于在画布上绘图的方法和属性 1 context = document.getEleme

自己的写的HTML5 Canvas + Javascript五子棋

看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这个小练习. 基本思路是这样的: 使用Canvas绘制棋盘.棋子. 用二维数组保存棋盘状态. 设置一个flag,用以标识落子顺序. 点击时,在数组中检测当前点击位置是否存在棋子,若存在,则不落子:如游戏已结束,亦不落子. 落子时,更新数组,并将当前落子所在的行.列.左上-右下列.左下-右上列四个方向的

知名Html5 Canvas Javascript库对比 (引用)

由于LS 的数据绑定使用了 :EaselJS The LightSwitch Data Binding Framework Using EaselJS http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/1211/The-LightSwitch-Data-Binding-Framework-Using-EaselJS.aspx 所以,在网上寻找相关的资料,这是一个比较.http://www.tuicool.com/articles/F3

知名Html5 Canvas Javascript库对比 (转)

知名Html5 Canvas Javascript库对比 声明: 原文链接:http://www.softr.li/blog/2012/06/20/which-html5-canvas-javascript-library-should-i-use 本译文地址:http://jo2.org/html5-canvas-libary-introduction/ 转载请保留.. <我应该选哪个Canvas库?>译文(以下的“我”是指原作者): 我一直在找一个Html5 canvas库,可以让我创建可

通过HTML5标签canvas绘制一个八卦图案

只需要用到casvas标签和fillStyle.arc.beginPath.closePath.fill方法 代码如下: <canvas id="rect" width="310" height="310" style="border:1px yellow solid;"> </canvas> <script> var id=document.getElementById("rec

浅尝HTML5之canvas

转自:http://segmentfault.com/a/1190000000661407/ HTML5新标签 HTML5新引入header,footer,article,section,aside和nav,audio,datalist,details,video,progress,embed等标签 section 标签用于标识页面上的重要内容部分.该标签有点类似于将一本书分成几个章节. article 标签标识了 Web 页面中的主要内容. aside 标签表示arcitle元素内容之外的.与

无插件纯Web 3D机房,HTML5+WebGL倾力打造

前言 最近项目开发任务告一段落,刚好有时间整理这大半年的一些成果.使用html5时间还不久,对js的认识还不够深入.没办法,以前一直搞java,对js的一些语言特性和概念一时还转换不过来. 上一篇介绍了项目中做的一个彩虹爆炸图,主要用了 html5的canvas的2d绘制技术.这一回我想介绍一下项目中的一个亮点技术:html5的3D,以及如何用它打造精美的3D机房监控系统. 目标效果图 下图是客户给找的一张的效果参考图,希望机房至少能达到下面的3D效果. 懂的人都知道,这可是一张设计公司出的装修

HTML5程序设计 Canvas API

检测浏览器支持情况 <script type="text/javascript"> try { document.createElement("Canvas").getContext("2d"); document.getElementById("support").innerHTML = "OK"; } catch (e) { document.getElementById("sup

HTML5 画布 Canvas

利用html5的canvas元素使用 JavaScript 在网页上绘制图像. 通过规定尺寸.颜色和位置,来绘制一个圆: <!DOCTYPE htma> <html> <body> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #3CF;"> Your browser does not