iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >基于vite2+vue3制作个招财猫游戏
  • 907
分享到

基于vite2+vue3制作个招财猫游戏

2024-04-02 19:04:59 907人浏览 独家记忆
摘要

目录介绍演示正文游戏分析招财动画素材加载条带生成无限滚动中奖判定纸屑飞舞结语介绍 端午将至,大家都开始吃粽子了么,你是喜欢吃北方的甜的红枣粽?还是南方的大肉粽呢? 本期我们将使用vi

介绍

端午将至,大家都开始吃粽子了么,你是喜欢吃北方的甜的红枣粽?还是南方的大肉粽呢?

本期我们将使用vite2与vue3开发出一个招财猫小游戏,通过考验眼力和预判能力,在图案不停滚动的同时选出可以转出不同的素材最终得到粽子奖励,康康你能用多少次才会转出自己喜爱口味的粽子吧~

演示

预览地址:jsmask.gitee.io/dwgame_laohuji/

正文

游戏分析

在开发之前,我们要想好游戏设计和规则是如何,才能进行往下进行。通过上图的演示和规则介绍,我们大致可以了解游戏流程了。

然后,根据了解的流程,进行拆解,接下来我们主要会讲解这些问题:

  • 招财猫css3帧动画。
  • 图案条带中的素材在vite2的批量加载。
  • 老虎机图案自定义条带生成。
  • 老虎机无限滚动。
  • 让老虎机停止并且获取抽奖码。
  • 获得粽子后的纸屑飞舞效果的实现。

招财动画

下图是本期用的所有素材,招财猫招手的是由四张图拼凑而成的,用了一些在线的雪碧图生成工具。在里面我们会得到每张图对应的 background-position , 最后再用 animation 来完成这个帧动画。其中,animation-timing-function:steps(1, end) 是帧动画实现的核心,steps() 函数符号定义了一个阶梯函数,将输出值的域划分为等距阶梯。第一个值是需要传入正数,表示等距的数,而后一个表示插值的位置。

.cat {
  width: 574px;
  height: 630px;
  margin: 0px auto;
  position: relative;
  background-image: url("../assets/image/cat.png");
  background-position: -10px -10px;
  &.active {
    animation: play-game 0.64s steps(1, end) infinite;
  }
  @keyframes play-game {
    0% {
      background-position: -10px -10px;
    }
    33% {
      background-position: -604px -10px;
    }
    66% {
      background-position: -1198px -10px;
    }
    100% {
      background-position: -10px -660px;
    }
  }
}

素材加载

我们后面需要通过canvas合成条带,所以要先加载出需要转出的图案来。

按照原始的方案来,我们要手写好多图片资源文件的引入,所以十分麻烦。

import item0 from "../assets/image/item_0.png"
import item1 from "../assets/image/item_1.png"
import item2 from "../assets/image/item_2.png"
// ...more
import item9 from "../assets/image/item_9.png"

但是,Vite 中提供了 import.meta.glob 的语法糖来解决这种批量导入的问题,一次性加载出这些图片文件来。

const imgs = import.meta.globEager("../assets/image/item_*.png");

let num = Object.keys(imgs).length;
let items = Object.values(imgs).map((mod) => {
  let img = new Image();
  img.onload = () => --num <= 0 && initGame();
  img.src = mod.default;
  return img;
});

当然我们这里用 import.meta.globEager 来可以同步加载这些资源。

条带生成

所谓的条带,就是老虎机中滚动的背景图,不停改变 backgroundPositionY 来实现滚动效果,是老虎机的核心,所使用到的条带自然就是重中之重,但在我们平时开发条带一般都是设计给的图片,但经常替换图片后又要重新问他们要新图甚是麻烦。所以,这里我想用 canvas 把刚才的那十张图案拼接起来,形成条带供我们使用。上一步,我们已经把资源加载完成了,接下来,可以需要写一个 createBackgroundImage 函数。

