VUE+WebPack前端游戏设计:实现外星人的动态下滑特效

本文主要是介绍VUE+WebPack前端游戏设计:实现外星人的动态下滑特效,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一节,我们完成了道具在页面上的拖拽特效。当用户在页面底部点击按钮选择一个道具后,鼠标在页面上移动时,一个闪光方块会跟随着鼠标移动,一旦鼠标在页面上单击后,相应的道具就会出现在鼠标点击的地方。

有了道具,本节我们要引入侵略外星人,完成本节代码后,可以得到如下效果:
这里写图片描述

页面上有两个外星人从高空徐徐下落,后面我们会开发代码,让用户拖拽的道具能阻止外星人的下滑,此处看不到动态效果,更详实的演示请点击如下链接:
更详细的讲解和代码调试演示过程,请点击链接

我们看看对应的代码实现。首先我们先创建外星人的类对象,在gamesceneComponent.js中添加如下代码:

enemy () {var enemyObj = new this.cjs.Container()enemyObj.originalSpeed = 0.5enemyObj.deceleration = 0.4enemyObj.hp = 10enemyObj.damageDeal = 10enemyObj.attackSpeed = 100enemyObj.speed = enemyObj.originalSpeedreturn enemyObj},

enemy 函数调用后返回一个cjs的容器对象,这个对象在后面会用来加载外星人对应的图片资源。在函数中配置了外星人对象的一些基本属性,例如speed代表它下落速度的快慢,daageDeal表示外星人的攻击力等。这个函数用于创建外星人的类原型,我们继续添加代码在原型的基础上增加配置,进而实现不同种类的外星人:

enemyTick (enemyObj) {if (this.cjs.Ticker.getPaused()) {return}if (enemyObj.speed < 0) {enemyObj.speed = 0}enemyObj.y += enemyObj.speed},enemyDummy () {var dummy = this.enemy()dummy.addChild(new this.assetsLib.Enemy1())dummy.originalSpeed = 0.3dummy.deceleration = 0.002dummy.hp = 1dummy.speed = dummy.originalSpeedreturn dummy},boss () {var bossEnemy = this.enemy()bossEnemy.addChild(new this.assetsLib.Boss())bossEnemy.originalSpeed = 0.2bossEnemy.deceleration = 0.002bossEnemy.hp = 300bossEnemy.attackSpeed = 50return bossEnemy}

enemyDummy和boss两个函数用来创建两种不同级别的外星人,enemyDummy创建的外形人就是上面图片演示中的宇宙飞船,boss就是上面图片中处于低位的方块机器人。这两个函数分别给enemy返回的容器对象加载不同的图片资源,然后配置不同的属性,例如速度,攻击力等,enemyDummy生成战斗力较弱的外星人,它的速度和攻击力都要比boss生成的外星人低。enemyTick函数用来在游戏的主循环中不断的更改外星人对象的相关属性,在该函数里是修改了外星人的速度属性,于是就形成了外星人在页面上不断从高处往下落的动态效果。

接下来我们要实现的回调函数,在游戏的Tick回调函数里被执行,这样它就能动态的在页面上绘制外星人对象从而实现动画效果,其代码如下:

init () {
...
this.boardLayer = this.Board()
this.stage.addChild(this.boardLayer)
// change here
// 手动添加两个敌人对象
this.addEnemy('enemyDummy')
this.addEnemy('boss')
this.lives = 2
...
},
...
tick () {
...// change herethis.boardTick()},...
// change hereboardTick () {// 从敌人对象数组中取出敌人对象,根据属性更新敌人对象在页面上的位置this.enemyMap = this.create2DArray(this.boardLayer.cols, this.boardLayer.rows)for (var i = 0; i < this.enemyList.length; i++) {var enemy = this.enemyList[i]var rowCol = this.screenToRowCol(enemy.x, enemy.y)this.enemyMap[rowCol.col][rowCol.row] = enemyenemy.col = rowCol.colenemy.row = rowCol.rowthis.enemyTick(enemy)}var len = 0// 当敌人对象落入到页面底部以后将其从页面上删除for (i = 0, len = this.enemyMap.length; i < len; i++) {if (this.enemyMap[i][this.boardLayer.rows] !== undefined) {var bottomEnemy = this.enemyMap[i][this.boardLayer.rows]this.lives -= 1this.removeItem(this.enemyList, bottomEnemy)if (bottomEnemy.parent) {bottomEnemy.parent.removeChild(bottomEnemy)}}}},// change hereaddEnemy (enemyClass) {var sprite = nullswitch (enemyClass) {case 'enemyDummy':sprite = this.enemyDummy()breakcase 'boss':sprite = this.boss()break}this.boardLayer.addChild(sprite)var col = Math.floor(Math.random() * this.boardLayer.cols)var pos = this.rowColToScreen(0, col)sprite.x = pos.xsprite.y = pos.ysprite.row = 0sprite.col = colthis.enemyList.push(sprite)},

addEnemy函数根据传入参数调用相关接口构造外星人对象,如果传入的参数是’dummyEnemy’,那么它调用dummyEnemy接口创建战斗力若的飞船外星人,如果传入参数是’boss’,那么它调用boss接口创建方块机器人,然后它把创建的外星人对象加入到板块图层,同时设置好它在图层中的坐标后,将对象加入到enemyList数组。

在init函数中,我们增加两行代码,通过调用addEnemy接口创建了两个外星人。boardTick函数用来不断的更新外星人对象在页面上的坐标,进而形成外星人在页面上变动的动态效果。它先调用create2DArray函数建立一个二维数组对象,然后根据外星人在页面上的坐标把外星人对象存储在这个二维数组的相应坐标下,然后调用enemyTick修改外星人对象的速度属性进而改变外星人的下降速度,进而改变外星人在页面上的坐标从而营造出外星人对象不断从高处下落的效果。

第二个for循环用于判断外星人的y坐标是否已经超出页面,如果是那么就把它从板块图层里删除,回收对象占据的页面内存。boardTick函数会在Tick函数里调用,Tick函数是游戏主循环不断调用的刷新函数,因此boardTick的调用频率跟Tick一样,于是它一旦执行就可以不断的修改外星人对象的坐标,进而形成下落效果。

下一节,我们将进一步开发更多更复杂的游戏功能,更详细的讲解和代码调试演示过程,请点击链接。

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述

这篇关于VUE+WebPack前端游戏设计:实现外星人的动态下滑特效的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950065

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们