JavaScript实现H5接金币功能(实例代码)


Posted in Javascript onFebruary 22, 2021

今日做出做出一个春节接金币红包的活动,感觉挺不错的分享给大家
这个小游戏采用hilojs实现的,详情

第一步:安装插件

npm i hilojs或者yarn add hilojs

第二步:创建一个Asset.js文件

import Hilo from "hilojs";
export default Hilo.Class.create({
 Mixes: Hilo.EventMixin,
 queue: null, // 下载类
 gold: null, // 金币
 wood: null, // 金币
 water: null, // 蛋
 fireElement: null, // 金币
 soil: null, // 红包
 person: null, // 车
 score0: null, // 
 score1: null, // 
 score2: null, // 
 load() {
 let imgs = [
  {
  id: 'soil',//红包
  src: require('../../../assets/image/red.png')
  },
  {
  id: 'water',//蛋
  src: require('../../../assets/image/dan.png')
  },
  {
  id: 'gold',//金币
  src: require('../../../assets/image/money3.png')
  },
  {
  id: 'person',//车
  src: require('../../../assets/image/che1.png')
  }
 ];
 this.queue = new Hilo.LoadQueue();
 this.queue.add(imgs);
 this.queue.on('complete', this.onComplete.bind(this));
 this.queue.on('error', (e) => {
  console.log('加载出错', e)
 })
 this.queue.start();
 },
 onComplete() { //加载完成
 console.log('加载完成')
 this.gold = this.queue.get('gold').content;//金币
 
 this.water = this.queue.get('water').content;//蛋
 
 this.soil = this.queue.get('soil').content;//红包
 this.person = this.queue.get('person').content;
 //删除下载队列的complete事件监听
 this.queue.off('complete');
 // complete暴露
 this.fire('complete');
 }
})

第三步:创建一个game.js文件

