http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2018/12/5 12:49:00
博文_面向对象写俄罗斯方块


    终于看完达内和妙味教程的EM、DOM和BOM这部分的内容,达内比较全,理论多,妙味讲的精简,结合web端的例子较多,相互参照着学,这个讲的不明白的地方,看完另一个,往往就明白了。不过在面向对象这块,都讲的不多,向后翻看资料发现达内有个俄罗斯方块的教程,花了几天时间,看了一遍,试着写了一遍,对面向对象的写法有点顿悟,写在这里,标记一下。

    用面向的对象的方法写程序,好处是写起来麻烦,用起来方便,据说在公司里,牛人写这个,一般人也就一般写法,说的是web端,如果做游戏,估计还是离不开对象这种写法。这种写法,不断给对象添加属性和方法,写对象方法时调用对象自己的属性时需要用this,这点需要牢记!

    俄罗斯方块中所有的方块都是按一定时间重绘出来的,用定时器,时间越短下落速度越快,下面是游戏开始的代码

init:function(){
  this.pg=$(".playground")[0];
  this.currShape=this.randomShape();
  this.nextShape=this.randomShape();
  for(var i=0;i<this.RN;i++){
   this.wall[i]=[];
  }
  
  this.score=0;
  this.lines=0;
  this.state=1;
  
  this.paint();
  this.timer=setInterval(function(){
   tetris.drop();
   tetris.paint();
  },this.interval);
  
  document.onkeydown=function(){
   var e=window.event||arguments[0];
   switch(e.keyCode){
    case 37:tetris.moveL();break; //left
    case 39:tetris.moveR();break; //right
    case 40:tetris.drop();break; //down
    
    case 38:tetris.rotateR();break; //up rotateR
    case 90:tetris.rotateL();break; //z  rotateL
    case 80:tetris.pause();break; //p  pause
    case 81:tetris.gameOver();break; //Q  gameover
    case 67:tetris.myContinue();break; //c  pause continue
    case 83: //s  again
     if(this.state==this.STATE_GAMEOVER){
      tetris.init();
      break;
     }
   }
  }
 },

方块的下落和旋转方法是定义在方块对象中的,然后在tetris的drop方法中定时调用,有意思的是旋转,实际是通过改变小方块的位置来做到的,不同的形状会有不同的旋转状态,如最长的竖条,只有两种状态,通过设定一个基点,其他小方块改变位置,这里感觉不太好描述,是这样,俄罗斯方块游戏中有七种形状,每种形状是由正方小方块组成的,七种形状通过设置小方块的位置来组成,所以,一开始就要定义好彼此间的位置关系,巧妙的是定义row和col行号和列号属性来做这件事,后面的运动,只需要遍历形状的所有小方块,让其整体移动或移动到相应位置(移动简单,旋转则需要定义不同状态,用数组)。。。

写的时候,更觉有点乱,写完后,再看,其实也没什么。

将游戏打个包放这,需要的可以下载玩玩,用浏览器打开tetris.html,就可以玩,没有音乐,没有做升级,感觉速度快了,找到代码中interval:500,这句,毫秒来的,越大越慢,改代码的话,有记事本就可以了,保存时别改文件扩展名,哈哈

游戏下载:tetris.rar

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.