界面效果如下:



 

主程序入口问game.js
import './js/libs/weapp-adapter' import './js/libs/symbol' import Main from
'./js/main' console.log(GameGlobal) GameGlobal.wsServerUrl =
"ws://127.0.0.1:7397"; GameGlobal.httpServerUrl =
"http://127.0.0.1:8090/lpmajiang/"; new Main()
在game.js文件中主要设定了一些常量以及游戏入口类main.js

main.js主要内容为用户授权,游戏界面渲染,事件处理(主要为触摸事件)

用户授权代码如下:
let button = wx.createUserInfoButton({ //创建用户授权按钮,注意:wx.authorize({scope:
"scope.userInfo"}),无法弹出授权窗口 type: 'text', text: '获取用户信息', style: { left: 10,
top: 76, width: 200, height: 40, lineHeight: 40, backgroundColor: '#ff0000',
color: '#ffffff', textAlign: 'center', fontSize: 16, borderRadius: 4 } })
button.onTap((res) = > { //获取用户信息 })
界面渲染代码:
restart() { this.bindLoop = this.loop.bind(this) //绑定渲染事件 this.hasEventBind =
false this.aniId = window.requestAnimationFrame(//界面重绘时执行 loop方法 this.bindLoop,
canvas ) } // 实现游戏帧循环 loop() { ctx.clearRect(0, 0, canvas.width, canvas.height)
window.cancelAnimationFrame(this.aniId); //由于小游戏里面没有页面跳转,只能通过变量去设定渲染的界面 if
(window.pageIndex == 1){//主页面 this.index.render()//主界面渲染 } else if
(window.pageIndex == 2) { //房间界面 this.room.render()//游戏房间渲染 } this.aniId =
window.requestAnimationFrame( this.bindLoop, canvas ) }
游戏主界面index.js

index.js主要为容器类,用来存放各种组件

index.js代码如下:
import BackGround from './frame/index/background' //背景类 import Music from
'./runtime/music' //主打音乐类 import Header from './frame/index/header' //头部 import
Bottom from './frame/index/bottom' //底部 import Right from './frame/index/right'
//右侧部分 const systemInfo = wx.getSystemInfoSync() canvas.width =
systemInfo.windowWidth * 2 canvas.height = systemInfo.windowHeight * 2 const
header_width = canvas.width const header_height = 50 const bottom_width =
canvas.width * 0.9 const bottom_height = 120 const right_width = canvas.width /
2 const right_height = canvas.height - header_height - bottom_height /** *
pengweikang 20180725 主页 */ export default class Index { constructor(ctx,_this)
{ this.ctx = ctx this.parent = _this } /** * 初始化 */ init(){ //
维护当前requestAnimationFrame的id this.background = new BackGround(this.ctx)
this.header = new Header(this.ctx, header_width, header_height) //头部
this.bottom = new Bottom(this.ctx, bottom_width, bottom_height) //底部 this.right
= new Right(this.ctx, right_width, right_height) //右边部分 this.aniId = 0
this.hasEventBind = false if (!this.hasEventBind) { this.hasEventBind = true
this.touchStartHandler = this.touchStartEventHandler.bind(this)
this.touchEndHandler = this.touchEndEventHandler.bind(this)
canvas.addEventListener('touchstart', this.touchStartHandler)
canvas.addEventListener('touchend', this.touchEndHandler) } } restart() {
canvas.removeEventListener( 'touchstart', this.touchStartHandler )
canvas.removeEventListener( 'touchend', this.touchEndHandler )
this.hasEventBind = false } //屏幕触摸开始事件,将该事件传入子组件,判断该触摸是否在子主键范围之内
touchStartEventHandler(e) { e.preventDefault()
this.bottom.touchStartHandler(e)//底部菜单点击开始事件
this.right.touchStartHandler(e)//底部菜单点击开始事件 this.hasEventBind = false }
//屏幕触摸结束事件,将该事件传入子组件,判断该触摸是否在子主键范围之内 touchEndEventHandler(e) {
e.preventDefault() this.bottom.touchEndHandler(e)//底部菜单点击结束事件
this.right.touchEndHandler(e)//底部菜单点击结束事件 this.hasEventBind = false }
//界面渲染,主要渲染子组件 render() { this.background.render(this.ctx)
this.header.render(0, 0) this.bottom.render(canvas.width * 0.05, canvas.height
- bottom_height) this.right.render(canvas.width / 2, header_height) } }
处理点击事件代码
//判断开始是否点中按钮 isStartSelected(e){ let x = e.touches[0].clientX*2 let y =
e.touches[0].clientY*2 let area = this.area() if (x >= area.startX && x <=
area.endX && y >= area.startY && y <= area.endY){ //点中按钮 this.startSelect =
true this.oldParam = { width: this.width, height: this.height, x: this.x, y:
this.y } this.x = this.x + this.width * scal_radio/2 this.y = this.y +
this.height * scal_radio/2 this.width = this.width - this.width * scal_radio
this.height = this.height - this.height * scal_radio } } //判断结束是否点中按钮
isEndSelected(e) { let x = e.changedTouches[0].clientX * 2 let y =
e.changedTouches[0].clientY * 2 let area = this.area() if (x >= area.startX &&
x <= area.endX && y >= area.startY && y <= area.endY) { return true //点中按钮 }
return false //没有点中 } //点击开始事件 startClick(e) { if (this.isStartSelected(e)) {
this.startAnimation() //启动动画 } }
效果如下: