VUE+WebPack前端游戏设计:能量气泡的螺旋升腾特效

游戏的虚拟世界里与现实世界总有一一对应之处。例如在现实世界中,你不工作就不会有收入,而在游戏世界里,玩家不挖矿就没有能源,没有能源自然就无法购买道具或建造各种设备,于是游戏就无法进行。我们这次设计的前端游戏也是如此,必须提供一个机制给玩家获取资源以便用于创建各种道具,进而增强游戏的互动性。

本节代码完成后效果如下,当玩家在页面上建造一个卫星道具后,每隔一段时间就会有一个能量泡从卫星处弹出,然后以固定轨迹慢慢的往顶部升腾,当玩家用鼠标点击能量泡后,玩家就可以获得100点的资源,这些资源可用来购买更高级的道具,实现后页面效果如下:

屏幕快照 2018-03-20 下午5.29.23.png

文本无法显示动态效果,更详细的讲解和代码调试演示过程,请点击链接

能量泡的实现与上一节我们实现两个从天而降的外星人原理是一样的。首先我们先完成能量泡的对象构建,在gamescenecomponent.js 中添加如下代码:

energy (x, y) {
        var obj = new this.cjs.Container()
        obj.addChild(new this.assetsLib.Energy())
        obj.cache(-25, -25, 50, 50)
        obj.x = x || 0
        obj.y = y || 0
        // 记录起始x坐标
        obj.baseX = obj.x
        // 膨胀1.2倍再缩回原有尺寸
        this.cjs.Tween.get(obj, {loop: true}).to({scaleX: 1.2, scaleY: 1.2}, 600).to({scaleX: 1.0, scaleY: 1.0}, 600)
        obj.on('mousedown', this.energyClick)
        this.energyList.push(obj)
        console.log('create energy: ', obj)
        return obj
      },

代码先创建一个cjs容器对象,然后从资源库assetsLib中把能量泡的图片资源加载进来,这里要注意的是,能量泡会在页面里显示多个,为了让它的图片资源加载一次就可以多次使用,所以代码中调用cache接口把图片资源缓存起来。能量泡有一个动态变化效果,就是它会一胀一缩,这个特效是有语句" this.cjs.Tween.get(obj, {loop: true}).to({scaleX: 1.2, scaleY: 1.2}, 600).to({scaleX: 1.0, scaleY: 1.0}, 600)"实现的,该语句会把能量泡的图片在x,y两个方向上扩大1.2倍,等600毫秒后再恢复原状,接着又继续扩大。

每生成一个能量泡对象,我们就把它加入队列energyList以便后续使用。为了实现能量泡持续上升这个动画效果,我们需要在刷新回调函数里改变它的y坐标。于是我们添加如下代码:

energyTick (energy) {
        if (this.cjs.Ticker.getPaused()) {
          return
        }
        // 以正玄曲线的方式运动
        var offsetX = Math.sin(this.cjs.Ticker.getTicks() / 10) * 20
        energy.x = energy.baseX + offsetX
        energy.y -= 0.5
      },

在游戏主循环里会不断的调用Tick函数,而在该函数里,我们会调用上面的函数用于改变能量泡的y坐标,上面代码先是用正玄函数做计算,然后把计算结果应用到能量泡的x坐标上,这就意味着能量泡的上升不是简单的垂直起降,而是沿着正玄波动徐徐上升,它的上升轨迹如下图:

屏幕快照 2018-03-20 下午5.46.27.png

当玩家点击了能量泡后,玩家就可以获得新能源,这些能源可用来购买更高级的道具,能量泡点击后的响应代码如下:

energyClick (e) {
        console.log('energyClick: ', e.currentTarget)
        this.energies += 100
        this.removeItem(this.energyList, e.currentTarget)
        e.currentTarget.parent.removeChild(e.currentTarget)
      }

每次点击能量泡后,玩家会获得100个单位的能量,同时能量泡会从页面上删除,上面代码里的e.currentTarget对应的就是由energy()接口创建的能量泡对象。当我们在页面上拖拽一个卫星对象后,卫星会启动一个时钟,一旦时钟结束后,一个能量泡就能从卫星所在的位置飘出来,代码如下:

satellite () {
        var b = this.building()
        b.addChild(new this.assetsLib.Satellite())
        b.cache(-50, -50, 100, 100)
        b.hp = 150
        b.cost = 30

        // change here
        b.ticks = 0
        b.energyFrequency = 500
        this.satelliteList.push(b)
        return b
      },

每创建一个卫星对象,它就会被加入到stalliteList数组里,同时设定一个频率,也就是经过500个ticks的后,它会触发一个能量泡的创建,由此我们继续添加如下tick响应函数:

satelliteTick () {
        for (var i = 0; i < this.satelliteList.length; i++) {
          var satellite = this.satelliteList[i]
          satellite.ticks += 1
          if (satellite.ticks % satellite.energyFrequency === 0) {
            console.log('summonnEnergy')
            this.summonEnergy(satellite)
          }
        }

        for (i = 0; i < this.energyList.length; i++) {
          this.energyTick(this.energyList[i])
        }
      },

上面函数中,它会遍历所有的卫星对象,检测每个卫星对象所附带的计数器是否已经达到500毫秒,如果达到则调用summonEnergy接口创建能量泡,在函数里它还遍历了能量泡列表,同时调用energyTick函数,这个函数用于改变能量泡的y坐标实现能量泡动态上升的页面效果,我们看看summonEnergy是如何创建能量泡对象的:

// change here
      summonEnergy (satellite) {
        var pos = satellite.localToLocal(0, 0, this.effectLayer)
        console.log('in summonEnergy: ', this)
        var energyObj = this.energy(pos.x, pos.y)
        this.effectLayer.addChild(energyObj)
      },

代码先通过卫星对象获得其页面坐标,能量泡将从卫星所在的位置生成。代码调用energy接口创建能量泡对象后,把它加入特效图层,也就是effectLayer。特效图层在页面上的z坐标最高,也就是说任何加入特效图层的对象都会在最顶部显示。接着我们在boardTick函数里面启动能量泡的动画流程,代码修改如下:

boardTick () {
...
// change here
this.satelliteTick()
},

satelliteTick接口会遍历卫星数组,一旦卫星对象的计数器达到给定数值,那么就会触发能量泡的创建,这样就可以看到我们在文章开头演示的能量泡动画特效。更生动的视频演示请点击如下链接:
课程视频链接

欢迎关注公众号,让我们一起学习,交流,成长:


文章公众号.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,037评论 0 21
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,621评论 2 17
  • 晚上跟妈妈视频的时候接到朱大大的电话,她爸爸心脏出了问题,现在特别危险,说话的声音都在颤抖,挺难受的。前几天朋友才...
    叶子卷阅读 326评论 0 3
  • 管理学生对我来说完全就是一门新课题,不过既然选择,就要坚守。虽然刚开始有诸多不适,但是通过对一些锁事的处理,以及...
    李燕丽阅读 334评论 0 0
  • 2018年2月3日 星期六 上午 晴天 《深度工作》是继《刻意练习》后的又一本深度解读如何做到专注力学习的好书。尤...
    寻美丽阅读 127评论 0 0