首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Canvas干游戏实践分享(十)

2012-09-02 
Canvas做游戏实践分享(十)6??? 用户交互——移动物体????? 游戏的核心在于交互,很多时候需要用户动手来操作

Canvas做游戏实践分享(十)
6??? 用户交互——移动物体

????? 游戏的核心在于交互,很多时候需要用户动手来操作游戏对象,很基本的一个操作就是移动物体。接下来我们会介绍如何拖动物体,在画布上扔物体等。

6.1??? 选择与释放对象

??????? 使用鼠标对物体的拖拽操作主要有三个步骤——鼠标进入物体范围并按下,鼠标移动及鼠标释放。这涉及到三个鼠标事件:mousedown,mousemove,mouseup。我们按此思路,仍旧以前面介绍的小球系统来实现。
??????? 首先需要检测到鼠标是否进入到小球中,为了简化处理,我们把小球看成一个与其外接矩形等效的图形。先得到小球在画布中所占据的位置。如下代码:

window.onload=function(){                var canvas=document.getElementById("canvas");                var context=canvas.getContext("2d");                var mouse=utils.captureMouse(canvas);                //定义系统环境变量               ?var top=0,left=0,right=canvas.width,left=0,bottom=canvas.height;                var fix_mouse_drag_offset_x=0;                var fix_mouse_drag_offset_y=0;                var bounce=-0.7;                var gravity=0.2;                var isMouseDown=false;                var oldX=oldY=0;               //初始化小球                var ball=new Ball(40);                               ball.x=canvas.width/2;                ball.y=canvas.height/2;                               ball.vx=Math.random()*10-5;                ball.vy=-10;                //鼠标按下时检测鼠标是否位于小球内部                canvas.addEventListener("mousedown",function(){                    if(utils.containsPoint(ball.getBounds(),mouse.x,mouse.y)){                        isMouseDown=true;                         //小球跳动处理                        fix_mouse_drag_offset_x=mouse.x-ball.x;                        fix_mouse_drag_offset_y=mouse.y-ball.y;                        //将小球置于静止状态                       ?oldX=ball.x;                        oldY=ball.y;                        mouse.vx=mouse.vy=0;                        canvas.addEventListener("mousemove",onMouseMove,false);                        canvas.addEventListener("mouseup",onMouseUp,false);                    }                },false);                               function onMouseMove(){                    ball.x=mouse.x-fix_mouse_drag_offset_x;                    ball.y=mouse.y-fix_mouse_drag_offset_x;                }                               function onMouseUp(){                    isMouseDown=false;                    canvas.removeEventListener("mousemove",onMouseMove,false);                    canvas.removeEventListener("mouseup",onMouseUp,false);                }               //计算小球被投掷后的速度                function trackVelocity(){                    ball.vx=ball.x-oldX;                    ball.vy=ball.y-oldY;                    oldX=ball.x;                    oldY=ball.y;                }               //边缘检测,碰撞出理                function checkBoundary(){                    ball.vy+=gravity;                    ball.x+=ball.vx;                    ball.y+=ball.vy;                                       if(ball.x-ball.radius<left){                        ball.x=left+ball.radius;                        ball.vx*=bounce;                    }else if(ball.x+ball.radius>right){                        ball.x=right-ball.radius;                        ball.vx*=bounce;                    }                                       if(ball.y-ball.radius<top){                        ball.y=top+ball.radius;                        ball.vy*=bounce;                    }else if(ball.y+ball.radius>bottom){                        ball.y=bottom-ball.radius;                        ball.vy*=bounce;                    }                }                               (function drawFrame(){                    window.requestAnimFrame(drawFrame,canvas);                    context.clearRect(0,0,canvas.width,canvas.height);                    //鼠标按下时,进行投掷处理,否则进行边缘检测及碰撞处理                   ?if(!isMouseDown){                        checkBoundary();                       }else{                        trackVelocity();                    }                    ball.draw(context);                })();                           };
?

?

热点排行