`
blessdyb
  • 浏览: 236419 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Canvas做游戏实践分享(八)

阅读更多

5.边界控制与摩擦力

      在大多数的游戏设计中,会有环境边界控制来帮助我们保证画布中的对象在运动的过程中不会脱离画面。同时,对象的运动环境很少会是真空的情况,所以就会存在着摩擦力阻碍物体的速度变化。

5.1    环境边界控制

      如果我们关注的运动对象在移动的过程中消失在了视窗之外,我们有两大类的选择:一种是将对象重新移动到当前的视窗中或者不再关注此对象,另一种方式是使当前的视窗跟随运动对象移动。在程序实现上,这两类很相近。下面我们主要针对第一类来进行分析。

 

设置边界

 


      运动对象的运动边界可以是整个Canvas视窗,也可以只是其中的一小块,在实现上没本质上的差异。我们假设边界为整个Canvas视窗。即:

var left = 0,
top = 0,
right = canvas.width,
bottom = canvas.height;

 
很轻易地得到边界处理的模板代码:

if (ball.x > canvas.width) {
// do something
} else if (ball.x < 0) {
// do something
}
if (ball.y > canvas.height) {
// do something
} else if (ball.y < 0) {
// do something
}
 

在对超出边界对象的处理时,我们可以将这个对象清理了,或者将其对象回收放入对象池中使用,或者将对象重新放置在画布的另一侧让其继续运动,或者使对象进行反弹。

 

清理对象


       以小球系统为例,假设我们有大量小球对象,这些小球被放置在一个数组中并初始化。如果小球运动时超出边界,则将此对象从小球数组中清理。如下:

if (ball.x – ball.radius > canvas.width ||
                       ball.x + ball.radius < 0 ||
   ball.y – ball.radius > canvas.height ||
                          ball.y + ball.radius < 0) {
      balls.splice(balls.indexOf(ball), 1);
}

 

但如果我们在之前的小球系统中加入上述代码后运行就会发现问题,下面两幅图清晰地反映了这个问题及解决方式:



第一幅图我们可以看到,小球的一半已经进入了边缘,此时我们的程序才检测出小球运动超出了画布。如第二幅图所示,我们需要特殊处理,在小球的球心离边缘的距离小于其半径时,就需要进行边缘越界处理。如下:

if (ball.x – ball.radius > canvas.width ||
                      ball.x + ball.radius < 0 ||
   ball.y – ball.radius > canvas.height ||
                       ball.y + ball.radius < 0) {
          balls.splice(balls.indexOf(ball), 1);
}
 

以下为上述原理的一个完整实现的例子:

window.onload=function(){
                var canvas = document.getElementById('canvas');
                var context = canvas.getContext("2d");
                var balls=[];
                var ballNumbers=10;
               //初始化小球
                for(var ball,i=0;i<ballNumbers;i++){
                    ball=new Ball(20);
                    ball.id="ball"+i;
                    ball.x=Math.random()*canvas.width;
                    ball.y=Math.random()*canvas.height;
                    ball.vx=Math.random()*2-1;
                    ball.vy=Math.random()*2-1;
                    balls.push(ball);
                }
               //绘制小球
                function draw(ball,pos){
                    //速度处理
                    ball.x+=ball.vx;
                    ball.y+=ball.vy;
                    //边缘检测
                    if(ball.x-ball.radius > canvas.width||
                        ball.x+ball.radius < 0||
                        ball.y+ball.radius < 0|
                        ball.y-ball.radius > canvas.height){
                        balls.splice(pos,1);
                    }
                    ball.draw(context);
                }
                //帧处理
                (function drawFrame(){
                    window.requestAnimFrame(drawFrame,canvas);
                    context.clearRect(0,0,canvas.width,canvas.height);
                    console.log(balls.length);
                    var i=balls.length;
                    while(i--){
                        draw(balls[i],i);
                    }
                })();
 

对象回收

        对于越界运动对象的回收处理与上面介绍的清理方式非常相似,只需要把清理的过程换成对象运动状态的初始化即可。如下我们以一个类喷泉式的示例来演示其原理:

window.onload=function(){
                var canvas = document.getElementById('canvas');
                var context = canvas.getContext("2d");
                var balls=[];
                var ballNumbers=300;
                var gravity=0.5;
               //初始化小球
                for(var ball,i=0;i<ballNumbers;i++){
                    ball=new Ball(2,Math.random()*0xffffff);
                    ball.x=canvas.width/2;
                    ball.y=canvas.height;
                    ball.vx=Math.random()*2-1;
                    ball.vy=Math.random()*-10-10;
                    balls.push(ball);
                }
               //绘制小球
                function draw(ball){
                   //重力及速度处理
                    ball.vy+=gravity;
                    ball.x+=ball.vx;
                    ball.y+=ball.vy;
                    //边缘处理
                    if(ball.x-ball.radius > canvas.width||
                        ball.x+ball.radius < 0||
                        ball.y+ball.radius < 0|
                        ball.y-ball.radius > canvas.height){
                        ball.x=canvas.width/2;
                        ball.y=canvas.height;
                        ball.vx=Math.random()*2-1;
                        ball.vy=Math.random()*-10-10;
                    }
                    ball.draw(context);
                }
               //帧处理
                (function animationLoop(){
                    window.requestAnimFrame(animationLoop,canvas);
                    context.clearRect(0,0,canvas.width,canvas.height);
                    console.log(balls.length);
                    for(var i=0;i<ballNumbers;i++){
                        draw(balls[i]);
                    }
                })();
            };

 如上代码,每一帧中,我们会对所有的小球对象进行绘制。在此定义了一个draw函数用来处理越界及绘制功能。首先对重力加速度进行了处理,接着对于两个坐标轴的速度进行了处理,然后检测小球是否越界(如果越界,则将其运动状态初始化),最后绘制小球。整体效果图如下:


画布扩展

        画布扩展的实现很简单,如果运动对象超出画布的右侧,则将其移动到画面的左侧(反之亦然),如果运动对象超出画布的上方,则将其移动到画面的下侧(反之亦然)。其实现原理与上述的对象回收类似。我们对之前介绍过的键盘控制飞船应用进行改造,只需要在其帧处理函数animationLoop中ship.paint(context)前加入如下的边界处理代码即可:

                    if(ship.x-ship.width/2>right){
                        ship.x=left-ship.width/2;
                    }else if(ship.x+ship.width<left){
                        ship.x=right+ship.width/2;
                    }else if(ship.y+ship.height/2<top){
                        ship.y=bottom+ship.height/2;
                    }else if(ship.y-ship.height/2>bottom){
                        ship.y=top-ship.height/2;
                    }
 

 

  • 大小: 3.2 KB
  • 大小: 4.9 KB
  • 大小: 19.2 KB
1
0
分享到:
评论

相关推荐

    HTML5 Canvas游戏开发实战

    9. **最佳实践**:分享HTML5 Canvas开发的最佳实践,包括代码组织、调试技巧以及如何确保兼容性。 10. **社区与资源**:可能还会介绍一些HTML5和Canvas的在线社区、工具、库和框架,帮助读者持续学习和提高。 总的...

    HTML5 Canvas核心技术图形、动画与游戏开发 PDF扫描版[71MB].rar

    在这个"HTML5 Canvas核心技术图形、动画与游戏开发"的PDF扫描版中,读者可以深入学习到Canvas的核心概念和实践技巧。 首先,Canvas的基本使用方法是通过JavaScript API来实现的。这个API提供了大量的绘图命令,如`...

    小程序canvasDemo

    在微信小程序中,Canvas是一个非常重要的组件,它允许开发者在...以上就是关于"小程序canvasDemo"项目中涉及的主要技术点,通过学习和实践,你可以掌握微信小程序中canvas的使用技巧,进一步提升你的小程序开发能力。

    canvas简单实例详解

    HTML5的Canvas是一个强大的绘图API,它允许开发者在网页上进行动态的、基于...随着对Canvas的深入理解和实践,你会发现它的潜力无穷无尽。在实际项目中,可以结合CSS3、WebGL等技术,构建更复杂的交互式Web应用。

    html5_canvas_塔防游戏

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。在这个“html5_canvas_...这样的实现不仅方便分享,也为开发者提供了一个学习和实践Canvas API的好平台。

    canvas+js写的绘图小程序

    《canvas+js绘制图形的实践探索》 在Web开发领域,HTML5的canvas元素提供了一种强大的机制,允许开发者在浏览器上进行动态图形绘制。这篇博文将深入探讨如何结合JavaScript,利用canvas API来构建一个简单的绘图小...

    canvas截图.zip

    这个功能在很多场景下都非常有用,比如网页分享、游戏截图、在线编辑器保存草图等。 首先,我们要了解canvas的基本用法。canvas是一个矩形画布,通过JavaScript来控制它的内容。我们可以通过`&lt;canvas&gt;`标签在HTML中...

    html5 canvas核心技术

    HTML5 Canvas是Web开发中的一个关键技术,...通过学习和实践这些HTML5 Canvas的核心技术,开发者可以构建出交互性强、视觉效果丰富的Web应用程序,无论是数据可视化、游戏开发还是艺术创作,Canvas都能提供强大的支持。

    HTML5 Canvas实战pdf下载

    9. **保存和导出**:Canvas上的内容可以导出为图像,或者使用toDataURL方法生成数据URL,方便分享和存储。 10. **实际应用**:书中实例可能涵盖游戏开发、图表绘制、数据可视化、地图应用等多个实际场景,帮助...

    canvas画图测试

    这篇博客"canvas画图测试"可能涉及了使用Canvas进行图形绘制的基础知识和实践技巧。Canvas API的使用通常包括以下几个核心知识点: 1. **Canvas元素**:在HTML中,`&lt;canvas&gt;`标签定义了一个可编程的画布,通过...

    android游戏源码分享

    2. 用户界面(UI):Android游戏通常使用自定义View或SurfaceView来实现游戏画面,结合Canvas进行绘制。UI的设计也包括菜单、暂停、设置等交互元素。 3. 图形渲染:游戏可能使用OpenGL ES进行高性能的2D或3D图形...

    HTML5 Canvas学习笔记(6)拼图游戏(数字版)

    在“HTML5 Canvas学习笔记(6)拼图游戏(数字版)”这篇博文中,作者分享了如何利用Canvas构建一个数字拼图游戏。下面我们将详细探讨这个知识点。 1. **HTML5 Canvas基础**: - Canvas是一个基于矢量图形的画布元素...

    H5游戏源码分享-跑酷游戏熊出没

    1. Canvas绘图:H5游戏常用Canvas API进行动态绘图,实现游戏场景的渲染。通过JavaScript操作Canvas的绘图方法,可以绘制角色、障碍物并实现动画效果。 2. Event Handling:JavaScript的事件监听和处理机制在游戏中...

    H5游戏源码分享-跳得更高

    H5游戏源码的分享,对于学习者来说是一次宝贵的实践机会,可以了解游戏逻辑、动画效果、用户交互等核心元素的实现方法。 【标签】"游戏":游戏是软件的一种类型,它可以提供娱乐、挑战或教育功能。H5游戏作为游戏的...

    html5 canvas 视频网站文字弹幕动画特效

    这个技术的引入极大地扩展了网页的交互性和动态性,尤其在创建复杂的动画效果和游戏场景时表现得尤为出色。在这个特定的场景中,我们讨论的是如何使用HTML5 Canvas实现视频网站的文字弹幕动画特效。 首先,我们要...

    H5自写的小游戏源码分享

    在“H5自写的小游戏源码分享”这...同时,这也是一个很好的学习实践机会,可以提升你的JavaScript编程水平,理解游戏开发中的逻辑思维和问题解决能力。不断练习和学习,你将能够创造出更多有趣、引人入胜的HTML5游戏。

    games:使用canvas api开发一堆HTML游戏以使其更好,并且仅使用HTMLCSSJS堆栈构建游戏

    HTML5 Canvas API是Web开发中的一个强大工具,它允许开发者在网页上绘制2D图形,创建动态、交互式的游戏和应用程序。在这个项目中,“games:使用canvas api...在实践中,不断探索和创新,制作出更丰富、更有趣的游戏。

    《HTML5 Canvas 开发详解(第2版)》PDF

    8. **性能优化**:分享关于Canvas性能的技巧,如批处理绘图操作、使用图像数据缓冲区和避免不必要的重绘。 9. **高级应用**:深入探讨更复杂的用例,如粒子系统、游戏开发、图表绘制和数据可视化。 10. **实践案例...

    jquery html5微信分享游戏围住神经猫游戏源码下载

    【标题】:“jQuery HTML5微信分享游戏:围住神经猫游戏源码下载” 【描述】:这个资源提供了基于jQuery和HTML5技术开发的微信分享...对于希望从事移动互联网游戏开发的初学者来说,这是一个非常有价值的实践案例。

    QMLcanvas画板鼠标画图

    通过理解和实践这个项目,开发者可以掌握QML中的2D绘图技术,以及如何结合鼠标事件来实现动态的用户交互功能。这对于开发桌面应用、游戏或者任何需要在屏幕上绘制图形的场景都具有很高的实用价值。

Global site tag (gtag.js) - Google Analytics