function createBackgroundImage({items = [], w = 45, h = 60, size = 40,test=false}) {
  let canvas = document.createElement("canvas");
  let ctx = canvas.getContext("2d");
  canvas.width = ctx.width = w;
  canvas.height = ctx.height = h * items.length;
  let BackgroundImage = [...items];
  BackgroundImage.forEach((img, i) => {
    ctx.save();
    ctx.drawImage(img, (w - size) / 2, (h - size) / 2 + h * i, size, size);
    if(test){
      ctx.textAlign = "center";
      ctx.textBaseline = "middle";
      ctx.font = "bold 36px Baloo Bhaijaan";
      ctx.fillText(i, w / 2, h * i + h / 2 + 5, w);
    }
    ctx.restore();
  });
  return convertCanvasToImage(canvas);
}

function convertCanvasToImage(canvas) {
  var image = new Image();
  image.src = canvas.toDataURL("image/png");
  return image;
}

export default createBackgroundImage;

这里我们不光可以传入资源数组,而且可以传入块的宽和高,还有图案的大小,为了方便测试后面验证开奖码的正确性,加入 test 字段,如果开启,则会绘制上对应的数字编号。

无限滚动

当我们点击开始游戏按钮后,刚才生成出的条带就会不停的改变 backgroundPositionY ,那有什么好办法可以轻松控制这件事呢?

这里我推荐使用anime.js ,它一个功能强大且轻量级的 javascript 动画库。

# NPM
npm i animejs -S
# YARN
yarn add animejs
# PNPM
pnpm i animejs -S
<ul class="content">
    <li
        ref="block"
        v-for="(item, index) in 3"
        :key="index"
        :style="{ backgroundImage: `url(${backgroundImage.src})` }"
        >
        <button :disabled="stops[index]" @click="handleStop(index)">
            Stop
        </button>
    </li>
</ul>
import anime from "animejs";
function play() {
  if (isActive.value) return false;
  isActive.value = true;
  count.value += 1;
  block.value.forEach((el, index) => {
    setTimeout(() => {
      stops.value[index] = false;
      let y = parseInt(el.style.backgroundPositionY || "0", 10);
      animes.value[index] = anime({
        targets: el,
        backgroundPositionY: [h / 2, h * items.length + h / 2],
        loop: true, // 循环播放
        direction: "nORMal", // 方向
        easing: "linear", // 时间曲线
        duration: 1200, // 播放时间
        autoplay: true, // 是否立即播放
      });
    }, index * 240);
  });
}

play 方法时,我们获取当绑定好条带的元素块,通过 animejsbackgroundPositionY 属性设置一个数组,这个数组第0位代表起始状态,第1位代表要到达的状态。然后把 loop 属性设置 true 。那么一个简单的条带无限滚动就完成了。

中奖判定

function handleStop(index) {
  stops.value[index] = true;
  let el = block.value[index];
  let y = parseInt(el.style.backgroundPositionY || "0", 10);
  animes.value[index].remove(el);
  let n = Math.round((y - h / 2) / h);
  el.style.backgroundPositionY = n * h + h / 2 + "px";
  giftCode.value[index] = (10 - n) % 10;
  if (stops.value.find((item) => !item) === undefined) {
    getResult();
  }
}

当我们每按停一个时,我们会迅速移除对应元素 animejs 动画,计算并赋值给最数值最接近的坐标点。然后获取到其对应的数字编号存起来形成抽奖码数组,当三个全部停止时,会调用 getResult 方法来根据刚才得到的抽奖码来开奖。

const giftData = [
    {
        name: "红枣粽",
        score: 100,
        show: true,
        type:1,
        value: ["012", "025", "126", "256"],
    },
    // ...
]
function getResult() {
  let str = giftCode.value.sort().join("");
  let _obj = giftData.find((item) => item.value.includes(str));
  if (!_obj) return (isActive.value = false);
  if (_obj.show) {
    giftObj.value = _obj;
    ruleShow.value = false;
    giftShow.value = true;
  } else {
    confetti();
    hideGift();
  }
}

