|
@@ -0,0 +1,1586 @@
|
|
|
+11
|
|
|
+<!-- 新版本拳击区域部分文件 -->
|
|
|
+<template>
|
|
|
+ <view style="width: 750rpx;">
|
|
|
+ <view class="flex justify-center" style="margin-top: 68rpx;">
|
|
|
+ <!-- 目前格子数量不代表数字,显示完成度而已 -460rpx;-->
|
|
|
+ <view class="grid-progress-vertical-container" style="top:-376rpx;">
|
|
|
+ <view class="grid-progress-vertical-bar">
|
|
|
+ <view class="grid-progress-vertical-child" v-for="(item, index) in maxShowCount +1" :key="index"
|
|
|
+ v-if="index!==0">
|
|
|
+ <view
|
|
|
+ :class="showCurCount>=index? 'grid-progress-vertical-active':'grid-progress-vertical-inactive'">
|
|
|
+ </view>
|
|
|
+ <view :class="(index%5 == 0||index == 1)?'':'grid-progress-text-hidden'"
|
|
|
+ class="grid-progress-vertical-text" style="position: absolute;right: 0;top: -4px;">
|
|
|
+ {{Math.floor(taskSignCount / 26 * index)}}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="grid-progress-vertical-bar">
|
|
|
+ <view class="grid-progress-vertical-child" v-for="(item, index) in maxShowCount +1" :key="index"
|
|
|
+ v-if="index!==0">
|
|
|
+ <view :class="(index%5 == 0||index == 1)?'':'grid-progress-text-hidden'"
|
|
|
+ class="grid-progress-vertical-text" style="position: absolute;left: 0;top: -4px;">
|
|
|
+ {{Math.floor(taskSignCount / 26 * index)+taskSignCount/2}}
|
|
|
+ </view>
|
|
|
+ <!-- 设置空位 -->
|
|
|
+ <view></view>
|
|
|
+ <view
|
|
|
+ :class="showCurCount>=index+13? 'grid-progress-vertical-active':'grid-progress-vertical-inactive'">
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <!-- class="position-relative" -->
|
|
|
+ <view style="position: relative;">
|
|
|
+ <view class="position-absolute-left-top flex justify-center align-center " style="width: 86.12px;height:55.96px;
|
|
|
+ left: 146rpx;top:-90rpx; ">
|
|
|
+ <view style="transform: scale(0.5);">
|
|
|
+ <view class="sprite-yellow-arrow " :class="bRuning?'animation-play-state-play':''"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="position-absolute-right-bottom flex justify-center align-center "
|
|
|
+ style="width: 317rpx; height:138px; right: 46rpx; bottom: 15rpx;">
|
|
|
+ <view class="flex flex-direction justify-between" style="transform: scale(0.5); height: 276px; ">
|
|
|
+ <block v-if="bJumpPlay">
|
|
|
+ <view class="sprite-rightToLeftArrow" :class="bJumpPlay?'sprite-rightToLeftArrow-play':''">
|
|
|
+ </view>
|
|
|
+ <view class="sprite-rightToLeftArrow" :class="bJumpPlay?'sprite-rightToLeftArrow-play':''">
|
|
|
+ </view>
|
|
|
+ </block>
|
|
|
+ <block v-else>
|
|
|
+ <image style="width: 317px; height: 42px;"
|
|
|
+ src="../../../static/modal/action-jump/progress-tip.png"></image>
|
|
|
+ <image style="width: 317px; height: 42px;"
|
|
|
+ src="../../../static/modal/action-jump/progress-tip.png"></image>
|
|
|
+ </block>
|
|
|
+
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <canvas canvas-id="actionHitCanvas" :style="{ width: canvasW + 'px', height: canvasH + 'px' }"></canvas>
|
|
|
+ </view>
|
|
|
+ <view style="position: absolute;
|
|
|
+ top: 30px;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;">
|
|
|
+ <!-- class="position-absolute-center" -->
|
|
|
+ <canvas canvas-id="effectHitCanvas" :style="{ width: canvasW + 'px', height: '164px' }"></canvas>
|
|
|
+ </view>
|
|
|
+ <view class="flex align-center justify-center" style="font-size: 14px; width:750rpx;">
|
|
|
+ <view style="position: relative;">
|
|
|
+ <image style="width: 135px;height: 75px;" src="../../../static/modal/action-jump/Fill.png"></image>
|
|
|
+ <view class="mid-absolute flex flex-direction align-center justify-center text-white">
|
|
|
+ <view class="flex align-center">
|
|
|
+ <image style="width: 22rpx;height: 28rpx;"
|
|
|
+ src="../../../static/modal/action-jump/jumpSpeed.png"></image>
|
|
|
+ <view style="margin-left: 6rpx;">平均速度</view>
|
|
|
+ </view>
|
|
|
+ <view style="margin-top: 12rpx;">{{averageSpeed}}</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view id="ActionJumpPlay" class="flex" style="position: relative;" @click="onControllerPlay">
|
|
|
+ <image style="width: 110px;height: 110px;"
|
|
|
+ src="../../../static/modal/action-jump/mid-button-orange@2x.png">
|
|
|
+ </image>
|
|
|
+
|
|
|
+ <image v-if="!bJumpPlay" class="mid-absolute" style="left:12rpx; width: 56rpx;height: 70rpx;"
|
|
|
+ src="../../../static/play.png">
|
|
|
+ </image>
|
|
|
+ <image v-else class="mid-absolute" style="width: 100rpx;height: 100rpx;"
|
|
|
+ src="../../../static/e-pause.png">
|
|
|
+ </image>
|
|
|
+ </view>
|
|
|
+ <view style="position: relative;">
|
|
|
+ <image style="width: 135px;height: 75px; transform: scaleX(-1);"
|
|
|
+ src="../../../static/modal/action-jump/Fill.png"></image>
|
|
|
+ <view class="mid-absolute flex flex-direction align-center justify-center text-white">
|
|
|
+ <view class="flex align-center">
|
|
|
+ <image style="width: 22rpx;height: 28rpx;"
|
|
|
+ src="../../../static/modal/action-jump/jumpCalorie.png"></image>
|
|
|
+ <view style="margin-left: 6rpx;">卡路里</view>
|
|
|
+ </view>
|
|
|
+ <view style="margin-top: 12rpx;">{{Math.floor(jumpCalorie)}}</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="flex align-center justify-center" style="width: 750rpx;margin-top: 16rpx;">
|
|
|
+ <view class="flex justify-center align-center" style="height: 120rpx; width: 444rpx; ">
|
|
|
+ <view class="text-12px text-white text-center">
|
|
|
+ {{taskDescribe}}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <!-- #ifdef H5 -->
|
|
|
+ <view style="display: flex;justify-content: space-between;" class="margin-top margin-bottom">
|
|
|
+ <button @click="onJumpType(0)">middle</button>
|
|
|
+ <button @click="onJumpType(1)">left</button>
|
|
|
+ <button @click="onJumpType(2)">right</button>
|
|
|
+ </view>
|
|
|
+ <!-- #endif -->
|
|
|
+ </view>
|
|
|
+
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+ import {
|
|
|
+ CONDITIONPASSED
|
|
|
+ } from "@/util/util-js/enum.js"
|
|
|
+
|
|
|
+ import Firework from "@/util/util-js/effect/firework.js"
|
|
|
+ import Animation from "@/util/util-js/Animation.js"
|
|
|
+ import puchConfig from "@/util/util-js/puchConfig.js"
|
|
|
+
|
|
|
+ import {
|
|
|
+ mapState,
|
|
|
+ mapMutations
|
|
|
+ } from 'vuex';
|
|
|
+
|
|
|
+ export default {
|
|
|
+ computed: mapState(['systemInfo', 'bOldDeviceType']),
|
|
|
+ components: {
|
|
|
+
|
|
|
+ },
|
|
|
+ props: {
|
|
|
+ showTime: {
|
|
|
+ type: Number,
|
|
|
+ default: 0
|
|
|
+ },
|
|
|
+ levelData: {
|
|
|
+ type: Object,
|
|
|
+ default: null
|
|
|
+ },
|
|
|
+ currentMode: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ isY: true,
|
|
|
+ canvasW: 0, // 画布宽
|
|
|
+ canvasH: 0, // 画布高
|
|
|
+ // SystemInfo: {}, // 设备信息
|
|
|
+
|
|
|
+ directionJumpRight: null,
|
|
|
+ directionJumpLeft: null,
|
|
|
+ midJump: null,
|
|
|
+ rotateJumpRight: null,
|
|
|
+ rotateJumpLeft: null,
|
|
|
+ directionJumpWhiteRight: null,
|
|
|
+ directionJumpWhiteLeft: null,
|
|
|
+ midJumpWhite: null,
|
|
|
+ rotateJumpWhiteRight: null,
|
|
|
+ rotateJumpWhiteLeft: null,
|
|
|
+ //参考图片
|
|
|
+ cankao: null,
|
|
|
+
|
|
|
+ jumpTipImage: null,
|
|
|
+ JumpTipOrange: null,
|
|
|
+ jumpNormalLine: null,
|
|
|
+ jumpNormalRect: null,
|
|
|
+ jumpNormalWidth: 70,
|
|
|
+ jumpNormalHeight: 164,
|
|
|
+
|
|
|
+ jumpProgressTip: null,
|
|
|
+
|
|
|
+ jumpTypeArray: [{
|
|
|
+ jumpName: 'NORMAL',
|
|
|
+ jumpCode: 0,
|
|
|
+ icon: 'midJump',
|
|
|
+ scaleX: 1,
|
|
|
+ bTrigger: false,
|
|
|
+ bShow: true,
|
|
|
+ }, {
|
|
|
+ jumpName: 'LEFT',
|
|
|
+ jumpCode: 1,
|
|
|
+ icon: 'directionJump',
|
|
|
+ scaleX: 1,
|
|
|
+ bTrigger: false,
|
|
|
+ bShow: true,
|
|
|
+ }, {
|
|
|
+ jumpName: 'RIGHT',
|
|
|
+ jumpCode: 2,
|
|
|
+ icon: 'directionJump',
|
|
|
+ scaleX: 1,
|
|
|
+ bTrigger: false,
|
|
|
+ bShow: true,
|
|
|
+ }],
|
|
|
+ spawnArray: [],
|
|
|
+ deleteSpawn: null, //已删除的对象
|
|
|
+ deleteImage: null,
|
|
|
+ /**
|
|
|
+ * 生成的背景位置
|
|
|
+ */
|
|
|
+ spawnPos: [],
|
|
|
+ spawnAnimation: null,
|
|
|
+ spawnProcess: 1,
|
|
|
+
|
|
|
+ //下一个生成是相反的方向
|
|
|
+ bNextSpawnRightDirection: false,
|
|
|
+ bNextSpawnRightRotateDirection: false,
|
|
|
+
|
|
|
+ //生成预制的模板,用count 来判断生成哪一种
|
|
|
+ template: [{ //原地
|
|
|
+ count: 1,
|
|
|
+ spawnList: [
|
|
|
+ [0]
|
|
|
+ ]
|
|
|
+ }, {
|
|
|
+ count: 2,
|
|
|
+ spawnList: [
|
|
|
+ [2, 1],
|
|
|
+ [1, 2],
|
|
|
+ [3, 4],
|
|
|
+ [4, 3]
|
|
|
+ ]
|
|
|
+ }, {
|
|
|
+ count: 3,
|
|
|
+ spawnList: [
|
|
|
+ [2, 0, 1],
|
|
|
+ [1, 0, 2],
|
|
|
+ [3, 0, 4],
|
|
|
+ [4, 0, 3]
|
|
|
+ ]
|
|
|
+ }, ],
|
|
|
+ //模板对象池,管理生成对象
|
|
|
+ templatePool: [],
|
|
|
+
|
|
|
+ levelType: 0,
|
|
|
+ countdown: 60,
|
|
|
+ countdownInterval: null,
|
|
|
+
|
|
|
+ faultCount: 0,
|
|
|
+ eliminationCount: 0,
|
|
|
+
|
|
|
+ bJumpPlay: false,
|
|
|
+ jumpCalorie: 0,
|
|
|
+
|
|
|
+ averageSpeedInterval: null,
|
|
|
+ averageSpeed: 0,
|
|
|
+ tempHitCount: 0,
|
|
|
+
|
|
|
+ //硬件设备处理
|
|
|
+ BLEAccIndex: 0,
|
|
|
+ xA: 0,
|
|
|
+ yA: 0,
|
|
|
+ zA: 0,
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 交互数据处理
|
|
|
+ */
|
|
|
+ //当前选择的关卡信息
|
|
|
+ selfLevelData: null,
|
|
|
+ // 双人模式下 数据
|
|
|
+ //标记块数量
|
|
|
+ taskSignCount: 0, //总数
|
|
|
+ taskSignCurCount: 0, //当前计数
|
|
|
+ //{"type":1,"explain":"规定时间内跳完所有标志块","limitType":1}
|
|
|
+ taskConditionPassed: null,
|
|
|
+ taskDescribe: '',
|
|
|
+ //满格的数值是 25
|
|
|
+ maxShowCount: 13,
|
|
|
+ addShowCountUnit: 0,
|
|
|
+ showCurCount: 0,
|
|
|
+ roundingCount: 0,
|
|
|
+ //游戏结束
|
|
|
+ isGameOver: false,
|
|
|
+
|
|
|
+
|
|
|
+ //pk模式下操作
|
|
|
+ leftShowCurCount: 0,
|
|
|
+ rightShowCurCount: 0,
|
|
|
+ isleftPlayer: true,
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否允许绘制
|
|
|
+ */
|
|
|
+ canOnDraw: false,
|
|
|
+ /**
|
|
|
+ * 是否去到下一个关卡
|
|
|
+ */
|
|
|
+ canGoNext: false,
|
|
|
+ /**
|
|
|
+ * 生成的特效
|
|
|
+ */
|
|
|
+ canSpawnTemp: null,
|
|
|
+
|
|
|
+ onLogData: '',
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否显示关卡提示
|
|
|
+ */
|
|
|
+ bTipLevel: false,
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 烟花相关
|
|
|
+ */
|
|
|
+ // firework collection
|
|
|
+ fireworks: [],
|
|
|
+ fireworkImage: null,
|
|
|
+ loop: null,
|
|
|
+ count: 100,
|
|
|
+ effectHitCanvas: null,
|
|
|
+ effectCurrentSpawn: null,
|
|
|
+ effectSpawnPosX: 0,
|
|
|
+ /**
|
|
|
+ * 烟花特效
|
|
|
+ */
|
|
|
+ bDrawBoomEffect: false,
|
|
|
+ //绘制箭头效果
|
|
|
+ bRuning: false,
|
|
|
+ bRuningInfinite: false,
|
|
|
+ yellowRuningTimeout: null,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ levelData(val) {
|
|
|
+ //更新数据
|
|
|
+ // console.log("levelData ============>"+JSON.stringify(val));
|
|
|
+ if (val) {
|
|
|
+ this.taskSignCount = val.signCount;
|
|
|
+ this.taskConditionPassed = val.conditionPassed;
|
|
|
+ this.taskDescribe = val.describe;
|
|
|
+ this.addShowCountUnit = (this.maxShowCount * 2) / this.taskSignCount;
|
|
|
+ // console.log("this.addShowCountUnit:", this.addShowCountUnit, this.maxShowCount * 2, this
|
|
|
+ // .taskSignCount);
|
|
|
+ this.showCount = 0;
|
|
|
+ //用signType 做等级类型
|
|
|
+ this.levelType = val.signType;
|
|
|
+
|
|
|
+ // console.log(JSON.stringify(this.taskConditionPassed));
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+ currentMode(val) {
|
|
|
+ // console.log('==========> action jump currentMode:', val);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ let _self = this;
|
|
|
+ this.actionHitCanvas = uni.createCanvasContext("actionHitCanvas", this);
|
|
|
+ this.effectHitCanvas = uni.createCanvasContext("effectHitCanvas", this);
|
|
|
+ // this.SystemInfo = this.systemInfo; // uni.getSystemInfoSync();
|
|
|
+ this.canvasW = this.systemInfo.windowWidth; // 画布宽度
|
|
|
+ this.canvasH = 147.68;
|
|
|
+ this.onLoadImage();
|
|
|
+
|
|
|
+ //更新一次状态
|
|
|
+ const value = uni.getStorageSync('levelButtonPrompt');
|
|
|
+ if (value) {
|
|
|
+ _self.bTipLevel = !value.isSelected;
|
|
|
+ } else {
|
|
|
+ _self.bTipLevel = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.averageSpeedInterval) {
|
|
|
+ clearInterval(this.averageSpeedInterval);
|
|
|
+ this.averageSpeedInterval = null;
|
|
|
+ }
|
|
|
+ //计算平均速度
|
|
|
+ this.averageSpeedInterval = setInterval(() => {
|
|
|
+ this.averageSpeed = this.tempHitCount;
|
|
|
+ this.tempHitCount = 0;
|
|
|
+ }, 3000)
|
|
|
+
|
|
|
+ // console.log("组件创建")
|
|
|
+ },
|
|
|
+ // destroyed() { //Vue 实例销毁后调用
|
|
|
+ // console.log("组件销毁")
|
|
|
+ // },
|
|
|
+ methods: {
|
|
|
+ ...mapMutations(['onWriteBLEConnectionValue', 'onConvertDeviceData']),
|
|
|
+ //更新新手状态提示
|
|
|
+ onUpdateTipLevelValue(value) {
|
|
|
+ this.bTipLevel = value;
|
|
|
+ },
|
|
|
+ //load 相关图片
|
|
|
+ onLoadImage() {
|
|
|
+ let _self = this;
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/boxing-post/left-hook-m@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.directionJumpLeft = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/boxing-post/right-hook-m@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.directionJumpRight = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/boxing-post/straight-m@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.midJump = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/boxing-post/right-hook-h@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.directionJumpWhiteRight = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/boxing-post/left-hook-h@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.directionJumpWhiteLeft = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/boxing-post/straight-h@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.midJumpWhite = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/jumpTip.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.jumpTipImage = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/jump-tip-orange@2x.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.JumpTipOrange = image;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/progress-tip.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.jumpProgressTip = image;
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/jumpNormal-line.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.jumpNormalLine = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/jumpNormal-rect.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.jumpNormalRect = image;
|
|
|
+ _self.onDrawBg(true);
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/cankao.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.cankao = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 烟花照片
|
|
|
+ */
|
|
|
+ uni.getImageInfo({
|
|
|
+ src: "../../../static/modal/action-jump/boom.png",
|
|
|
+ success: function(image) {
|
|
|
+ _self.fireworkImage = image;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 重置生成数组,重置倒计时
|
|
|
+ */
|
|
|
+ resetJumpGame() {
|
|
|
+
|
|
|
+ this.spawnArray = [];
|
|
|
+ this.templatePool = [];
|
|
|
+ if (this.countdownInterval) {
|
|
|
+ clearInterval(this.countdownInterval);
|
|
|
+ this.countdownInterval = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // this.resetCountdown(60);
|
|
|
+
|
|
|
+ },
|
|
|
+ startJumpGame() {
|
|
|
+ this.isGameOver = false;
|
|
|
+ this.resetJumpGame();
|
|
|
+ //开始游戏
|
|
|
+ this.index = 0;
|
|
|
+ // this.levelType = 5;
|
|
|
+ let spawnCount = 7;
|
|
|
+ let _ranType = Math.floor(Math.random() * 2);
|
|
|
+ //生成二个占位
|
|
|
+ this.addTemplatePoolFromType(false, this.template[0].spawnList[0][0]);
|
|
|
+ this.addTemplatePoolFromType(false, this.template[0].spawnList[0][0]);
|
|
|
+ if (this.levelType == 0) {
|
|
|
+ //随便生成一组跳的数据
|
|
|
+ let _spawnList = this.template[0].spawnList;
|
|
|
+ for (let i = 0; i < 30; i++) {
|
|
|
+ //再对象池里面生成一组对象
|
|
|
+ this.addTemplatePoolFromType(true, _spawnList[0][0]);
|
|
|
+ }
|
|
|
+ //先生成spawnCount个
|
|
|
+ for (let i = 0; i < spawnCount; i++) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (this.levelType == 1) {
|
|
|
+ //生成一组 左跳右跳
|
|
|
+ let _spawnList = this.template[1].spawnList;
|
|
|
+ for (let i = 0; i < 30; i++) {
|
|
|
+ let ran = Math.floor(Math.random() * 2);
|
|
|
+ for (let j = 0; j < _spawnList[ran].length; j++) {
|
|
|
+ //再对象池里面生成一组对象
|
|
|
+ this.addTemplatePoolFromType(true, _spawnList[ran][j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //先生成spawnCount个
|
|
|
+ for (let i = 0; i < spawnCount; i++) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log(this.spawnArray)
|
|
|
+
|
|
|
+ } else if (this.levelType == 2) {
|
|
|
+ //生成一组 左跳右跳原地
|
|
|
+ let _spawnList = this.template[2].spawnList;
|
|
|
+ for (let i = 0; i < 30; i++) {
|
|
|
+ let ran = Math.floor(Math.random() * 2);
|
|
|
+ for (let j = 0; j < _spawnList[ran].length; j++) {
|
|
|
+ //再对象池里面生成一组对象
|
|
|
+ this.addTemplatePoolFromType(true, _spawnList[ran][j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //先生成spawnCount个
|
|
|
+ for (let i = 0; i < spawnCount; i++) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } else if (this.levelType == 3) {
|
|
|
+ //生成一组 左旋跳右旋跳
|
|
|
+ let _spawnList = this.template[1].spawnList;
|
|
|
+ for (let i = 0; i < 30; i++) {
|
|
|
+ let ran = Math.floor(Math.random() * 2) + 2;
|
|
|
+ for (let j = 0; j < _spawnList[ran].length; j++) {
|
|
|
+ //再对象池里面生成一组对象
|
|
|
+ this.addTemplatePoolFromType(true, _spawnList[ran][j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //先生成spawnCount个
|
|
|
+ for (let i = 0; i < spawnCount; i++) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+ } else if (this.levelType == 4) {
|
|
|
+ //生成一组 左旋跳右旋跳
|
|
|
+ let _spawnList = this.template[2].spawnList;
|
|
|
+ for (let i = 0; i < 30; i++) {
|
|
|
+ let ran = Math.floor(Math.random() * 2) + 2;
|
|
|
+ for (let j = 0; j < _spawnList[ran].length; j++) {
|
|
|
+ //再对象池里面生成一组对象
|
|
|
+ this.addTemplatePoolFromType(true, _spawnList[ran][j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //先生成spawnCount个
|
|
|
+ for (let i = 0; i < spawnCount; i++) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (this.levelType == 5) {
|
|
|
+ for (let i = 0; i < 20; i++) {
|
|
|
+ //随便生成三组数据
|
|
|
+ let _newArray = [];
|
|
|
+ let _spawnList2 = this.template[2].spawnList;
|
|
|
+ let ran2 = Math.floor(Math.random() * 2);
|
|
|
+ let ran3 = Math.floor(Math.random() * 2);
|
|
|
+ if (_ranType >= 1) {
|
|
|
+ ran2 += 2;
|
|
|
+ ran3 += 2;
|
|
|
+ }
|
|
|
+ _newArray = _newArray.concat(_spawnList2[ran2]);
|
|
|
+ _newArray = _newArray.concat(_spawnList2[ran3]);
|
|
|
+ for (let j = 0; j < _newArray.length; j++) {
|
|
|
+ this.addTemplatePoolFromType(true, _newArray[j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //先生成spawnCount个
|
|
|
+ for (let i = 0; i < spawnCount; i++) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.onDraw("tipHit", false);
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 生成对应预制对象
|
|
|
+ * @param {Object} bShow
|
|
|
+ * @param {Object} _jumpType
|
|
|
+ */
|
|
|
+ addTemplatePoolFromType(bShow, _jumpType) {
|
|
|
+
|
|
|
+ for (let i = 0; i < this.jumpTypeArray.length; i++) {
|
|
|
+ if (this.jumpTypeArray[i].jumpCode == _jumpType) {
|
|
|
+ let _jumpPrefab = Object.assign({}, this.jumpTypeArray[i], {
|
|
|
+ bShow: bShow,
|
|
|
+ bInit: true,
|
|
|
+ position: 0,
|
|
|
+ animation: null, //动画
|
|
|
+ });
|
|
|
+ this.templatePool.push(_jumpPrefab);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //单纯的绘制八个背景
|
|
|
+ onDrawBg(bDraw) {
|
|
|
+ this.spawnPos = [];
|
|
|
+
|
|
|
+ if (bDraw) {
|
|
|
+ this.actionHitCanvas.clearRect(0, 0, this.canvasW, this.canvasH);
|
|
|
+ }
|
|
|
+
|
|
|
+ let _currentBgStartX = this.canvasW / 2;
|
|
|
+ let count = 7;
|
|
|
+ let _currentPos = -12,
|
|
|
+ _addPos = 0;
|
|
|
+
|
|
|
+ for (let i = 0; i < count; i++) {
|
|
|
+ if (0 !== i) {
|
|
|
+ _currentPos += this.jumpNormalWidth;
|
|
|
+ } else {
|
|
|
+ _currentPos -= this.jumpNormalWidth;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (2 === i) {
|
|
|
+ //结尾时候快消除完绘制一次大图背景。不然会为空白
|
|
|
+ if (this.spawnArray.length < 3)
|
|
|
+ this.actionHitCanvas.drawImage(this.jumpTipImage.path, _currentPos, 0, 120, this
|
|
|
+ .canvasH);
|
|
|
+
|
|
|
+ if (bDraw) {
|
|
|
+ this.actionHitCanvas.drawImage(this.JumpTipOrange.path, _currentPos + 3, 7, 113, this
|
|
|
+ .canvasH -
|
|
|
+ 14);
|
|
|
+ }
|
|
|
+ //添加对应生成点
|
|
|
+ this.spawnPos.push({
|
|
|
+ center: _currentPos + 30
|
|
|
+ })
|
|
|
+ _currentPos += 50;
|
|
|
+ } else {
|
|
|
+ this.actionHitCanvas.drawImage(this.jumpNormalLine.path, _currentPos, 0, this
|
|
|
+ .jumpNormalWidth,
|
|
|
+ this.canvasH);
|
|
|
+ if (bDraw) {
|
|
|
+ this.actionHitCanvas.drawImage(this.jumpNormalRect.path, _currentPos, 0, this
|
|
|
+ .jumpNormalWidth,
|
|
|
+ this.canvasH);
|
|
|
+ }
|
|
|
+ //添加对应生成点
|
|
|
+ this.spawnPos.push({
|
|
|
+ center: _currentPos + 16
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ if (bDraw) {
|
|
|
+ this.actionHitCanvas.draw();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onDraw(type, bAnimation) {
|
|
|
+ let _self = this;
|
|
|
+ if (bAnimation && _self.spawnAnimation == null) {
|
|
|
+ _self.spawnProcess = 0;
|
|
|
+ _self.spawnAnimation = new Animation({
|
|
|
+ timing: 'linear',
|
|
|
+ duration: 200,
|
|
|
+ onProcess: function onProcess(process) {
|
|
|
+ _self.spawnProcess = process;
|
|
|
+ _self.onDraw('normal', true);
|
|
|
+ // console.log("process=" + process);
|
|
|
+ },
|
|
|
+ onAnimationFinish: function onAnimationFinish() {
|
|
|
+ // console.log("finish animation");
|
|
|
+ _self.spawnAnimation = null;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ this.actionHitCanvas.clearRect(0, 0, this.canvasW, this.canvasH);
|
|
|
+ //单纯绘制背景
|
|
|
+ this.onDrawBg(false);
|
|
|
+ //计算一个节点数组
|
|
|
+ // let _oldRectMoveDis = 1;
|
|
|
+ for (let i = 0; i < this.spawnArray.length; i++) {
|
|
|
+ //默认 mid 图标
|
|
|
+ let _temp = this.spawnArray[i].bTrigger ? this.midJump : this.midJumpWhite;
|
|
|
+ if (this.spawnArray[i].icon == 'directionJump') {
|
|
|
+ if (this.spawnArray[i].jumpName == "RIGHT") {
|
|
|
+ _temp = this.spawnArray[i].bTrigger ? this.directionJumpRight : this
|
|
|
+ .directionJumpWhiteRight;
|
|
|
+ } else {
|
|
|
+ _temp = this.spawnArray[i].bTrigger ? this.directionJumpLeft : this
|
|
|
+ .directionJumpWhiteLeft;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.actionHitCanvas.save();
|
|
|
+
|
|
|
+ let _currentPos = this.spawnPos[i].center;
|
|
|
+ let _currentCenterPos = 0;
|
|
|
+
|
|
|
+ if (2 === i) {
|
|
|
+ //这里分两部分走,从小图走到大图
|
|
|
+ let _spawnBiggerToLeft = this.spawnArray[i];
|
|
|
+ //这里记录一个生成点,后面用于生成特效
|
|
|
+ this.effectSpawnPosX = _currentPos;
|
|
|
+ //大图
|
|
|
+ let tempPosition = _currentPos;
|
|
|
+ if (!bAnimation || _spawnBiggerToLeft.bInit) {
|
|
|
+ _spawnBiggerToLeft.position = _currentPos;
|
|
|
+ _spawnBiggerToLeft.bInit = false;
|
|
|
+ } else {
|
|
|
+ tempPosition = _spawnBiggerToLeft.position - Math.abs(_currentPos - _spawnBiggerToLeft
|
|
|
+ .position) * _self.spawnProcess;
|
|
|
+
|
|
|
+ }
|
|
|
+ if (1 === this.spawnProcess) {
|
|
|
+ _spawnBiggerToLeft.position = tempPosition;
|
|
|
+ } else {
|
|
|
+ //绘制一次前面方块背景前移
|
|
|
+ this.actionHitCanvas.drawImage(this.jumpNormalRect.path, tempPosition - 16, 0, this
|
|
|
+ .jumpNormalWidth,
|
|
|
+ this.canvasH);
|
|
|
+ this.actionHitCanvas.clearRect(this.spawnPos[i].center - 30, 0, 120, this.canvasH);
|
|
|
+ }
|
|
|
+ let _width = 40 + 20 * _self.spawnProcess;
|
|
|
+ this.actionHitCanvas.drawImage(_temp.path, tempPosition, 55 - 9 * _self.spawnProcess,
|
|
|
+ _width,
|
|
|
+ _width);
|
|
|
+
|
|
|
+ //绘制多一次背景
|
|
|
+ this.actionHitCanvas.drawImage(this.jumpTipImage.path, this.spawnPos[i].center - 30, 0,
|
|
|
+ 120, this
|
|
|
+ .canvasH);
|
|
|
+
|
|
|
+ this.actionHitCanvas.drawImage(this.JumpTipOrange.path, this.spawnPos[i].center - 27, 7,
|
|
|
+ 113, this
|
|
|
+ .canvasH -
|
|
|
+ 14);
|
|
|
+ } else {
|
|
|
+ //小图
|
|
|
+ let _otherObj = this.spawnArray[i];
|
|
|
+ let tempPosition = _currentPos;
|
|
|
+ if (!bAnimation || _otherObj.bInit) {
|
|
|
+ _otherObj.position = _currentPos;
|
|
|
+ _otherObj.bInit = false;
|
|
|
+ } else {
|
|
|
+ tempPosition = _otherObj.position - Math.abs(_currentPos - _otherObj.position) * _self
|
|
|
+ .spawnProcess;
|
|
|
+ }
|
|
|
+ if (1 === this.spawnProcess) {
|
|
|
+ _otherObj.position = tempPosition;
|
|
|
+ }
|
|
|
+ this.actionHitCanvas.drawImage(this.jumpNormalRect.path, tempPosition - 16, 0, this
|
|
|
+ .jumpNormalWidth,
|
|
|
+ this.canvasH);
|
|
|
+ if (this.spawnArray[i].bShow) {
|
|
|
+ this.actionHitCanvas.drawImage(_temp.path, tempPosition, 55, 40, 40);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ this.actionHitCanvas.restore();
|
|
|
+ }
|
|
|
+
|
|
|
+ this.actionHitCanvas.draw();
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 消除时候显示的特效
|
|
|
+ * @param {Object} _temp
|
|
|
+ */
|
|
|
+ onDrawEffect(_temp) {
|
|
|
+ if (!this.bRuning) {
|
|
|
+ this.bRuning = true;
|
|
|
+ if (this.yellowRuningTimeout) {
|
|
|
+ clearTimeout(this.yellowRuningTimeout)
|
|
|
+ this.yellowRuningTimeout = null;
|
|
|
+ }
|
|
|
+ this.yellowRuningTimeout = setTimeout(() => {
|
|
|
+ this.bRuning = false;
|
|
|
+ }, 1000)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //根据当前消除的生成一个
|
|
|
+ let spawnTemp = this.midJump;
|
|
|
+ let offest = 5;
|
|
|
+ if (_temp.icon == 'directionJump') {
|
|
|
+ spawnTemp = _temp.jumpName == "RIGHT" ? this.directionJumpRight : this.directionJumpLeft;
|
|
|
+ }
|
|
|
+ let tempFirework = new Firework(this.fireworkImage,
|
|
|
+ spawnTemp, _temp.scaleX, this.effectSpawnPosX, 0, this.canvasW, 164, offest, true);
|
|
|
+ this.fireworks.push(tempFirework);
|
|
|
+ this.bDrawBoomEffect = true;
|
|
|
+ this.onInitFirework();
|
|
|
+ },
|
|
|
+ onClear() {
|
|
|
+ this.resetJumpGame();
|
|
|
+
|
|
|
+ this.onDrawBg(true);
|
|
|
+
|
|
|
+ this.xA = 0;
|
|
|
+ this.yA = 0;
|
|
|
+ this.zA = 0;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 统一绘制 效果 背景,交互,烟花
|
|
|
+ */
|
|
|
+ onInitFirework() {
|
|
|
+ if (this.loop != null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.loop = setInterval(() => {
|
|
|
+ if (!this.bDrawBoomEffect) {
|
|
|
+ clearInterval(this.loop);
|
|
|
+ this.loop = null;
|
|
|
+ // console.log("结束绘制");
|
|
|
+ this.effectHitCanvas.clearRect(0, 0, this.canvasW, 164);
|
|
|
+ this.effectHitCanvas.draw();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.effectHitCanvas.clearRect(0, 0, this.canvasW, 164);
|
|
|
+ if (this.bDrawBoomEffect) {
|
|
|
+ // loop over each firework, draw it, update it
|
|
|
+ var i = this.fireworks.length;
|
|
|
+ while (i--) {
|
|
|
+ this.fireworks[i].draw(this.effectHitCanvas, () => {
|
|
|
+ this.fireworks.splice(i, 1);
|
|
|
+ if (this.fireworks.length == 0) {
|
|
|
+ this.bDrawBoomEffect = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.effectHitCanvas.draw();
|
|
|
+ }, 30)
|
|
|
+ },
|
|
|
+ onJumpType(event) {
|
|
|
+ // console.log("onJumpType:", event);
|
|
|
+ if (this.isGameOver || !this.bJumpPlay) return;
|
|
|
+ this.eliminateJumpPrefab(event);
|
|
|
+ },
|
|
|
+
|
|
|
+ // update (dt) {}
|
|
|
+ //模拟测试调用
|
|
|
+ eliminateJumpPrefab(_jumpType) {
|
|
|
+ //只触发第二个
|
|
|
+ if (this.spawnArray.length < 3 || this.spawnAnimation != null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let _temp = this.spawnArray[2];
|
|
|
+ //如果当前的跳类型和预制目标一样
|
|
|
+ if (_jumpType == _temp.jumpCode) {
|
|
|
+ _temp.bTrigger = true;
|
|
|
+ this.deleteSpawn = this.spawnArray.splice(0, 1);
|
|
|
+
|
|
|
+ if (this.index < this.templatePool.length) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+ //这里更新特效
|
|
|
+ let _endTemp = Object.assign({}, _temp);
|
|
|
+ this.onDrawEffect(_endTemp);
|
|
|
+ //绘制新触发状态
|
|
|
+ this.onDraw('tipHit', true);
|
|
|
+ //成功
|
|
|
+ this.setEliminationCount(1);
|
|
|
+ //替换数组
|
|
|
+ // console.log(this.index + " == " + this.spawnArray.length);
|
|
|
+ if (this.spawnArray.length < 3 && this.index > 3) {
|
|
|
+ clearInterval(this.countdownInterval);
|
|
|
+ this.countdownInterval = null;
|
|
|
+ //绘制新触发状态
|
|
|
+ this.onDraw("normal", false);
|
|
|
+ setTimeout(() => {
|
|
|
+ this.startJumpGame();
|
|
|
+ }, 2000)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //失误
|
|
|
+ this.setFaultCount(1);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ //设置倒计时
|
|
|
+ setCountdown(value) {
|
|
|
+ this.countdown -= value;
|
|
|
+ // this.countdownLabel.string = '倒计时:' + this.countdown;
|
|
|
+ this.$emit('actionJumpCountDownUpdate', {
|
|
|
+ countDown: this.countdown
|
|
|
+ });
|
|
|
+ },
|
|
|
+ resetCountdown(value) {
|
|
|
+ this.countdown = value;
|
|
|
+ // this.countdownLabel.string = '倒计时:' + this.countdown;
|
|
|
+ this.$emit('actionJumpCountDownUpdate', {
|
|
|
+ countDown: this.countdown
|
|
|
+ });
|
|
|
+ },
|
|
|
+ //设置ui信息
|
|
|
+ setEliminationCount(value) {
|
|
|
+ this.tempHitCount++;
|
|
|
+ this.taskSignCurCount++;
|
|
|
+ this.roundingCount += this.addShowCountUnit;
|
|
|
+ this.eliminationCount += value;
|
|
|
+
|
|
|
+ // this.eliminationLabel.string = '消除数量:' + this.eliminationCount.toString();
|
|
|
+ this.$emit('actionJumpDataUpdate', {
|
|
|
+ eliminationCount: this.eliminationCount,
|
|
|
+ faultCount: this.faultCount
|
|
|
+ });
|
|
|
+ this.jumpCalorie += puchConfig.getJumpCalorie(this.eliminationCount + this.faultCount);
|
|
|
+
|
|
|
+ //如果是pk模式。不走下面判断
|
|
|
+ if (this.currentMode == 'pkMode') return;
|
|
|
+
|
|
|
+ if (CONDITIONPASSED.ENERGYBARFULL == this.taskConditionPassed.limitType) {
|
|
|
+ //能量条的条件下才显示能量条动
|
|
|
+ //取两位后计算Math floor,不然会有偏差值问题 Math.floor(39.9999999+ 0.1111111) = 39
|
|
|
+ this.showCurCount = Math.floor(this.roundingCount.toFixed(2));
|
|
|
+ //1.能量槽满的时候,说明踩中次数到达
|
|
|
+ if (this.taskSignCurCount >= this.taskSignCount)
|
|
|
+ this.onGameOver("energyBarFull");
|
|
|
+ } else if (CONDITIONPASSED.SKIPALLFLAGWITHINTIME == this.taskConditionPassed.limitType) {
|
|
|
+ //规定时间下也给显示能量条
|
|
|
+ this.showCurCount = Math.floor(this.roundingCount.toFixed(2));
|
|
|
+ //2.规定时间内跳完所有标志块
|
|
|
+ if (this.taskSignCurCount >= this.taskSignCount)
|
|
|
+ this.onGameOver("skipAllFlagWithinTime");
|
|
|
+ } else if (this.taskConditionPassed.isScore) {
|
|
|
+ //3.达到一定分数
|
|
|
+ //如果是用分数判断
|
|
|
+ //分数是 跳对的加1分,错的扣1分,0不扣分。
|
|
|
+ let curScore = this.eliminationCount - this.faultCount;
|
|
|
+ curScore = curScore < 0 ? 0 : curScore;
|
|
|
+ //当前分数达到,胜利
|
|
|
+ if (curScore >= this.taskConditionPassed.limitScore)
|
|
|
+ this.onGameOver("score");
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onGameOver(type) {
|
|
|
+ this.isGameOver = true;
|
|
|
+ //处理参数
|
|
|
+ this.onClear();
|
|
|
+ this.onClearData();
|
|
|
+ this.bJumpPlay = false;
|
|
|
+ /**
|
|
|
+ * 判断胜利和失败
|
|
|
+ */
|
|
|
+ let myWin = false; //默认失败
|
|
|
+ //比如, 1.充满左右两边蓄能槽.2.规定时间内跳完所有标志块.
|
|
|
+ if (type == "energyBarFull") {
|
|
|
+ //1.能量槽满的时候,说明踩中次数到达
|
|
|
+ if (this.taskSignCurCount >= this.taskSignCount) {
|
|
|
+ myWin = true;
|
|
|
+ }
|
|
|
+ } else if (type == 'skipAllFlagWithinTime') {
|
|
|
+ myWin = true;
|
|
|
+ } else if (type == "timeUp") {
|
|
|
+ //2.规定时间内跳完所有标志块
|
|
|
+ //查看消除数量是否到达总数,未达成就是未完成
|
|
|
+ if (this.taskSignCurCount >= this.taskSignCount) {
|
|
|
+ myWin = true;
|
|
|
+ }
|
|
|
+ } else if (type == "score") {
|
|
|
+ myWin = true;
|
|
|
+ }
|
|
|
+ console.log(type, {
|
|
|
+ myWin: myWin
|
|
|
+ });
|
|
|
+ this.$emit('gameOver', {
|
|
|
+ myWin: myWin,
|
|
|
+ type: 'calorieMode',
|
|
|
+ isOffEvent: true
|
|
|
+ });
|
|
|
+ },
|
|
|
+ //pk模式下结束游戏关卡
|
|
|
+ onPKModeGameOver(type) {
|
|
|
+ this.isGameOver = true;
|
|
|
+ //处理参数
|
|
|
+ this.onClear();
|
|
|
+ this.onClearData();
|
|
|
+ this.bJumpPlay = false;
|
|
|
+
|
|
|
+ this.$emit('gameOver', {
|
|
|
+ type: 'pkMode',
|
|
|
+ isOffEvent: true
|
|
|
+ });
|
|
|
+ },
|
|
|
+ setFaultCount(value) {
|
|
|
+ this.tempHitCount++;
|
|
|
+ this.faultCount += value;
|
|
|
+ // this.faultLabel.string = '失误:' + this.faultCount;
|
|
|
+ this.$emit('actionJumpDataUpdate', {
|
|
|
+ eliminationCount: this.eliminationCount,
|
|
|
+ faultCount: this.faultCount
|
|
|
+ });
|
|
|
+ this.jumpCalorie += puchConfig.getJumpCalorie(this.eliminationCount + this.faultCount);
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ //控制播放
|
|
|
+ onControllerPlay() {
|
|
|
+ if (this.bJumpPlay) {
|
|
|
+ //仅仅暂停,没有清空数据
|
|
|
+ this._changePlay(false);
|
|
|
+ this.$emit("actionJumpControllerPlay", false);
|
|
|
+ } else {
|
|
|
+ this.$emit("actionJumpCheck");
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onContinueGame() {
|
|
|
+ this._changePlay(true);
|
|
|
+ },
|
|
|
+ onClearActionJumpData() {
|
|
|
+ console.log("onClearActionJumpData");
|
|
|
+ this.onClear();
|
|
|
+ this.onClearData();
|
|
|
+ },
|
|
|
+ //修改状态
|
|
|
+ _changePlay(bPlaying) {
|
|
|
+ if (bPlaying) {
|
|
|
+ this.bJumpPlay = bPlaying;
|
|
|
+ } else {
|
|
|
+ this.bJumpPlay = !this.bJumpPlay;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ onActionPlay() {
|
|
|
+ this.onClear();
|
|
|
+ this.onClearData();
|
|
|
+ this.startJumpGame();
|
|
|
+ this._changePlay(true);
|
|
|
+
|
|
|
+ //reset 对应计算数据
|
|
|
+ this.taskSignCurCount = 0;
|
|
|
+ this.showCurCount = 0;
|
|
|
+ this.roundingCount = 0;
|
|
|
+
|
|
|
+ this.faultCount = 0;
|
|
|
+ this.eliminationCount = 0;
|
|
|
+ },
|
|
|
+
|
|
|
+ getCurrentJumpType() {
|
|
|
+ let _temp = this.spawnArray[2];
|
|
|
+ return _temp.jumpCode;
|
|
|
+ },
|
|
|
+
|
|
|
+ //监听跳的状态数据
|
|
|
+ listenStateDataOfJump(data) {
|
|
|
+
|
|
|
+ if (this.spawnArray.length < 3) return;
|
|
|
+ let _jumpType = this.getCurrentJumpType();
|
|
|
+ //初始全部默认状态
|
|
|
+ let _tempState = [{
|
|
|
+ jumpName: 'NORMAL',
|
|
|
+ jumpCode: 0,
|
|
|
+ bTrigger: false,
|
|
|
+ describe: '正常跳'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ jumpName: 'LEFT',
|
|
|
+ jumpCode: 1,
|
|
|
+ bTrigger: false,
|
|
|
+ describe: '左直跳'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ jumpName: 'RIGHT',
|
|
|
+ jumpCode: 2,
|
|
|
+ bTrigger: false,
|
|
|
+ describe: '右直跳'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ jumpName: 'LEFT_ROTATE',
|
|
|
+ jumpCode: 3,
|
|
|
+ bTrigger: false,
|
|
|
+ describe: '左旋转跳'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ jumpName: 'RIGHT_ROTATE',
|
|
|
+ jumpCode: 4,
|
|
|
+ bTrigger: false,
|
|
|
+ describe: '右旋转跳'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+
|
|
|
+ let {
|
|
|
+ currentMaxValue,
|
|
|
+ oGyroValue,
|
|
|
+ peakOfWaveMaxValue,
|
|
|
+ valleyOfWaveMinValue
|
|
|
+ } = data
|
|
|
+ // console.log('stateDataOfJump:');
|
|
|
+ // console.log(JSON.stringify(data));
|
|
|
+ this.onLogData = data;
|
|
|
+ let _rotateLimit = 4;
|
|
|
+ let _jumpLimit = 0;
|
|
|
+
|
|
|
+ switch (_jumpType) {
|
|
|
+ case 0:
|
|
|
+ //JumpType.NORMAL = 0
|
|
|
+ _tempState[0].bTrigger = true;
|
|
|
+ this.eliminateJumpPrefabFormTemp(_tempState);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ if (currentMaxValue < -_jumpLimit) {
|
|
|
+ //left jump
|
|
|
+ _tempState[1].bTrigger = true;
|
|
|
+ }
|
|
|
+ this.eliminateJumpPrefabFormTemp(_tempState);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ if (currentMaxValue > _jumpLimit) {
|
|
|
+ //right jump
|
|
|
+ _tempState[2].bTrigger = true;
|
|
|
+ }
|
|
|
+ this.eliminateJumpPrefabFormTemp(_tempState);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ if (oGyroValue > _rotateLimit) {
|
|
|
+ _tempState[4].bTrigger = true;
|
|
|
+ }
|
|
|
+ this.eliminateJumpPrefabFormTemp(_tempState);
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ if (oGyroValue < -_rotateLimit) {
|
|
|
+ _tempState[3].bTrigger = true;
|
|
|
+ }
|
|
|
+ this.eliminateJumpPrefabFormTemp(_tempState);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ console.log('没有对应的_jumpType', _jumpType);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+ eliminateJumpPrefabFormTemp(_tempState) {
|
|
|
+ //只触发第三个
|
|
|
+ if (this.spawnArray.length < 3) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let _temp = this.spawnArray[2];
|
|
|
+ let bSuccess = false;
|
|
|
+ for (let i = 0; i < _tempState.length; i++) {
|
|
|
+ let _state = _tempState[i];
|
|
|
+ if (_state.bTrigger) {
|
|
|
+ console.log(this.eliminationCount + ',识别跳的类型:' + _state.describe + ',当前预制类型:' + _temp
|
|
|
+ .jumpName +
|
|
|
+ "\n直跳判断值:" + this.onLogData.currentMaxValue + ",旋转跳值:" + this.onLogData.oGyroValue);
|
|
|
+ }
|
|
|
+ //如果当前的跳类型和预制目标一样
|
|
|
+ if (_state.jumpCode == _temp.jumpCode && _state.bTrigger) {
|
|
|
+ //成功
|
|
|
+ bSuccess = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果存在其中一个为true
|
|
|
+ if (bSuccess) {
|
|
|
+ _temp.bTrigger = true;
|
|
|
+ this.canSpawnTemp = _temp;
|
|
|
+ setTimeout(() => {
|
|
|
+ //这里更新特效
|
|
|
+ this.onDrawEffect(this.canSpawnTemp);
|
|
|
+ }, 150);
|
|
|
+ this.deleteSpawn = this.spawnArray.splice(0, 1);
|
|
|
+
|
|
|
+ if (this.index < this.templatePool.length) {
|
|
|
+ this.spawnArray.push(this.templatePool[this.index]);
|
|
|
+ this.index++;
|
|
|
+ }
|
|
|
+ //成功
|
|
|
+ this.setEliminationCount(1);
|
|
|
+ //替换数组
|
|
|
+ // console.log(this.index + " == " + this.spawnArray.length);
|
|
|
+ if (this.spawnArray.length < 3 && this.index > 3) {
|
|
|
+ clearInterval(this.countdownInterval);
|
|
|
+ this.countdownInterval = null;
|
|
|
+ //绘制新触发状态
|
|
|
+ this.canGoNext = true;
|
|
|
+ } else {
|
|
|
+ //绘制新触发状态
|
|
|
+ this.canOnDraw = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ //失误
|
|
|
+ this.setFaultCount(1);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param {Object} gameData
|
|
|
+ * 识别跳部分数据处理
|
|
|
+ */
|
|
|
+ onBLEHitUpdate(gameData) {
|
|
|
+ console.log("gameData:",gameData);
|
|
|
+ if (!this.bJumpPlay || this.isGameOver || this.spawnAnimation != null) return;
|
|
|
+
|
|
|
+ // if (curAngleCeil < 30) {
|
|
|
+ // directionPunch = "straightPunch";
|
|
|
+ // name = "正向的直拳";
|
|
|
+ // ename = "front-straight";
|
|
|
+ // } else if (direction.x < 0) {
|
|
|
+ // directionPunch = "rightPunch";
|
|
|
+ // name = "正向的右拳";
|
|
|
+ // ename = "front-right";
|
|
|
+ // } else if (direction.x > 0) {
|
|
|
+ // directionPunch = "leftPunch";
|
|
|
+ // name = "正向的左拳";
|
|
|
+ // ename = "front-left";
|
|
|
+ // }
|
|
|
+ if (gameData.direction == "straightPunch") {
|
|
|
+ this.eliminateJumpPrefab(0);
|
|
|
+ } else if (gameData.direction == "leftPunch") {
|
|
|
+ this.eliminateJumpPrefab(1);
|
|
|
+ } else if (gameData.direction == "rightPunch") {
|
|
|
+ this.eliminateJumpPrefab(2);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.BLEAccIndex++;
|
|
|
+ },
|
|
|
+ onClearData() {
|
|
|
+ this.BLEAccIndex = 0;
|
|
|
+ },
|
|
|
+ onChangeY() {
|
|
|
+ this.isY = true;
|
|
|
+ },
|
|
|
+ onChangeX() {
|
|
|
+ this.isY = false;
|
|
|
+ },
|
|
|
+ onGetActionJumpPlayView(callback) {
|
|
|
+ let view = uni.createSelectorQuery().select('#ActionJumpPlay');
|
|
|
+ view.boundingClientRect(data => {
|
|
|
+ if (callback)
|
|
|
+ callback(data);
|
|
|
+ }).exec();
|
|
|
+ },
|
|
|
+
|
|
|
+ onTipLevel() {
|
|
|
+ this.$emit("tipLevel", {
|
|
|
+ hiddenType: 'normal'
|
|
|
+ });
|
|
|
+ console.log("**************22");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+ .mid-absolute {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ right: 0;
|
|
|
+ left: 0;
|
|
|
+ margin: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .action-jump-timer {
|
|
|
+ position: absolute;
|
|
|
+ top: -150rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .grid-progress-vertical-container {
|
|
|
+ min-height: 376rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .grid-progress-vertical-bar {
|
|
|
+ max-height: 376rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .grid-progress-vertical-child {
|
|
|
+ width: 35px;
|
|
|
+ height: 7.36px;
|
|
|
+ margin: 7.36px 0 0 0;
|
|
|
+ position: relative;
|
|
|
+ }
|
|
|
+
|
|
|
+ .grid-progress-vertical-active {
|
|
|
+ width: 28rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .grid-progress-vertical-inactive {
|
|
|
+ width: 28rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .sprite-yellow-arrow {
|
|
|
+ display: inline-block;
|
|
|
+ overflow: hidden;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ width: 194px;
|
|
|
+ height: 232px;
|
|
|
+ background-image: url('@/static/modal/action-jump/yellow-arrow.png');
|
|
|
+
|
|
|
+ // border: 1rpx solid #00CE47;
|
|
|
+ }
|
|
|
+
|
|
|
+ .animation-play-state-play {
|
|
|
+ animation: yellowArrowRun 1s steps(1, end); // infinite
|
|
|
+ animation-play-state: running;
|
|
|
+ }
|
|
|
+
|
|
|
+ .animation-play-state-paused {
|
|
|
+ animation-play-state: paused;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 箭头动画
|
|
|
+ */
|
|
|
+ @keyframes yellowArrowRun {
|
|
|
+ 0% {
|
|
|
+ background-position: -0px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 5% {
|
|
|
+ background-position: -0px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 10% {
|
|
|
+ background-position: -194px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 15% {
|
|
|
+ background-position: -388px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 20% {
|
|
|
+ background-position: -582px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 25% {
|
|
|
+ background-position: -776px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 30% {
|
|
|
+ background-position: -0px -232px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 35% {
|
|
|
+ background-position: -194px -232px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 40% {
|
|
|
+ background-position: -388px -232px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 45% {
|
|
|
+ background-position: -582px -232px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 50% {
|
|
|
+ background-position: -776px -232px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 55% {
|
|
|
+ background-position: -0px -464px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 60% {
|
|
|
+ background-position: -194px -464px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 65% {
|
|
|
+ background-position: -388px -464px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 70% {
|
|
|
+ background-position: -582px -464px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 75% {
|
|
|
+ background-position: -776px -464px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 80% {
|
|
|
+ background-position: -0px -696px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 85% {
|
|
|
+ background-position: -194px -696px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 90% {
|
|
|
+ background-position: -388px -696px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 95% {
|
|
|
+ background-position: -582px -696px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 100% {
|
|
|
+ background-position: -776px -696px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .sprite-rightToLeftArrow {
|
|
|
+ display: inline-block;
|
|
|
+ overflow: hidden;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ width: 317px;
|
|
|
+ height: 42px;
|
|
|
+ background-image: url('@/static/modal/action-jump/rightToLeftArrow.png');
|
|
|
+
|
|
|
+ // border: 1rpx solid #00CE47;
|
|
|
+ }
|
|
|
+
|
|
|
+ .sprite-rightToLeftArrow-play {
|
|
|
+ animation: rightToLeftArrowRun 1s steps(1, end) infinite;
|
|
|
+ }
|
|
|
+
|
|
|
+ @keyframes rightToLeftArrowRun {
|
|
|
+ 0% {
|
|
|
+ background-position: -0px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 3.33% {
|
|
|
+ background-position: -0px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 6.66% {
|
|
|
+ background-position: -317px -0px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 9.99% {
|
|
|
+ background-position: -0px -42px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 13.33% {
|
|
|
+ background-position: -317px -42px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 16.66% {
|
|
|
+ background-position: -0px -84px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 19.99% {
|
|
|
+ background-position: -317px -84px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 23.33% {
|
|
|
+ background-position: -0px -126px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 26.66% {
|
|
|
+ background-position: -317px -126px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 29.99% {
|
|
|
+ background-position: -0px -168px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 33.33% {
|
|
|
+ background-position: -317px -168px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 36.66% {
|
|
|
+ background-position: -0px -210px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 39.99% {
|
|
|
+ background-position: -317px -210px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 43.33% {
|
|
|
+ background-position: -0px -252px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 46.66% {
|
|
|
+ background-position: -317px -252px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 49.99% {
|
|
|
+ background-position: -0px -294px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 53.33% {
|
|
|
+ background-position: -317px -294px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 56.66% {
|
|
|
+ background-position: -0px -336px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 59.99% {
|
|
|
+ background-position: -317px -336px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 63.33% {
|
|
|
+ background-position: -0px -378px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 66.66% {
|
|
|
+ background-position: -317px -378px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 69.99% {
|
|
|
+ background-position: -0px -420px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 73.33% {
|
|
|
+ background-position: -317px -420px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 76.66% {
|
|
|
+ background-position: -0px -462px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 79.99% {
|
|
|
+ background-position: -317px -462px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 83.33% {
|
|
|
+ background-position: -0px -504px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 86.66% {
|
|
|
+ background-position: -317px -504px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 89.99% {
|
|
|
+ background-position: -0px -546px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 93.33% {
|
|
|
+ background-position: -317px -546px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 96.66% {
|
|
|
+ background-position: -0px -588px;
|
|
|
+ }
|
|
|
+
|
|
|
+ 100% {
|
|
|
+ background-position: -317px -588px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|