5.7_背景的滾動

5.7_背景的滾動

遊戲背景圖

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>背景的滾動</title>
        <style>
            body{
                background: #ddd;
            }
            #canvas{
                position: absolute;
                top: 30px;
                left: 10px;
                background: #FFFFFF;
                cursor: crosshair;
                margin-left: 10px;
                margin-top: 10px;
                box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
                -webkit-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
                -moz-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
            }
            input{
                margin-left: 15px;
            }
        </style>
    </head>
    <body>
        <canvas id="canvas" width="1024" height="512"></canvas>
        <input id="animateButton" type="button" value="Animate" />
    </body>
    <script>
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');
        var animateButton = document.getElementById('animateButton');

        var sky = new Image();

        var paused = true;
        var lastTime = 0;
        var fps = 60;
        var skyOffset = 0;
        var skyVelocity = 100; //每秒的位移速度

        //初始化
        sky.src = 'img/bg.png';

        sky.onload = function(e){
            draw();
        };
        requestAnimationFrame(animate);
        //事件
        animateButton.onclick = function (){
            paused = !paused;
            if(paused){
                animateButton.value = 'Animate';

            }else{
                animateButton.value = 'Pause';
                //不能在這裏添加,應該會調用多個requestAnimationFrame事件
                //requestAnimationFrame(animate);
            }
        }

        function draw(){
            context.save();
            //以每秒恆定skyVelocity速度來移動,這是兩幀的時間差*速度,就是這兩幀要的位移偏量 skyVelocity/fps
            //這種就是基於時間的運動,每兩幀之間的位移是動態變化的,不是恆定不變的,以免出現以幀速率決定位移量,讓設備好的人跟設備一般的人,沒法同時進行遊戲
            skyOffset = skyOffset<canvas.width? skyOffset+skyVelocity/fps:0;
            context.translate(-skyOffset,0);

            context.drawImage(sky,0,0,canvas.width,canvas.height);
            context.drawImage(sky,canvas.width,0,canvas.width,canvas.height);

            context.restore();
        };
        function erase(){
            context.clearRect(0,0,canvas.width,canvas.height);
        }

        function calculateFps(now){
            var fps = 1000/(now - lastTime);
            //console.log(now);
            lastTime = now;

            return fps;
        }

        function animate(now){
            //注意這裏的now,經過測試,now是從打開頁面就開始計時的,無論動畫的是執行還是靜止
            //因爲我們要取得的是兩幀之時的時間差,所以要得到本例中採取的方法是從頁面一打開就開始運行,animate
            //下一例子,嘗試設計一個開關,執行動畫時,纔開始計時,但是每次點擊重新開始動畫時(非刷新),第一幀設置的lastTime是個估算值
//          if(now === undefined){
//              now = +new Date;
//          }

            //因爲要取得這個fps,不能暫停這裏的因爲裏面的lastTime要取最新最近的值
            fps = calculateFps(now);

            if(!paused){
                erase();
                draw();
            }
            requestAnimationFrame(animate);
        }
    </script>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章