• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > HTML5游戏框架cnGameJS开发实录-核心函数模块篇的代码实例

HTML5游戏框架cnGameJS开发实录-核心函数模块篇的代码实例

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5,cnGameJS,核心函数等相关知识,匿名希望在学习及工作中可以帮助到您
返回目录

1.cnGameJs框架的代码组织 

  核心函数模块,主要的作用是为之后的框架开发和用户对游戏的开发提供方便,整个框架在一个闭包之中,避免对全局作用域的污染。之后每个不同的模块分别在自己的闭包内,使不同模块的分割更清晰。因此我们框架的模块划分会是这样:

(function(win,undefined){//最大的闭包

var fun1=function(){//各模块公用的方法
}

//这里放各个小模块,它们有各自的闭包

}(window,undefined)

  那么我们如何再划分其他小模块呢?为了方便各个小模块有各自的命名空间,并且在各自的闭包中,我们新增一个register方法,该方法可以在不同命名空间下扩展自己的模块,我们需要传入的首先是命名空间的名称,该方法为我们生成该命名空间对象,之后我们执行自己的方法,为命名空间对象执行相应的扩展操作:

/**
         *生成命名空间,并执行相应操作
        **/
        register:function(nameSpace,func){
            var nsArr=nameSpace.split(".");
            var parent=win;
            for(var i=0,len=nsArr.length;i<len;i++){
                (typeof parent[nsArr[i]]=='undefined')&&(parent[nsArr[i]]={});
                parent=parent[nsArr[i]];
            }
            if(func){
                func.call(parent,this);    
            }
            return parent;
        }

如上,首先可以把传入的命名空间字符串分割,然后生成对象,之后执行用户传入的函数进行扩展操作,如下:

cnGame.register("cnGame.core",function(){this.func=function(){}});

  这样就可以生成core模块,并且为该模块添加func方法,那么我们框架的代码组织看起来将是这样:

(function(win,undefined){

var cnGame={
    register:function(nameSpace,handler){

    }
}

/*core模块*/
cnGame.register("core",function(){
  //添加该模块内容
})

/*input模块*/
cnGame.register("input",function(){
  //添加该模块内容
})

win["cnGame"]=cnGame;


})(window,undefined);

  
2.框架的初始化

  框架初始化的时候,需要保存的对象分别有:canvas对象,context对象,canvas的位置,尺寸等,我们可以先看看初始化的函数:

/**
         *初始化
        **/
        init:function(id,options){
            options=options||{};
            this.canvas = this.core.$(id||"canvas");    
            this.context = this.canvas.getContext('2d');
            this.width = options.width||800;
            this.height = options.height||600;
            this.title = this.core.$$('title')[0];
            canvasPos=getCanvasPos(this.canvas);
            this.x=canvasPos[0]||0;
            this.y=canvasPos[1]||0;
            this.canvas.width=this.width;
            this.canvas.height=this.height;
            this.canvas.style.left=this.x +"px";
            this.canvas.style.top=this.y +"px";
            
        },

  非常简单,就是保存一些初始化值,方便后续使用。另外可以注意到我们调用了getCanvasPos方法来获取canvas的位置参数,该参数循环获取对象的offsetParent,并叠加offsetLeft和offsetTop,从而得到canvas在页面的位置。该函数源码如下:

/**
    *获取canvas在页面的位置
    **/      
    var getCanvasPos=function(canvas){
        var left = 0;
        var top = 0;
        while (canvas.offsetParent) {
            left += canvas.offsetLeft;
            top += canvas.offsetTop;
            canvas = canvas.offsetParent;

        }
        return [left, top];

    }

3.工具函数模块

  之后我们就可以用上面的register方法添加第一个模块:core模块。该模块也很简单,主要功能就是添加工具函数,方便后续的框架开发和用户的游戏开发。这里包含了一些常用的工具函数,例如通过id获取元素,原型继承,对象复制,事件绑定等等。注意如果涉及不同浏览器的兼容问题,我们可以一开始就根据浏览器设置function,而不是每次都判断浏览器类型再进行相应操作,效率会更加高。拿事件绑定进行举例:

/**
        事件绑定
        **/
        this.bindHandler=(function(){
                            
                        if(window.addEventListener){
                            return function(elem,type,handler){
                                elem.addEventListener(type,handler,false);
                                
                            }
                        }
                        else if(window.attachEvent){
                            return function(elem,type,handler){
                                elem.attachEvent("on"+type,handler);
                            }
                        }
        })();

  预先根据浏览器特性返回不同function,这样后续使用就不用再判断浏览器特性,提高效率。

  附上所有工具函数的源码,由于都很简单,所以对该模块就不在详述了。

/**
 *
 *基本工具函数模块
 *
**/
cnGame.register("cnGame.core",function(cg){
        /**
        按id获取元素
        **/
        this.$=function(id){
            return document.getElementById(id);        
        };
        /**
        按标签名获取元素
        **/
        this.$$=function(tagName,parent){
            parent=parent||document;
            return parent.getElementsByTagName(tagName);    
        };
        /**
        按类名获取元素
        **/
        this.$Class=function(className,parent){
            var arr=[],result=[];
            parent=parent||document;
            arr=this.$$("*");
            for(var i=0,len=arr.length;i<len;i++){
                if((" "+arr[i].className+" ").indexOf(" "+className+" ")>0){
                    result.push(arr[i]);
                }
            }
            return result;    
        };
        /**
        事件绑定
        **/
        this.bindHandler=(function(){
                            
                        if(window.addEventListener){
                            return function(elem,type,handler){
                                elem.addEventListener(type,handler,false);
                                
                            }
                        }
                        else if(window.attachEvent){
                            return function(elem,type,handler){
                                elem.attachEvent("on"+type,handler);
                            }
                        }
        })();
        /**
        事件解除
        **/
        this.removeHandler=(function(){
                        if(window.removeEventListerner){
                            return function(elem,type,handler){
                                elem.removeEventListerner(type,handler,false);
                                
                            }
                        }
                        else if(window.detachEvent){
                            return function(elem,type,handler){
                                elem.detachEvent("on"+type,handler);
                            }
                        }
        })();
        /**
        获取事件对象
        **/
        this.getEventObj=function(eve){
            return eve||win.event;
        };
        /**
        获取事件目标对象
        **/
        this.getEventTarget=function(eve){
            var eve=this.getEventObj(eve);
            return eve.target||eve.srcElement;
        };
        /**
        禁止默认行为
        **/
        this.preventDefault=function(eve){
            if(eve.preventDefault){
                eve.preventDefault();
            }
            else{
                eve.returnValue=false;
            }
            
        };
        /**
        获取对象计算的样式

  


 

您可能想查找下面的文章:

  • HTML5知识点总结
  • HTML5的本地存储
  • HTML5本地存储之IndexedDB
  • Html5实现文件异步上传功能
  • Html5新标签datalist实现输入框与后台数据库数据的动态匹配
  • 详解HTML5 window.postMessage与跨域
  • HTML5拖放API实现拖放排序的实例代码
  • 解决html5中video标签无法播放mp4问题的办法
  • HTML5新特性 多线程(Worker SharedWorker)
  • Html5新增标签有哪些

相关文章

  • 2017-08-06HTML5本地数据库基础操作详解
  • 2018-12-03最新的h5标签datalis的使用方法介绍
  • 2018-12-03详细介绍html5小游戏制作思路的代码实例
  • 2018-12-03详解H5和HTML4的区别
  • 2018-12-03对于一个高中学历前端开发工程师,在北京这样的大城市,该不该耗费精力自考一个本科学历?
  • 2017-08-06html5拖曳操作 HTML5实现网页元素的拖放操作
  • 2018-12-03腾讯干货!科普最常用的八种HTML5动效制作手法
  • 2018-12-03html5菜单折纸效果_html5教程技巧
  • 2018-12-03浅谈HTML5语义元素的实例教程
  • 2018-12-03关于wxcanvas的内容推荐

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • HTML5实战与剖析之媒体元素(3、媒体元素的事件及方法)
    • html5之canvas起步的代码示例详解(图)
    • 五分钟学会HTML5!(一)
    • html5 canvas实现简单的双缓冲
    • html5 input输入实时检测以及延时优化
    • H5实现桌面通知以及提示功能的实例
    • HTML5之HTML元素扩展(上)—新增加的元素及使用概述_html5教程技巧
    • canvas实现九宫格心形拼图的方法(附代码)
    • HTML5技术之图像处理:一个滑动的拼图游戏
    • HTML5 组件Canvas实现电子钟的图文代码详情介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有