javaScript是一种弱类型编程语言,所以在利用它大规模编程的时候,如果因为某些设计或操作失误出错,查找调试是一个比较痛苦的事情。

我在利用canvas做游戏的时候,主要有如下几个问题。

1.this

利用js写基于(类似)oop的代码,于是乎在一个"类"里面离不开this , 但是js的类或者对象里的this有时候不怎么听话(我现在也没弄明白为什么)。例如你在一个js类里面的一个方法(函数)里调用这个类的实例变量或者方法,就需要用到 this.name或this.getName(),但是有的时候这个this失效了(我没有在方法中创建方法),一失效,程序就不能正常执行,但这个错误不符合基本的编程规则,找起来也不好找。最后,我干脆在类里面建立一个临时变量,这样写: var _this = this;

当我需要使用this的时候,我直接使用_this,例如: _this.name或_this.getName();,这样就保证我不会出错。

 

2. 继承

继承举例

/*    
 
 
本类作为所有显示对象的基类     
   
*/ 
   
 function DispObject(){ 
   
      
   
      
   this.x =  
   0; 
   
      
   this.y =  
   0; 
   
      
   //
     
   this.width =  
   0; 
   
      
   this.height =  
   0; 
   
      
   // 
    是否可见 
   
     
   this.visible =  
   true; 
   
      
   // 
    混合模式 
   
     
   this.blendMode =  
   "";     
   
      
   //
     
   this.alpha =  
   1.0; 
   
      
   
      
   // 
    坐标转化: 从父级到子级 
   
     
   this.parentToLocal = function(px,py){ 
   
          
   return {x:px -  
   this.x,y:py -  
   this.y}; 
   
     } 
   
      
   // 
    坐标转化: 从子级到父级 
   
     
   this.localToParent = function(px,py){ 
   
          
   return {x:px +  
   this.x,y:py +  
   this.y}; 
   
     } 
   
 }; 
   
// 
   
 
   //
RectShape.prototype =  
   new DispObject(); 
   
 RectShape.prototype.constructor = RectShape; 
   

 function RectShape(w,h){ 
   
      
   if(w == undefined || w ==  
   null){ 
   
         w =  
   0; 
   
     } 
   
      
   if(h == undefined || h ==  
   null){ 
   
         h =  
   0; 
   
     }     
   
 };


js中的oop是通过原型模拟的,所以在这里使用继承,你得小心。 如果一个类不会有子类,也就不会有继承,你随便 用new来产生实例是没问题的。当一个类需要被多次继承,以拓展工用,这时候你得类设计就得小心,而且在子类中创建实例如果只使用new 就很可能出错,错误的表现为(很可能是子类和父类使用同一份数据,或者多个实例会使用同一份数据) 。原因在于原型。过程是这样的,当你建立一个类的时候,你不可能全部是公开的方法或者属性(通过this.xx来定义),你需要一些私有的变量或方法,私有的变量或方法只能是临时(局部)变量或方法,在类中通过: var name = "vily";或 function init(){};来定义。当你的父类中有私用的东西的时候,你用new来创建子类,这很可能造成了,这两个实例共享这些私有数据。于是就出现错误。

解决方案是你不能用new来创建,你需要用一个方法来生成,例如



function createMovieClip(mc){ 
  
 
  
 
    MovieClip.prototype = new DispContainer(); 
  
 
  
 
    var pmc = new MovieClip(); 
  
 
  
 
    if(mc!= undefined && mc!= null){ 
  
 
  
 
    pmc.setBody(mc); 
  
 
  
 
    } 
  
 
  
 
    return pmc; 
  
 
  

    };


3.数组越界:

 数组越界是编程中的魔咒,很难摆脱。js的调试不方便性, 让这件事情变得更神秘。反正出错了就显示不正常。哈哈哈。这种逻辑相关的错误,要从逻辑设计的角度来找问题出现的可能点。