一天时间折腾出来的砸屏小游戏

2018-08-14  本文已影响0人  米筷应用

    今天尝试试用了一下公司刚开发出来的“米筷轻应用开发平台”,目前产品只有一个bbs.mkuai.net的论坛,基于平台下折腾了几个小时,才撸出一个微信砸屏小游戏,平台还没有推向市场,在做小游戏的过程中,也遇到不少的坑。全WEB的开发工具,写代码很方便,但是在浏览器下调试小程序,还不是很成熟的,部份官网的API还不能够准确的识别,只好用开发平台开发,再结合微信官方的开发工具调试、预览。很有新意的是,只要一个浏览器就可以做小程序与小游戏,并可以基于平台上做后端管理。

小游戏登录成功后,自动在会员管理里给我增加了一个用户,省得我去写

(会员管理)

最喜欢的是,有个监控后台,可以统计应用访问数据。

(应用监控)

以下是效果图与视频,不是很成熟的代码。

砸屏游戏小视频

(代码编辑与调试效果图)

    是基于微信小游戏打飞机游戏的Demo的基础下重写的,刚开始写的时候非常的不适应,花了差不多一个多小时才适应过来,不过微信关闭界面的时候提供了退出事件,但我怎么加都不起反应,很郁闷!导致关闭界面后,游戏线程还在跑,研究半天没搞清楚什么情况。

(微信小游戏API)

以下是主函数的部份代码:

import Player from './player/player'

import DataBus from './databus'

import BackGround from './runtime/background'

import GameInfo from './runtime/gameinfo'

/**

* 游戏主函数

*/

let ctx = canvas.getContext('2d')

let databus = new DataBus()

export default class Main {

  constructor() {

    // 维护当前requestAnimationFrame的id

    this.aniId = 0

    this.restart()

  }

  restart() {

    databus.reset()

    canvas.removeEventListener(

      'touchstart',

      this.touchHandler

    )

    this.player=null

    this.bg = new BackGround(ctx)

    this.gameinfo = new GameInfo()

    //初始化玩家

    this.initplayer(ctx)

    this.bindLoop = this.loop.bind(this)

    this.hasEventBind = false

    // 清除上一局的动画

    window.cancelAnimationFrame(this.aniId);

    this.aniId = window.requestAnimationFrame(

      this.bindLoop,

      canvas

    )

  }

  /**

    * canvas重绘函数

    * 每一帧重新绘制所有的需要展示的元素

    */

  render() {

    ctx.clearRect(0, 0, canvas.width, canvas.height)

    this.bg.render(ctx)

    //绘制砸屏效果

    databus.player.forEach((play) => {

      play.animationRender()

    });

    //绘制玩家,比效果后绘制可以保证砸屏工具在最上面

    if (this.player != null) {

      this.player.DrawPlayer(databus.gameStart)

    }

    // 游戏未开始显示开始界面

    if (!databus.gameStart) {

      this.gameinfo.renderGameStart(ctx)

      if (!this.hasEventBind) {

        this.hasEventBind = true

        this.touchHandler = this.touchEventHandler.bind(this)

        canvas.addEventListener('touchstart', this.touchHandler)

        canvas.addEventListener('onhide', function () {

          databus.gameStart=false

          this.restart();

        })

      }

    }

  }

  // 实现游戏帧循环

  loop() {

    this.render()

    this.aniId = window.requestAnimationFrame(

      this.bindLoop,

      canvas

    )

  }

  initplayer(ctx) {

    databus.player.push(new Player(ctx, "smash","audio/smash.wav"))

  }

  startgame(e) {

    let x = e.touches[0].clientX

    let y = e.touches[0].clientY

    let area = this.gameinfo.btnArea

    if (x >= area.startX

      && x <= area.endX

      && y >= area.startY

      && y <= area.endY) {

      databus.gameStart=true;

      this.player = databus.player[0];

    }

  }

  // 游戏开始后的触摸事件处理逻辑

  touchEventHandler(e) {

    e.preventDefault()

    if (!databus.gameStart) {

      this.startgame(e);

    }

  }

}

上一篇下一篇

猜你喜欢

热点阅读