import Hilo from "hilojs";
import Asset from './Asset'//定义金币红包车参数
import Gold from './gold'//随机生成金币红包臭蛋
import Hand from './hand'//汽车初始化级碰撞
let startTime = 0
export default class game {
 constructor(page) {
 this.page = page
 //设置的游戏时间
 
 this.gameTime = 0
 this.gameStatus = "ready"
 /*
  play 游戏开始
  ready 游戏结束
 **/
 // 下载队列
 this.asset = new Asset()
 // 画布对象
 this.stage = null

 // 画布信息 
 this.width = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) * 2
 // this.height = innerHeight * 2 < 1334 ? innerHeight * 2 : 1334
 this.height = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight) * 2
 this.scale = 0.5

 // 定时器对象
 this.ticker = null

 //金币红包臭蛋
 this.Gold = null
 //金币红包臭蛋下落速度
 this.enemySpeed = 1000//金币下落速度
 this.redSpeed = 1000//红包下落速度
 this.danSpeed = 1000//红包下落速度
 //金币红包臭蛋生成速度
 this.createSpeed = 200
 //接金币红包臭蛋的车
 this.hand = null
 //开始按钮
 this.beginBtn = null
 //分数
 this.score = 0
 //定义一个碰撞的数组
 this.crashList = []
 this.isEnd = false
 //砸中臭蛋数量
 this.danNum = 0
 //定时器
 this.timerAll = null
 }
 init() {
 this.asset.on('complete', function () {
  this.asset.off('complete')
  this.initStage()
 }.bind(this));
 this.asset.load()
 }
 initStage() {
 // console.log(this.width,this.height)
 // 舞台
 this.stage = new Hilo.Stage({
  renderType: 'canvas',
  width: this.width,
  height: this.height,
  scaleX: this.scale,
  scaleY: this.scale,
  container: this.page
 });
 this.stage.enableDOMEvent([Hilo.event.POINTER_START, Hilo.event.POINTER_MOVE, Hilo.event.POINTER_END]);

 // 启动定时器刷新页面 参数为帧率
 this.ticker = new Hilo.Ticker(60)
 // 舞台添加到定时队列中
 this.ticker.addTick(this.stage)
 // 添加动画类到定时队列
 this.ticker.addTick(Hilo.Tween);
 //启动ticker
 this.ticker.start(true);
 this.startGame();
 }

 startGame() { //开始游戏
 startTime = new Date().getTime()
 this.initZongzi();
 this.initHand()
 //this.beginBtn.removeFromParent()
 this.stage.removeChild(this.beginBtn)
 this.gameTime = this.setGameTime;
 this.score = 0;
 this.crashList = [];
 this.isEnd = false;
 this.gameStatus = "play"

 this.calcTime()
 }
 calcTime() { //游戏时间
 this.timerAll = setTimeout(() => {
  let now = new Date().getTime()
  let difference = parseInt((now - startTime) / 1000)
  if (difference % 30 == 0) {
  this.Gold.score[0] = this.Gold.score[0] + 5
  this.Gold.score[2] = this.Gold.score[2] + 5
  this.Gold.enemySpeed = this.Gold.enemySpeed + 500
  this.Gold.redSpeed = this.Gold.redSpeed + 200
  this.Gold.danSpeed = this.Gold.danSpeed + 300
  }
  
  this.calcTime()
  }, 1000);
 }
 clearCalcTime() {
 this.Gold.score[0] = 5
 this.Gold.score[2] = 5
 this.Gold.enemySpeed = 1000
 this.Gold.redSpeed = 1000
 this.Gold.danSpeed = 1000
 clearTimeout(this.timerAll);
 }
 gameOver() {//游戏结束调用
 this.Gold.stopCreateEnemy()

 this.gameStatus = "ready"
 this.initBeginBtn()

 //this.hand.removeChild(this.hand.score)
 this.stage.removeChild(this.hand)
 }
 initZongzi() {//初始化金币红包
 this.Gold = new Gold({
  id: 'gold',
  height: this.height,
  width: this.width,
  enemySpeed: this.enemySpeed,
  redSpeed: this.redSpeed,
  danSpeed: this.danSpeed,
  createSpeed: this.createSpeed,
  pointerEnabled: false, // 不关闭事件绑定 无法操作舞台
  SmallGoldList: [this.asset.gold, this.asset.water, this.asset.soil],
  startTime
 }).addTo(this.stage, 2)
 //舞台更新
 this.stage.onUpdate = this.onUpdate.bind(this);
 }
 initHand() {//初始化手
 this.hand = new Hand({
  id: 'hand',
  img: this.asset.person,
  height: this.asset.person.height,
  width: this.asset.person.width,
  x: this.width / 2 - this.asset.person.width / 4,
  y: this.height - this.asset.person.height / 2 - 40
 }).addTo(this.stage, 1);
 Hilo.util.copy(this.hand, Hilo.drag);
 
 this.hand.startDrag([0, this.height - this.asset.person.height / 2 - 40, this.width - this.asset.person.width / 2 + 10, 0]);
 }
 onUpdate() {//舞台更新
 if (this.gameStatus == 'ready') {
  return
 }
 // console.log('碰撞', this.crashList)
 let num = []
 this.crashList.forEach(e => {
  if (e == 'dan') {
  num.push(e)
  }
 })
 this.danNum = num.length
 if (num.length >= 3) {//游戏结束
  console.log('游戏结束')
  this.clearCalcTime()
  this.isEnd = true;
  this.gameOver()
  return
 }
 this.Gold.children.forEach(item => {
  if (this.hand.checkCollision(item)) {
  
  if (item.drawable.image.src.indexOf("red") != -1) {
   this.crashList.push('red')
  }
  if (item.drawable.image.src.indexOf("money3") != -1) {
   this.crashList.push('money3')
  }
  if (item.drawable.image.src.indexOf("dan") != -1) {
   this.crashList.push('dan')
  }
  // 碰撞了
  item.over();
  this.score += item.score || 0;
  switch (item.score) {
   case -1:
   this.hand.addScore(this.asset.score0)
   break;
   case 1:
   this.hand.addScore(this.asset.score1)
   break;
   case 2:
   this.hand.addScore(this.asset.score2)
   break;

   default:
   break;
  }
  }
 })
 }
 initBeginBtn() {
 }
}

第四步:创建一个gold.js文件

