zoukankan      html  css  js  c++  java
  • 微信小游戏_flappy_bird

    1:单例模式实现 //data类,director类实现,

    2:静态方法实现 //精灵类

    3:ES6面向对象,类本身是一个函数,方法和属性作为原型链的方法存在的。

    4:ES5面向对象,ES6面向对象

    ES5继承实现(寄生组合继承)//调用一个对象的方法,用call,apply来用另一个对象替换

    //寄生组合继承
     
    function  Person(name,age) {
          this.name = name;
          this.age = age;
      }
      Person.prototype.Say = function () {
          console.log(this.name,this.age);
      }

      let s = new Person("张",12)
      let s2 = {
          name:"小名",
          age:12
      }
      s.Say.call(s2)

    5:游戏实现

    1:封装,资源封装(dataStore),资源的加载(FristLoad),背景图的绘制,地面的绘制

    2:重绘API requestAnimationFrame(()=>this.run());

    //在游览器刷新之前进行刷新,性能比较高

    3:小游戏实现原理:整张图重绘(本质就是不断的重绘刷新)

    //了解一下export export default的区别一个引人加{},export default则不需要

    4:绘制:

    (1)背景图绘制

    (2)地板绘制 解决问题:1:绘制位置问题,不停移动位置

     (3)铅笔绘制 解决问题:随机的高度,绘制的高度,2组铅笔同时的显示(X坐标要一致),铅笔要被地板盖住(canvas绘制图形的位置问题),铅笔要能重复绘制,

    //随机高度问题:top值设置一个中间数值,最高不能有一半高度,   
     const minTop = window.innerHeight/8;
    const maxTop = window.innerHeight/2;
    const top = minTop + Math.random() * (maxTop - minTop);

    //铅笔同时对于,上下就是X坐标相同,重复绘制也就是,在进行创建一组铅笔进入数组,在前面绘制的数组超过边界的时候把其销毁。

    const pencils = this.dataStore.get('pencils');
     //判断数组是否越界,X横坐标,初始值在窗口的右侧
     
    if((pencils[0].x + pencils[0].width) <=0&& pencils.length ===4 ){
          console.log(2222);
          //pencils.length==4 代表是两组坐标,移出
         
    pencils.shift();
          pencils.shift();//推出数组的第一个元素,并且把数组的个数减一
     
    }
    //创建
     
    if(pencils[0].x <=(window.innerWidth - pencils[0].width)/2 && pencils.length === 2 ){
          this.createPencil();
      }

    内存释放功能:添加一个GameOver属性 //用来清除定时器。释放内存

    (4)小鸟的三种状态的绘制,剪裁的宽高,加速度重力下落的效果(这个很关键),点击事件会上升的效果,小鸟和铅笔模型的建立过程以及碰撞检测。

    const speed = 0.2; //模拟切换的速度

            this.count = this.count + speed;

            //模拟的速度

            if(this.index >=2){

                this.count = 0; //每次到第三个小鸟在重复绘制

            }

            this.index = Math.floor(this.count); //向下摄取,保证index能在数组中去到

            const  g = 0.98/2.4;//重力

            const  offsetUp = 30; //保障小鸟下落的时候,能够先向上偏移一点距离

            const  offsetY = (g*this.time*(this.time - offsetUp)) / 2;

            //遍历改变偏移;

            for(let i=0;i<3;i++){

                this.birdsY[i] = this.y[i] + offsetY;

            }

            this.time++;

    //绑定一个事件,点击屏幕的时候,小鸟会上升

    this.index = Math.floor(this.count);
    const  g = 0.98/2.4;//重力
    const  offsetUp = 30;
    const  offsetY = (g*this.time*(this.time - offsetUp)) / 2;

    加速度:本质上随着时间的增加,下降的速度回越来越快其实本质是上,Y偏移量越来越大,但是开始有上升-y,本质是const  offsetUp = 30;下降的时候抬升,利用吃时候,time和使用开始的位置可以让小鸟上升。

      birdsEvent(){

            //处理小鸟点击的时候向上飞;

              for(let i=0;i<=2;i++){

                  this.dataStore.get('birds').y[i] = this.dataStore.get('birds').birdsY[i]; //真正偏移的高度

                  console.log(this.dataStore.get('birds').y[i]); //开始的高度

              }

            this.dataStore.get('birds').time = 0;

    }

    小鸟碰撞检测:地板检测和铅笔碰撞检测。

    地板检测:判断条件:小鸟偏移Y坐标+他自己的高度超过了地板的Y坐标游戏结束。  if(this.dataStore.get('birds').birdsY[0]+this.dataStore.get('birds').birdsHeight[0] >=this.dataStore.get('land').y) { this.isGameOver = true;  }

    铅笔碰撞检测:

    //绘制出小鸟的边框模型:小鸟的上下左右的位置,不是CSS的定位的属性,是canvas,原点的相对位置

    const birdsBorder = {

                 top: birds.y[0],

                 bottom: birds.birdsY[0] + birds.birdsHeight[0],

                 left: birds.birdsX[0],

                 right: birds.birdsX[0] + birds.birdsWidth[0]

             };

    //绘制铅笔的位置。

    //铅笔是循环里面的数值,因为铅笔的模型很多,上下一对,一共2租,鸟只有一个

    for (let i = 0; i < length; i++) {

                 const pencil = pencils[i];

                 const pencilBorder = {

                     top: pencil.y,

                     bottom: pencil.y + pencil.height,

                     left: pencil.x,

                     right: pencil.x + pencil.width

                 };

                 if (Director.isStrike(birdsBorder, pencilBorder)) {

                     console.log('撞到水管啦');

                     this.isGameOver = true;

                     return;

                 }

             }

    //判断条件,小鸟的头部撞到铅笔的头部,小鸟的地步撞到下铅笔的地步,小鸟的左部分撞到铅笔的右部分,小鸟的右部分撞到铅笔的左部分。

    (5)计分分数类

     1:什么时候加分,在越过铅笔的时候开始加分(不能发生碰撞的时候进行检测)

     2:控制加分的速度,因为canvas刷新评率很快所以需要设计一个flag来标志能否加分。

    //经过检测之后,如果小鸟的左边超过了铅笔的右边没有碰撞上就可以算加分成功,

    (6)源码地址:https://github.com/Hightinstance/project/tree/master/wx_game/flappy_bird    //源码写了详细的注释

  • 相关阅读:
    ES权威指南1
    JS易错知识点
    配置中心
    Elasticsearch 2.3.2 从oracle中同步数据
    Logstash同步Oracle数据到ElasticSearch
    从Oracle到Elasticsearch
    JS实现音乐播放器
    压力测试
    spring boot + quartz 集群
    用户体验很好的密码校验js
  • 原文地址:https://www.cnblogs.com/love-life-insist/p/10207387.html
Copyright © 2011-2022 走看看