1. 程式人生 > >HTML5(三)canvas(3)

HTML5(三)canvas(3)

簡易祖瑪遊戲
<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <title></title>
</head>
<style>
*{margin: 0;padding: 0;}
body{ background:black;}
#div1{ background:white;width: 600px;margin: 20px auto; }
</style>
<script type="text/javascript" src="jCanvaScript.1.5.18.min.js"></script>
<script>
window.onload = function(){
        var oC = document.getElementById('c1');
        var oGC = oC.getContext('2d');
        var yImg = new Image();
        yImg.src = 'person.png';
        yImg.onload = function(){
                var i = 0;
                // 重新繪製路徑和小球運動位置
                setInterval(function(){
                        oGC.clearRect(0, 0, oC.width, oC.height)
                        // 第一段圓弧
                        oGC.beginPath();
                        oGC.arc(300, 200, 200, -90*Math.PI/180, 180*Math.PI/180, false);
                        oGC.stroke();
                        // 第二段圓弧
                        oGC.beginPath();
                        oGC.arc(250, 200, 150, 180*Math.PI/180, 360*Math.PI/180, false);
                        oGC.stroke();
                        // 第三段圓弧
                        oGC.beginPath();
                        oGC.arc(400, 200, 20, 0*Math.PI/180, 360*Math.PI/180, false);
                        oGC.stroke();

                        // 繪製球
                        for(var i=0; i<balls.length; i++){
                                oGC.beginPath();
                                var x = balls[i].x;
                                var y = balls[i].y;
                                oGC.moveTo(x, y);
                                oGC.arc(x, y, 20, 0*Math.PI/180, 360*Math.PI/180, false)
                                oGC.fill();
                        }
                        oGC.save();
                        oGC.translate(300, 200);
                        oGC.rotate(iRotate);
                        oGC.translate(-40, -40);
                        oGC.drawImage(yImg, 0, 0);
                        oGC.restore();

                        // 繪製子彈
                        for(var i=0; i<bullets.length; i++){
                                oGC.save();
                                oGC.fillStyle = 'red';
                                oGC.beginPath();
                                var x = bullets[i].x;
                                var y = bullets[i].y;
                                oGC.moveTo(x, y);
                                oGC.arc(x, y, 20, 0*Math.PI/180, 360*Math.PI/180, false)
                                oGC.fill();
                                oGC.restore();
                        }
                        // 文字
                        oGC.save();
                        oGC.font = '60px impact';
                        oGC.textBaseline = 'top';
                        oGC.fillStyle = 'red';
                        oGC.shadowOffsetX = 10;
                        oGC.shadowOffsetY = 10;
                        oGC.shadowColor = 'green';
                        oGC.shadowBlur = 5;
                        var w = oGC.measureText('簡易祖瑪').width;
                        var h = 60;
                        oGC.fillText('簡易祖瑪', (oC.width - w)/2 , 450 );
                        oGC.restore();
                }, 1000/60);
                // 繪製小球位置 && 更新子彈
                setInterval(function(){
                        // 繪製小球位置
                        for(var i=0; i<balls.length; i++){
                                balls[i].num++;

                                if(balls[i].num === 270){
                                        balls[i].r = 150;
                                        balls[i].startX = 250;
                                        balls[i].startY = 50;
                                }
                                if(balls[i].num === 270 + 180){
                                        alert('Game over !!!');
                                        window.location.reload();
                                }

                                var r = balls[i].r
                                balls[i].x = Math.sin(balls[i].num*Math.PI/180)*r + balls[i].startX;
                                balls[i].y = balls[i].r - Math.cos(balls[i].num*Math.PI/180)*r + balls[i].startY;
                        }

                        for(var i=0; i<bullets.length; i++){
                                bullets[i].x =  bullets[i].x + bullets[i].xSpeed;
                                bullets[i].y =  bullets[i].y + bullets[i].ySpeed;
                        }

                        for(var i=0; i<bullets.length; i++){
                                for(var j=0; i<balls.length; j++){
                                        if(collision(bullets[i].x, bullets[i].y, balls[j].x, balls[j].y)){
                                                bullets.splice(i, 1);
                                                balls.splice(j, 1);
                                                break;
                                        }
                                }
                        }
                }, 30);
                // 建立小球
                var balls = [];
                setInterval(function(){
                        balls.push({
                                x: 300,
                                y: 0,
                                r: 200,
                                num: 0,
                                startX: 300,
                                startY: 0
                        })
                }, 350);
                // 滑鼠移動的位置控制祖瑪旋轉位置
                var iRotate = 0;
                oC.onmousemove = function(ev){
                        var ev = ev || window.event;
                        var x = ev.clientX - oC.offsetLeft;
                        var y = ev.clientY - oC.offsetTop;

                        var a = x - 300;
                        var b = y - 200;
                        var c = Math.sqrt(a*a + b*b);

                        if(a>0 && b>0){
                                iRotate = Math.asin(b/c) + 90*Math.PI/180;
                        }else if(a>0){
                                iRotate = Math.asin(a/c);
                        }

                        if(a<0 && b>0){
                                iRotate = -(Math.asin(b/c) + 90*Math.PI/180);
                        }else if(a<0){
                                iRotate = Math.asin(a/c);
                        }
                }
                // 子彈建立
                var bullets = [];
                oC.onmousedown = function(ev){
                        var ev = ev || window.event;
                        var x = ev.clientX - oC.offsetLeft;
                        var y = ev.clientY - oC.offsetTop;

                        var a = x - 300;
                        var b = y - 200;
                        var c = Math.sqrt(a*a + b*b);

                        var speed = 5;
                        var xSpeed = speed * a/c;
                        var ySpeed = speed * b/c;

                        bullets.push({
                                x: 300,
                                y: 200,
                                xSpeed: xSpeed,
                                ySpeed: ySpeed
                        });
                }
        }

        // 碰撞
        function collision(x1, y1, x2, y2){
                var a = x1 - x2;
                var b = y1 - y2;
                var c = Math.sqrt(a*a + b*b);

                if(c < 40){
                        return true;
                }else{
                        return false;
                }
        }
};
</script>
</head>

<body>
        <div id="div1">
                <canvas id="c1" width="600" height="600"></canvas>
        </div>
</body>
</html>