当前位置:首页 > uni-app

uniapp 摇骰子

2026-03-04 21:35:08uni-app

实现摇骰子功能的方法

使用动画和随机数生成骰子点数

pages/index/index.vue中创建骰子组件,通过CSS动画模拟摇晃效果。利用Math.random()生成1-6的随机数,动画结束后显示最终点数。

<template>
  <view class="container">
    <view 
      class="dice" 
      :class="{ 'shake': isShaking }"
      @click="rollDice"
    >
      {{ currentValue }}
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      isShaking: false,
      currentValue: 1
    }
  },
  methods: {
    rollDice() {
      if (this.isShaking) return;

      this.isShaking = true;
      this.currentValue = '...';

      setTimeout(() => {
        this.currentValue = Math.floor(Math.random() * 6) + 1;
        this.isShaking = false;
      }, 1000);
    }
  }
}
</script>

<style>
.dice {
  width: 100px;
  height: 100px;
  border: 2px solid #333;
  border-radius: 10px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 40px;
  margin: 50px auto;
  background-color: #fff;
}

.shake {
  animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both;
}

@keyframes shake {
  0% { transform: translateX(0) }
  25% { transform: translateX(-10px) }
  50% { transform: translateX(10px) }
  75% { transform: translateX(-10px) }
  100% { transform: translateX(0) }
}
</style>

使用3D骰子模型增强视觉效果

通过three.js或现成的3D骰子组件实现更真实的3D效果。需先安装相关依赖:

npm install three @types/three

创建3D骰子组件:

import * as THREE from 'three';

// 在mounted中初始化3D场景
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, width/height, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();

// 创建骰子几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff });
const dice = new THREE.Mesh(geometry, material);
scene.add(dice);

// 添加动画循环
function animate() {
  requestAnimationFrame(animate);
  dice.rotation.x += 0.01;
  dice.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();

多平台适配注意事项

微信小程序特殊处理manifest.json中配置"mp-weixin"usingComponents,如需使用webGL需开启相关权限。

APP端优化 考虑使用原生动画API提升性能,在plus命名空间下调用原生震动反馈:

plus.device.vibrate(200);

H5端兼容性 CSS动画需添加各浏览器前缀,3D效果需检测WebGL支持情况:

const isWebGLAvailable = () => {
  try {
    const canvas = document.createElement('canvas');
    return !!window.WebGLRenderingContext && 
      (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
  } catch(e) {
    return false;
  }
}

扩展功能实现

多人联机骰子 通过uni.connectSocket实现WebSocket通信,同步各方骰子结果:

const socketTask = uni.connectSocket({
  url: 'wss://your.server.url',
  success: () => {
    socketTask.onMessage(res => {
      console.log('收到服务器消息:', res.data)
    });
  }
});

历史记录存储 使用uni.setStorage保存每次投掷记录:

uniapp 摇骰子

const history = uni.getStorageSync('diceHistory') || [];
history.push({
  value: this.currentValue,
  time: new Date().toLocaleString()
});
uni.setStorageSync('diceHistory', history);

性能优化建议

  • 避免频繁的DOM操作,使用CSS硬件加速
  • 3D场景中合理设置renderer.setPixelRatio匹配设备DPI
  • 小程序端使用<canvas>代替DOM实现动画
  • 预加载骰子纹理等资源,减少延迟

以上方案可根据具体需求组合使用,基础版本使用CSS动画即可满足大多数场景,需要更复杂效果时可逐步引入3D渲染和网络功能。

标签: 骰子uniapp
分享给朋友:

相关文章

uniapp实现懒加载

uniapp实现懒加载

uniapp实现懒加载的方法 在uniapp中实现懒加载可以通过多种方式,以下是几种常见的方法: 使用uni.lazyLoad组件 uniapp提供了内置的懒加载组件,适用于图片等资源的懒加载。在页…

uniapp实现标题栏渐变

uniapp实现标题栏渐变

实现标题栏渐变的方法 在UniApp中实现标题栏渐变效果,可以通过修改页面的导航栏样式或使用自定义导航栏来实现。以下是几种常见的方法: 方法一:使用原生导航栏渐变 通过修改pages.json中的…

uniapp判断手机定位是否开启

uniapp判断手机定位是否开启

判断手机定位是否开启的方法 在UniApp中判断手机定位是否开启,可以通过调用原生API或使用第三方插件实现。以下是几种常见的方法: 使用uni.getLocation检测定位状态 通过调用uni.…

丸子uniapp

丸子uniapp

丸子UniApp简介 丸子UniApp是一个基于UniApp框架开发的移动应用解决方案,通常用于快速构建跨平台应用(如微信小程序、H5、Android/iOS等)。其核心特点是利用UniApp的“一次…

引擎uniapp

引擎uniapp

uniapp 引擎概述 uniapp 是一个基于 Vue.js 的跨平台开发框架,允许开发者使用单一代码库构建多端应用(如 iOS、Android、Web、小程序等)。其核心引擎通过条件编译和运行时适…

uniapp前端渲染

uniapp前端渲染

uniapp前端渲染的基本原理 uniapp基于Vue.js框架,采用了一套代码多端运行的机制。前端渲染主要通过Vue的虚拟DOM技术实现,在不同平台(H5、小程序、App等)上会编译为对应平台的渲染…