这里,我们把得到的抽奖码进行从小往大排列生成字符串,然后在 giftData 数组中找寻配合的组合,达成后进行不同的奖励画面。

纸屑飞舞

这里我使用了 canvas-confetti,它是专门来制作纸屑飞散的动画库。其原理是在页面创建了canvas (也可以指定容器), 然后在里面绘制了几种形状可供选择,通过数学计算,模拟了很多物理运动来完成纸屑动画多彩的效果。

# NPM
npm i canvas-confetti -S
# YARN
yarn add canvas-confetti
# PNPM
pnpm i canvas-confetti -S
import confetti from "canvas-confetti";
function handleSucces() {
  let endTime = Date.now() + 3 * 1000;
  const colors = ["#bb0000", "#ffffff"];
  (function frame() {
    confetti({
      particleCount: 2,
      angle: 45,
      spread: 155,
      origin: { x: 0 },
      colors: colors,
    });
    confetti({
      particleCount: 2,
      angle: 135,
      spread: 60,
      origin: { x: 1 },
      colors: colors,
    });
    if (Date.now() < endTime) {
      requestAnimationFrame(frame);
    }
  })();
}

结语

现在已经把大家开发这类项目可能遭遇的问题或者方案大致给大家讲述完了。不知道,给你带来的帮助是多是少,也不知道大家点击了多少次才得到喜欢吃的粽子了,但不管是什么,开心快乐就好,最后祝大家端午安康,财运,福运多多,幸福满满。

到此这篇关于基于vite2+Vue3制作个招财猫游戏的文章就介绍到这了,更多相关vite2 vue3招财猫游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于vite2+vue3制作个招财猫游戏

