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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值