经过写一个简单的东方系弹幕入门微信小游戏

了解微信小游戏

官方文档有详细的介绍html

小游戏的文件结构

咱们以新建一个官方示例说明

clipboard.png

如图 最外层除了readme外 有3个文件git

  • game.js 程序入口
  • game.json小游戏配置文件
  • project.config.json 项目设置文件

具体配置能够查看官方文档,只有这几个文件须要按照文件名格式来写,其余文件的内容和es6

clipboard.png

这个文件是官方示例中用于模拟浏览器环境的适配器,若有须要能够本身写,咱们这里沿用这个。github

入口文件 game.jsjson

import './js/libs/weapp-adapter'
import './js/libs/symbol'

import Main from './js/main'

new Main()

整个微信小游戏其实是运行在微信框架中一个原生canvas中,没有浏览器页面环境如document(这就是为何有一个模拟浏览器环境的适配器),启动时小游戏框架运行game.js,而后在main.js中基本上都是对微信小游戏api的调用及原生canvas的操做了。若是以前使用过原生canvas或者其余canvas库的同窗 立刻就能够上手开发0成本,官方开发工具也有es6=》es5的转换因此若是项目比较小都不用其余东西,直接文本编辑器修改 保存 查看 便可。canvas

图片描述

开工

  1. 音频使用原来的代码
  2. 帧定时也使用wx的回调函数api

    window.requestAnimationFrame(
          this.TimerHandel.bind(this),
          canvas
        )
  3. 引入一个canvas2d库createjs中的ease 和一个本身写的工具库浏览器

    import './js/libs/weapp-adapter'
    import './js/libs/ease'
    import './js/plugin/Math'
    
    import Main from './js/main'
    window.main = new Main();
  4. 保留原来的触摸移动飞机而且新增重力感应移动飞机微信

    this.initEvent();
    wx.startAccelerometer({ success:()=>{console.log('开始监听加速计')}});
    wx.onAccelerometerChange((res)=>{
      this.player.speedx = Math.floor(res.x*100)/10;
      this.player.speedy = Math.floor(-res.y * 100)/10;
    })
  5. 其余所有删除 基于create.js库重写;全部子弹继承一个父类app

    export default class Bullet_Super {
    
        constructor(cantiner, SHOOT_FRAME = 10,sprite_sheet) {
            this.cantiner = cantiner;
            this.shoot_frame = SHOOT_FRAME;
            this.list = [];
            this.deletelist = [];
            this.y = 0;
            this.x = 0;
    
            this.spriteSheet = new createjs.SpriteSheet(sprite_sheet);
        }
        outOfScreen(s, test) {
            if (test) {
                if (s.y > window.innerHeight + 100 || s.x > window.innerWidth + 100 || s.x < -100) {
                    this.deletelist.push(s);
                    s.visible = false;
                    return false;
                }
            }
            return true;
        }
        createSprite(anime, option, die_option) {
            let isnew = true;
            let sprite = this.deletelist.length > 0
                ? (isnew = false, this.deletelist.shift())
                : new createjs.Sprite(this.spriteSheet, anime);
            sprite.isdie = false;
            sprite.dieing_frame=0;
            sprite.diecount = 0;
            Object.assign(sprite, option);
            sprite.die = sprite.die || (() => {
                sprite.isdie = true;
                Object.assign(sprite, die_option);
            });
            !isnew
                ? (sprite.visible = true, sprite.gotoAndPlay(anime))
                : this.cantiner.addChild(sprite);
            this.list.push(sprite);
        }
        update(timeFunc, dieFunc, diedFunc, test) {
            this.list = this.list.filter((s) => {
                if (s.isdie) {
                    s.diecount++;
                    dieFunc(s);
                    if (s.diecount > (s.dieing_frame)) {
                        diedFunc(s);
                        this.deletelist.push(s);
                        s.visible = false;
                        return false;
                    }
                    return true;
                }
                timeFunc(s);
                return this.outOfScreen(s, test);
            });
        }
    }
  6. 以后就是实现各类弹幕,计分显示等

具体移步github https://github.com/lichddd/we...
b站演示https://www.bilibili.com/vide...

相关文章
相关标签/搜索