使用微信小程序来完成一个小游戏需要有四个阶段
<!--
打开小程序后会判断用户是否登录,如果登录显示用户信息,如果未登录,显示登录按钮,
并在登录按钮内设置open-type="getUserInfo" bindgetuserinfo="getInfo"用来获取用户信息
-->
<view wx:if="{{!isLogin}}">
<button type="primary" open-type="getUserInfo" bindgetuserinfo="getInfo">点击登录</button>
</view>
<view class="userContainer">
<!-- 用户具体有几个由后台数据决定,所以在这里使用for循环来写用户信息,可以将多个用户一起渲染到页面 -->
<view class="userItem" wx:for="{{userArr}}" wx:key="key">
<image src="{{item.avatarUrl}}"></image>
<text>昵称:{{item.nickName}}</text>
<text>分数 : {{item.tapTime}}</text>
<text>{{message}}</text>
</view>
</view>
<button type="primary" bind:touchstart="startTime" bind:touchend="endTime">点击3秒按钮</button>
/* pages/game/index.wxss */
.userContainer{
display: flex;
justify-content: center;
}
.userItem{
display: flex;
flex-direction: column;
align-items: center;
margin: 15rpx;
}
.userItem image{
width: 150rpx;
height: 150rpx;
border-radius: 50%;
}
data: {
isLogin: false, // 判断用户是否登录
userInfo: {}, // 存放用户信息
userArr: [], // 存放用户数据用来渲染给页面
message: "", // 提示用语
startTime: null // 按下按钮时的时间
},
// 获取openid
getOpenId() {
// 因为获取openId的使用场景比较多,比如说用来作为存放用户信息的key键、获取用户信息的key键,所以我们将它封装为一个函数
return new Promise((resolve, reject) => {
wx.login({// 登录,调用接口获取登录凭证(code)通过凭证进而获取openId(需要使用code换取openId)
success: (result) => {
let code = result.code;
wx.request({// 发起网络请求,通过code换取openId
url: `https://api.weixin.qq.com/sns/jscode2session?appid=wxb49315418db7e879&secret=d40f63610573267e4293be7c09aaf18e&js_code=${code}&grant_type=authorization_code`,
success: res => {
let openid = res.data.openid
resolve(openid);
},
fail(err) {
reject(err)
}
})
}
});
})
},
async getInfo() {
let userInfo = await this.getUserInfo();
let openId = await this.getOpenId();
userInfo.openid = openId;
this.getSocket(userInfo);
// 存储用户信息
wx.setStorage({
data: userInfo,
key: openId,
})
},
// 获取用户信息
getUserInfo() {
// 因为获取用户我们要用到的地方比较多,比如说页面加载时或者每次按下按钮时都需要使用,所以封装为一个函数
return new Promise((resolve, reject) => {
wx.getUserInfo({ // 获取用户信息,调用前需要用户授权
success: (res) => {
let userInfo = res.userInfo;
resolve(userInfo);
},
fail(err) {
reject(err)
}
})
})
},
// 创建一个 WebSocket 连接。
wx.connectSocket({
// url: 'ws://192.168.2.109:8080', // wifi版ip
url: 'ws://192.168.1.100:8080', // 网线版ip
});
// 连接成功
wx.onSocketOpen(async (result) => {
console.log("连接成功");
// 连接成功后获取openid并通过openid作为key键,来获取到存放在本地的用户信息
// 然后判断是否有该用户,如果有,将他所有信息传递给后端,如果没有就显示登录页面
let openid = await this.getOpenId();
let userInfo = wx.getStorageSync(openid);
console.log(userInfo)
if (userInfo) {
this.getSocket(userInfo);
} else {
this.setData({isLogin:false});
}
// if(wx.getStorageSync(openid)){
// let userInfo = await this.getUserInfo();
// // console.log(userInfo)
// this.getSocket(userInfo)
// }
})
// 给后端发送信息并监听后端返回的信息
getSocket(userInfo){
wx.sendSocketMessage({
data: JSON.stringify(userInfo),
});
wx.onSocketMessage((result) => {
let userArr = JSON.parse(result.data);
console.log(userArr)
if(userArr.length > 1){
userArr = [userArr[1]]
}
this.setData({
isLogin:true,
userArr
})
});
},
// 按下
startTime() {
let startTime = new Date().getTime();
this.setData({
startTime
})
},
// 抬起
async endTime() {
let endTime = new Date().getTime();
let tapTime = ((endTime - this.data.startTime) / 1000);
if (tapTime > 0 && tapTime <= 1) {
this.setData({
message: "您可真快"
});
} else if (tapTime > 1 && tapTime <= 2.9) {
this.setData({
message: "还差点哦"
});
} else if (tapTime > 2.9 && tapTime <= 3.1) {
this.setData({
message: "哇,大佬!!!"
});
} else if (tapTime > 3.1) {
this.setData({
message: "您已超时了~"
});
}
// 更新分数,并发送给服务器
// this.setData({'userInfo.tapTime':tapTime});
let userInfo = await this.getUserInfo();
userInfo.tapTime = tapTime;
this.getSocket(userInfo);
},
let Ws = require("ws").Server;
let wss = new Ws({
port: 8080
});
// 监听是否有链接 接入
wss.on("connection", function (ws) {
console.log("我被连接了~~~");
});
ws.on("message", res => {
console.log(res);
});
if (result.length === 0) {
// 没有连接过
userArr.push(userInfo);
} else {
// 有连接者,更新分数
for (let i = 0; i < userArr.length; i++) {
if (userArr[i].openid === openid) {
userArr[i] = userInfo
}
}
};
ws.on("close", () => {
// 关闭请求socket和数据
delete Sockerobj[openid];
// 删除用户的信息
userArr = userArr.filter(user => { user.openid !== openid });
// 对所有的socket连接者发送广播
for (let key in Sockerobj) {
Sockerobj[key].send(JSON.stringify(userArr));
}
})
// 对所有的socket连接者发送广播
for (let key in Sockerobj) {
Sockerobj[key].send(JSON.stringify(userArr));
}