本文链接: https://www.lsjlt.com/news/149851.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于vite2+vue3制作个招财猫游戏
    目录介绍演示正文游戏分析招财动画素材加载条带生成无限滚动中奖判定纸屑飞舞结语介绍 端午将至,大家都开始吃粽子了么,你是喜欢吃北方的甜的红枣粽?还是南方的大肉粽呢? 本期我们将使用vi...
    99+
    2024-04-02
  • 基于Vue3制作简单的消消乐游戏
    目录游戏介绍核心思路核心代码htmljs游戏开始/循环删除下落添加生成矩阵/数据点击换位置游戏介绍 先看一下 好吧,我知道界面有点丑 →_→ 核心思路 游戏步骤...
    99+
    2024-04-02
  • 基于JavaScript制作一个骰子游戏
    目录知识点HTML 部分CSS 部分JavaScript 部分总结游戏可以通过这个链接进入  完整源码我已经放在GitHub上了 这节实验我们将使用 HTML、CSS 和 ...
    99+
    2024-04-02
  • 基于JavaSwing制作一个Pong小游戏
    之前呢我们用Python的Pygame做过这个Pong游戏 这一次,我们用Java的Swing来实现类似的效果 首先我们列出本次的项目结构 这个程序分为四个部分,一个程序入口,一...
    99+
    2023-01-05
    Java Swing制作Pong游戏 Java Pong游戏 Java Swing 游戏
  • 基于JS制作一个简易的2048游戏
    效果图 实现代码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-T...
    99+
    2024-04-02
  • 基于PyQt5制作一个猜数字小游戏
    开始之前,直接来看一下实现后的效果。想自己实现或者需要源码的童鞋直接进场... 将PyQt5的相关模块直接导入即可。 from PyQt5.QtGui import * from ...
    99+
    2024-04-02
  • 基于Python怎么制作flappybird游戏
    本篇内容主要讲解“基于Python怎么制作flappybird游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python怎么制作flappybird游戏”吧!开发工具**Python**...
    99+
    2023-06-30
  • 如何基于Vue制作一个猜拳小游戏
    目录前言:项目效果展示:代码实现思路:实现代码:总结:前言: 在工作学习之余玩一会游戏既能带来快乐,还能缓解生活压力,跟随此文一起制作一个小游戏吧。 描述:石头剪子布,是一种猜拳游戏...
    99+
    2023-01-05
    vue 小游戏 vue猜拳小游戏 vue 小游戏动画
  • 基于Java制作一个好玩的打飞机游戏
    目录1.效果图2.项目整体构造3.主类代码展示4.飞机类代码展示5.炮弹类代码展示6.爆炸类代码展示1.效果图 2.项目整体构造 3.主类代码展示 public class M...
    99+
    2024-04-02
  • 基于Python制作打地鼠小游戏
    效果展示 打地鼠小游戏 简介 打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~ 首先,让我们确定一下游戏中有哪些元素。打地鼠打地鼠,地鼠当...
    99+
    2024-04-02
  • 基于JS制作一个网页版的猜数字小游戏
    目录一. 游戏简介二. 页面预览三. 页面实现四. 功能实现五. 参考源码 一. 游戏简介 在输入框内输一个数字,点击后面的“猜”按钮,系统会根据你...
    99+
    2024-04-02
  • 基于Python实现射击小游戏的制作
    目录1.游戏画面1.1开始1.2射击怪物2.涉及知识点3.代码3.1发射声3.2背景3.3射击效果4.经验总结1.游戏画面 1.1开始 1.2射击怪物 2.涉及知识点 1.spr...
    99+
    2024-04-02
  • 基于Python制作简单的井字棋游戏
    目录前言基本框架定义button功能实现效果前言 五一放假了,今天还要继续内卷。我们今天来给大家写一个小游戏,无聊的时候可以玩一玩摸摸鱼。 基本框架 from tkinter imp...
    99+
    2023-05-18
    Python实现井字棋游戏 Python实现井字棋 Python井字棋
  • 基于Python制作flappybird游戏的详细步骤
    目录导语开发工具相关模块:环境搭建先睹为快原理简介总结导语 因为疫情无奈只能在家宅了好多天,随手玩了下自己以前做的一些小游戏,说真的,有几个游戏做的是真的劣质,譬如 flappybi...
    99+
    2024-04-02
  • 基于C#制作一个飞机大战小游戏的全过程
    目录前言实现流程1、创建项目2、界面绘制3、我方飞机4、敌方飞机5、子弹及碰撞检测 总结前言 此文主要基于C#制作一个飞机大战游戏,重温经典的同时亦可学习。 实现流程 1...
    99+
    2023-02-16
    c#飞机大战课程 c#飞机大战小游戏 飞机大战小游戏代码
  • python基于tkinter制作图形界面的2048游戏
    目录2048游戏输出项目先决条件 创建main.py 解释:1.Board:2.game:总结 2048游戏输出 项目先决条件 前提条件如下: 1. Python 2. Tkin...
    99+
    2024-04-02
  • 基于Python制作炸金花游戏的过程详解
    目录前言一、思路二、解决方案三、总结前言 《诈金花》又叫三张牌,是在全国广泛流传的一种民间多人纸牌游戏。比如JJ比赛中的诈金花(赢三张),具有独特的比牌规则。游戏过程中需要考验玩家的...
    99+
    2024-04-02
  • 基于Python怎么制作简单的井字棋游戏
    基本框架from tkinter import * import tkinter.messagebox as msg root = Tk() root.title('井字棋') # labels L...
    99+
    2023-05-19
    Python
  • 基于Matlab制作一款简单的龙舟小游戏
    效果图: 没找到合适的背景就自己画了个,大家如果有更好看的可以换一下。。。 步骤 1 创建Axes及图片导入 窗口创建: Mainfig=figure('units','pixe...
    99+
    2024-04-02
  • 基于Matlab制作伪3D第一视角迷宫小游戏
    目录游戏效果游戏原理说明第一代程序计算交点方法第二代程序计算交点方法距离转换为线段长度完整代码游戏效果 使用键盘上方向键↑向前移动 使用键盘左右方向键调整← ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作