import Hilo from "hilojs";
import SmallGold from './SmallGold'
let Enemy = Hilo.Class.create({
 Extends: Hilo.Container,
 
 timer: null, // 定时器
 SmallGoldList: [],
 enemySpeed: 0,
 redSpeed: 0,
 danSpeed: 0,
 createSpeed: 0,
 score: [5, 0, 5],
 tween: null,
 startTime: null,
 constructor: function (properties) {
 Enemy.superclass.constructor.call(this, properties);
 this.startTime = properties.startTime
 
 this.tween = Hilo.Tween;
 this.creatEnemy();
 this.beginCreateEnemy();
 },
 
 creatEnemy() { 
 let now = new Date().getTime()
 let difference = parseInt((now - this.startTime) / 200)
 
 let index = null;
 let differenceNow = parseInt((now - this.startTime) / 1000)
 
 if (0 <= differenceNow && differenceNow <= 60) {
  if (difference == 0) {
  index = 0
  this.createGold(index, this.enemySpeed)
  } else if (difference % 70 == 0) {//0-15秒,障碍蛋1个
  index = 1
  this.createGold(index, this.danSpeed)
  } else if (difference % 147 == 0 || difference % 154 == 0) {//15-30秒障碍蛋2个(150-155)
  index = 1
  this.createGold(index, this.danSpeed)
  } else if (difference % 222 == 0 || difference % 226 == 0 || difference % 235 == 0) {//30-45秒障碍蛋3个(225-230)
  index = 1
  this.createGold(index, this.danSpeed)
  } else if (difference % 296 == 0 || difference % 302 == 0 || difference % 307 == 0 || difference % 311 == 0) {//60秒,障碍蛋4个
  index = 1
  this.createGold(index, this.danSpeed)
  } else {
  let number = this.random(0, 100);
  if (number < 40) { //0为金币2位红包1为蛋
   index = 0
   this.createGold(index, this.enemySpeed)
  } else if (number <= 100) {
   index = 2
   this.createGold(index, this.redSpeed)
  }

  }
  
 } else {
  let nowmiao = difference - 300
  if (nowmiao % 70 == 0 || nowmiao % 75 == 0 || nowmiao % 78 == 0 || nowmiao % 85 == 0) {//0-15秒,障碍蛋4个
  index = 1
  this.createGold(index, this.danSpeed)
  } else {
  let number = this.random(0, 100);
  if (number < 40) { //0为金币2位红包1为蛋
   index = 0
   this.createGold(index, this.enemySpeed)
  } else if (number <= 100) {
   index = 2
   this.createGold(index, this.redSpeed)
  }

  }
  
 }
 },
 createGold(index, enemySpeed) {
 let hold = undefined
 if (this.SmallGoldList[index].width && this.SmallGoldList[index].height) {
  hold = new SmallGold({
  image: this.SmallGoldList[index],
  rect: [0, 0, this.SmallGoldList[index].width, this.zongziList[index].height],
  width: this.SmallGoldList[index].width / 2,
  height: this.SmallGoldList[index].height / 2,
  // scaleX: 0.5,
  // scaleY: 0.5,
  }).addTo(this);
 }
 let widthScreen = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
 let heightScreen = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight

 hold.x = 0.45 * widthScreen;
 hold.y = 0.4 * heightScreen;
 

 hold.score = this.score[index]

 this.tween.to(hold, {
  x: this.random(0, (this.width - this.SmallGoldList[0].width / 2)),
  y: this.height
 }, {
  duration: 1400 / enemySpeed * 1000,
  loop: false,
  onComplete: () => {
  hold.removeFromParent()
  }
 });
 },
 random(lower, upper) {
 return Math.floor(Math.random() * (upper - lower + 1)) + lower;
 },
 beginCreateEnemy() {//开始生成
 this.timer = setInterval(() => {
  this.creatEnemy();
 }, this.createSpeed);
 },
 stopCreateEnemy() {//停止生成并全部移除
 clearInterval(this.timer)
 this.removeAllChildren()
 },
 checkCollision(enemy) {//碰撞检测
 for (var i = 0, len = this.children.length; i < len; i++) {
  if (enemy.hitTestObject(this.children[i], true)) {
  return true;
  }
 }
 return false;
 }
})

export default Enemy

第五步:创建一个hand.js文件

