`
ning_wenchao
  • 浏览: 2466 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

canvas封装 FlappyBird :小鸟第一步鼠标点击移动

阅读更多
<canvas id ="cvs" width="800" height="600"></canvas>
<script>
    var cvs = document.getElementById("cvs");
    var ctx = cvs.getContext('2d');

    var imgUrls = [ //存图片名称 和图片路径的对象
        {name: 'birds', path: './res/birds.png'},
        {name: 'land', path: './res/land.png'},
        {name: 'pipe1', path: './res/pipe1.png'},
        {name: 'pipe2', path: './res/pipe2.png'},
        {name: 'sky', path: './res/sky.png'},
    ];
    //创建的函数,传入俩个参数 第一个参数是图片名称和路径的数组,第二个参数是加载完成需要执行的函数体
    function loadImages(imgUrls, callback) {
        var count = imgUrls.length;   // 创建的长度用于遍历和计数用
        var imgEls = {};             //创建一个新数组
        for (var i = 0; i < imgUrls.length; i++) {  //循环遍历穿入的图片数组
            var imgEl = new Image();  // 创建一个 img 标签
            imgEl.src = imgUrls[i].path;  // img标签的 src 加载 穿入的数组内的path (路径)
            var name = imgUrls[i].name; //  创建一个 name 属性 接收 数组内的name 属性
            imgEls[name] = imgEl;  //img 标签属性name  等于  一个对象
            imgEl.addEventListener('load', function () { //imgEl(img)创建一个监听事件 图片加载完成后执行
                count--;  //加载完成一次,计数减一
                if (count == 0) {         // count  等于0的时候  执行
                    callback(imgEls) ;  //加载完成执行函数体
                }
            })
        }
    }
    //    --------------------------
//主函数体
    loadImages(imgUrls,function(imgEls){
//封装一个对象,能够绘制一个会自己下落的小鸟。
//有构造函数准备数据。
//有update和draw用于更新数据和绘制。
//update里面有下落和帧切换两种动画。
        function Bird(x,y,img,a,speed) {
            // TODO: 准备小鸟对象所需要的数据
            this.x = x; //在画布上的x坐标
            this.y = y; //在画布上的Y坐标
            this.img = img;  //图片名称
            this.index = 0;  //用来计算图片X轴的位置
            this.a = a;     // 计算加速时间
            this.speed = speed;  // 图片移动速度


            this.waitTime = 0; // 累积小图等待的时间。
        }

        Bird.prototype.draw  = function(){
            // TODO:绘制小鸟 (不需要有旋转)
            ctx.drawImage(this.img,
                    52*this.index, 0, 52, 45, // 原图上选择的矩形区域
                    this.x, this.y, 52, 45 // Cavnas上选择的矩形区域
            );
        };

        Bird.prototype.update = function (dt) {
            // 我们原来是一帧切换一张小图。昨天写的一帧是100毫秒。
            // 但是现在我们的一帧,约为16.67毫秒,所以小图切换的速度,就太快了。
            // r如何解决这个问题呢?
            this.waitTime += dt;
            if (this.waitTime >= 100) { // 等停在这给index上的时间超过100毫秒,再做切换
                // 现在的思路是:
                //      等待一百毫秒后,切换小图,然后用来累积等待时间的变量减去100毫秒。
                this.index++;
                if (this.index > 2) {
                        this.index = 0;
                }
                this.waitTime -= 100;


            }
            // TODO : 小鸟的下落动画
//  speed和a:小鸟的速度和加速度。我们算小鸟的位置时,应该是这样的:
//  speed = speed + a × dt;  速度是根据加速度和时间算出来的。
//  s = speed × dt; 路程是根据速度和时间算出来的。
//  y = y + s; 位置是根据路程算出来的。(纵轴的位置)

            this.speed = this.speed + this.a * dt;
            this.y = this.y+this.speed * dt;
        };


//        bird
        var animate = new Bird(150,150,imgEls.birds,0.0002,0);


        var lastTime =Date.now();  //计算执行之前的时间
        var looper = function(){
            var now = Date.now();  //执行之后的时间
            var dt = now - lastTime;  //执行时间
//            if(dt<10){
//                requestAnimationFrame(looper);
//                return;
//            }
            lastTime = now;

           
            ctx.clearRect(0,0,800,600);//清除图像
            animate.update(dt);
            animate.draw();
           
            requestAnimationFrame(looper);
        }
        cvs.addEventListener('click', function () {
            animate.speed = -0.15;
        })
        requestAnimationFrame(looper);
    })
</script>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics