diff --git a/public/index.html b/public/index.html
index 5c6b5f5..30e3ced 100644
--- a/public/index.html
+++ b/public/index.html
@@ -11,17 +11,17 @@
-
+
动作:
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/config.js b/src/config.js
index c6d8915..8c851a4 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,4 +1,24 @@
+// 生成单一的动作构成数组
+const directions = (eventCode = 0) => {
+ const results = [];
+ for (let i = 0; i < 20; i++) {
+ results.push(eventCode)
+ }
+ return results;
+}
+
export const game = {
- width: 1068,
- height: 600
+ frame: {
+ width: 1068,
+ height: 600
+ },
+ count: 5, // 倒计时时长
+ game: 60, // 游戏时长
+ level: 0,
+ totalScore: 100,
+ totalTimes: 20,
+ scores: [
+ { direction: 0, score: 5 },
+ ],
+ directions: directions(),
}
diff --git a/src/frame.js b/src/frame.js
index b9302d8..9d8b2f8 100644
--- a/src/frame.js
+++ b/src/frame.js
@@ -1,4 +1,5 @@
import { game } from './config';
+import { creatData } from './message';
let frame = document.getElementById('iframe');
let contentWindow = frame.contentWindow;
@@ -7,15 +8,33 @@ let contentWindow = frame.contentWindow;
export function setFrameStyle() {
const html = document.documentElement;
frame.style.width = html.clientWidth + 'px';
- frame.style.height = Math.round(html.clientWidth * game.height / game.width) + 'px';
+ frame.style.height = Math.round(html.clientWidth * game.frame.height / game.frame.width) + 'px';
}
+// 事件功能按钮 绑定动作 发送消息
export function handleEventButtons() {
const eventButtons = document.querySelectorAll('div.events button');
eventButtons.forEach(item => {
item.addEventListener('click', function () {
- sendMessage(item.dataset.event);
+ const { event } = item.dataset;
+ if (event === 'pause' || event === 'continue') {
+ setPauseButtonStatus(item);
+ }
+ sendMessage(event);
+ })
+ })
+}
+
+// play code按钮 绑定动作 发送消息
+export function handlePlayCodeButtons() {
+ const actionButtons = document.querySelectorAll('div.actions button');
+
+ actionButtons.forEach(item => {
+ item.addEventListener('click', function () {
+ const { code } = item.dataset;
+
+ sendMessage('play', code);
})
})
}
@@ -24,6 +43,29 @@ export function handleEventButtons() {
* 发送消息
* @param {string} type 消息类型
*/
-function sendMessage(type) {
- contentWindow.postMessage({ event: 'start' }, frame.src);
+function sendMessage(type, ...args) {
+ const data = creatData(type, ...args);
+ contentWindow.postMessage(data, frame.src);
+}
+
+/**
+ * 设置 暂停/继续 按钮的状态样式等
+ * @param {HTMLElement} element
+ */
+function setPauseButtonStatus(element) {
+ const type = element.dataset.status;
+ if (+type === 0) { // 点击的是暂停
+ element.dataset.status = '1';
+ element.dataset.event = 'continue';
+ element.textContent = '继续';
+ element.classList.remove('btn-warning');
+ element.classList.add('btn-success');
+ } else {
+ // 点击的是继续 游戏
+ element.dataset.status = '0';
+ element.dataset.event = 'pause';
+ element.textContent = '暂停';
+ element.classList.remove('btn-success');
+ element.classList.add('btn-warning');
+ }
}
diff --git a/src/index.js b/src/index.js
index e9857f5..d12fe4d 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,4 @@
-import {handleEventButtons, setFrameStyle} from "./frame";
+import {handleEventButtons, handlePlayCodeButtons, setFrameStyle} from "./frame";
window.addEventListener('load', init, false)
window.addEventListener('resize', setFrameStyle, false)
@@ -6,4 +6,5 @@ window.addEventListener('resize', setFrameStyle, false)
function init() {
setFrameStyle();
handleEventButtons();
+ handlePlayCodeButtons();
}
diff --git a/src/message.js b/src/message.js
index e69de29..def0289 100644
--- a/src/message.js
+++ b/src/message.js
@@ -0,0 +1,114 @@
+import { game } from './config';
+const { count, game: gameDuration, level, scores, directions, totalScore, totalTimes } = game;
+
+let currentScore = 0; // 当前得分
+let currentTimes = 10; // 当前次数
+
+// 生成开始游戏消息需要的data数据
+const createStartData = () => {
+ const now = Date.now();
+ const countFinishTime = now + count * 1000; // 倒计时结束时间
+ const gameFinishTime = countFinishTime + gameDuration * 1000; // 游戏结束时间
+ const data = {
+ event: "start",
+ data: {
+ count: {
+ finishTime: countFinishTime, // 倒计时结束的ms数
+ duration: count, // 倒计时时长
+ },
+ game: {
+ finishTime: gameFinishTime, // 游戏结束的ms数
+ duration: gameDuration, // 游戏时长
+ totalScore, // 总分
+ totalTimes, // 总次数
+ level, // 等级 0->入门 1->简单 2->普通 3->困难
+ config: {
+ scores,
+ directions // 游戏的动作构成队列
+ }
+ },
+ status: 1, // 游戏状态 0 1 2
+ param: {}, // 额外个性化参数
+ }
+ }
+ return data;
+}
+
+/**
+ * 生成 暂停/继续 消息data数据
+ * @param {number} code 0->暂停 1->继续
+ * @returns {{}}
+ */
+const createPauseData = (code) => {
+ return {
+ event: code === 0 ? 'pause' : 'continue',
+ data: { status: code ===0 ? 3 : 1 }
+ }
+}
+
+/**
+ * 生成暂停/继续消息data数据
+ * @param {number} score 总得分 客户端传来的
+ * @param {number} times 总次数 客户端传来的
+ * @returns {{data: {score, times, param: {}, status: number}, event: string}}
+ */
+const createFinishData = (score=currentScore, times=currentTimes) => {
+ return {
+ event: 'finish',
+ data: {
+ score, // 得分
+ times, // 次数
+ status: 2, // 游戏状态 0 1 2
+ param: {}, // 额外个性化参数
+ }
+ }
+}
+
+/**
+ * 生成 play消息 发送的data数据
+ * @param {number} score 当前得分
+ * @param {number} times 当前次数
+ * @param {number} direction 事件code 0默认 共6个事件参数 0 1 2 3 4 5
+ * @returns {{data: {score: number, times: number, param: {direction: number}, status: number}, event: string}}
+ */
+const createPlayData = ({ score=currentScore, times=currentTimes , direction=0 }) => {
+ return {
+ event: "play",
+ data: {
+ score, // 得分
+ times, // 次数
+ status: 1, // 游戏状态 0 1 2
+ param: {
+ direction, // 0 1 2 3 4 5 共6中事件参数
+ }
+ }
+ }
+}
+
+// 生成提交的数据
+export const creatData = (eventType, ...args) => {
+ let data = null;
+ switch (eventType) {
+ case 'start':
+ data = createStartData()
+ break;
+ case 'pause':
+ data = createPauseData(0);
+ break;
+ case 'continue':
+ data = createPauseData(1);
+ break;
+ case 'finish':
+ data = createFinishData(); // TODO:
+ break;
+ case 'play':
+ data = createPlayData({direction: +args[0]});
+ break;
+ default:
+ break;
+ }
+ if (!data) {
+ alert('时间类型参数有误,消息数据为空');
+ }
+ return data;
+}