canvas游戏学习笔记(三)--打砖块

写在前面

用scratch和processing都写过打砖块,所以在逻辑上比较熟悉,区别在于编写代码的方式做了些改变。只要能正确理解JavaScript的语法,打砖块还是很快就可以写好的。


声明游戏角色

//定义砖块数组,反弹球,球拍
    var bricks=[]; 
    var player;
    var paddle;

定义游戏区域

//定义游戏区域
    var myGameArea={
        canvas:document.createElement("canvas"),   //代码生产canvas
        start:function(){                          //游戏准备
            this.canvas.width=900;
            this.canvas.height=500;
            document.body.insertBefore(this.canvas,document.body.childNodes[0]);    //canvas加入页面
            this.context=this.canvas.getContext("2d");
            this.interval=setInterval(updateGame,20);
        },
        clear:function(){                         //每一帧要清屏
            this.context.fillStyle="black";
            this.context.fillRect(0,0,this.canvas.width,this.canvas.height);
        }
    }

同样通过代码生成canvas,并定义游戏初始化和清屏。

定义游戏角色

 //定义方块,用于产生反弹球、砖块、球拍
    function box(x,y,width,height,color,speed){
        this.width=width;
        this.height=height;
        this.x=x;
        this.y=y;
        this.speed=speed;                        //移动速度(为反弹球设置)
        theta=Math.PI/2+Math.random()*Math.PI;   //初始角度(为反弹球设置)
        this.speedX=this.speed*Math.sin(theta);  //分解水平分量
        this.speedY=this.speed*Math.cos(theta);  //分解垂直分量
        //在canvas里显示
        this.show=function(){
            ctx=myGameArea.context;
            ctx.fillStyle=color;
            myGameArea.context.fillRect(this.x,this.y,this.width,this.height);
        }
        //反弹球更新位置
        this.update=function(){
            this.x+=this.speedX;
            this.y+=this.speedY;
            //检测碰到两边墙壁
            if(this.x>(myGameArea.canvas.width-this.width)||this.x<0){
                this.speedX*=-1;
            }
            //检测碰到上面墙壁
            if(this.y<0){
                this.speedY*=-1;
            }
            //检测碰到球拍
            if(this.y+this.height>paddle.y&&this.x>(paddle.x-this.width)&&this.x<(paddle.x+paddle.width)){
                this.speedY*=-1;
            }
            //检测碰到下面墙壁,游戏停止
            if(this.y+this.height>myGameArea.canvas.height){
                clearInterval(myGameArea.interval);
            }

        }
        //检测球与砖块的碰撞
        this.collision=function(obj){
            if(this.y<(obj.y+obj.height)&&this.y>(obj.y-this.height)&&this.x>(obj.x-this.width)&&this.x<(obj.x+obj.width)){
                this.speedY*=-1;
                return true;    
            }
            return false;
        }
    }

所有的游戏角色都通过box()产生。并定义了显示(show)、更新位置(update)、检测碰撞(collision)等几个函数。其中,每个角色在实例化的时候会根据自身需要选择的函数和参数。

游戏更新

//游戏更新
    function updateGame(){
        myGameArea.clear();            //清屏
        for (var i = bricks.length - 1; i >= 0; i--) {
            bricks[i].show();
            if(player.collision(bricks[i])){
                bricks.splice(i,1);    //如果该砖块碰到反弹球,就从数组中删掉
            };
        };
        player.update();  // 反弹球更新位置                            
        player.show();    //反弹球显示
        // paddle.move();
        paddle.show();    // 每一帧球拍要显示
    }

游戏更新

    //游戏更新
    function updateGame(){
        myGameArea.clear();            //清屏
        for (var i = bricks.length - 1; i >= 0; i--) {
            bricks[i].show();
            if(player.collision(bricks[i])){
                bricks.splice(i,1);    //如果该砖块碰到反弹球,就从数组中删掉
            };
        };
        player.update();  // 反弹球更新位置                            
        player.show();    //反弹球显示
        // paddle.move();
        paddle.show();    // 每一帧球拍要显示
    }

鼠标控制球拍

//鼠标移动paddle
    function paddle_move_by_mouse(event){
        var x =event.clientX;
        if(x2;  
        }   
    }

要将该事件正确绑定到onmousemove()。

你可能感兴趣的:(学习笔记,canvas学习笔记)