import Hilo from "hilojs";
let hand = Hilo.Class.create({
 Extends: Hilo.Container,

 // 图
 img: null,
 //车
 bowl: null,
 //分数
 score: null,

 constructor(properties) {
 hand.superclass.constructor.call(this, properties)
 this.initHand()
 },
 initHand() { //初始化背景
 this.hand = new Hilo.Bitmap({
  id: 'hand',
  image: this.img,
  rect: [0, 0, this.img.width, this.img.height],
  width: this.img.width / 2,
  height: this.img.height / 2,
  // scaleX: 0.5,
  // scaleY: 0.5,
 }).addTo(this);
 },
 addScore(image) { //加分
 if (this.img.width && image.width) {
  this.score = new Hilo.Bitmap({
  id: 'score',
  image: image,
  rect: [0, 0, image?.width || 0, image?.height || 0],
  x: (this.img.width - image.width) / 2,
  y: -image.height
  }).addTo(this);
 }

 if (this.img.width && image.width) {
  Hilo.Tween.to(this.score, {
  x: (this.img.width - image.width / 2) / 2,
  y: -2 * image.height,
  alpha: 0,
  width: image.width / 2,
  height: image.height / 2
  }, {
  duration: 600,
  //delay: 100,
  ease: Hilo.Ease.Quad.EaseIn,
  onComplete: () => {

  }
  });
 }

 },
 // 碰撞检测
 checkCollision(enemy) {
 if (enemy.hitTestObject(this.hand, true)) {
  return true;
 }
 return false;
 }
})

export default hand

第六步:创建一个SmallGold.js文件

import Hilo from "hilojs";
let SmallGold= Hilo.Class.create({
 Extends: Hilo.Bitmap,
 constructor: function (properties) {
 SmallGold.superclass.constructor.call(this, properties);
 this.onUpdate = this.onUpdate.bind(this);
 },
 over(){
 this.removeFromParent();
 },
 onUpdate() {
 if (this.parent.height < this.y) {
 this.removeFromParent();
 return
 }
 }
 })
 
export default SmallGold

我这是在vue中使用

<template>
 <div class="fix">
 <div class="hilo">
 <div ref="hilo" class="canvas"></div>
 <img src="../../assets/image/youton3.png" alt="" class="tong" />
 
 <div class="score">
 <div class="left">
  <img :src="headimgurl" alt="" class="headimgurl" />
  <div class="p1">
  <p class="p2">玩家:{{ nickname }}</p>
  <p class="p3">
  得分:{{ score }}
  <span
  ><img
   src="../../assets/image/dan21.png"
   alt=""
   class="danNum"
  />x{{ danNum }}</span
  >
  </p>
  </div>
 </div>
 </div>
 </div>
 </div>
</template>

<script>
import Game from "./js/game";
export default {
 name: "game",

 data() {
 return {
 game: new Game(),
 
 };
 },
 computed: {
 score() {
 //游戏分数
 return this.game.score;
 },
 danNum() {
 //黑蛋碰撞个数
 return this.game.danNum;
 },
 
 },
 watch: {
 "game.isEnd": {
 handler(newName) {
 // console.log(newName);
 if (newName) {
  this.goTo();
 }
 },
 immediate: true,
 },
 },
 mounted() {
 this.$nextTick(() => {
 this.game.page = this.$refs.hilo;
 this.game.init();
 });
 
 },
 beforeDestroy() {
 this.game.gameOver();
 },
 destroyed() {},
 methods: {
 goTo(){}
 },
};
</script>

最后效果

JavaScript实现H5接金币功能(实例代码)

到此这篇关于JavaScript实现H5接金币功能(实例代码)的文章就介绍到这了,更多相关JavaScript接金币内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js返回上一页并刷新的多种实现方法
Feb 26 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
基于Jquery实现键盘按键监听
May 11 Javascript
jQuery插件jRumble实现网页元素抖动
Jun 05 Javascript
JavaScript中的函数(二)
Dec 23 Javascript
Javascript中数组去重与拍平的方法示例
Feb 03 Javascript
浅谈react+es6+webpack的基础配置
Aug 09 Javascript
浅谈Angular4实现热加载开发旅程
Sep 08 Javascript
jquery实现左右轮播图效果
Sep 28 jQuery
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
vue实现购物车案例
May 30 Javascript
EXTJS7实现点击拖拉选择文本
Dec 17 Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 #Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 #Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 #Javascript
k8s node节点重新加入master集群的实现
Feb 22 #Javascript
js实现简单图片拖拽效果
Feb 22 #Javascript
用vite搭建vue3应用的实现方法
Feb 22 #Vue.js
详解Vite的新体验
Feb 22 #Javascript
You might like
PHP下常用正则表达式整理
2010/10/26 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
PHP中的替代语法简介
2014/08/22 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
python实现大转盘抽奖效果
2019/01/22 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
小学红领巾中秋节广播稿
2014/01/13 职场文书
在校实习生求职信
2014/06/18 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
国企干部对照检查材料
2014/08/22 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书