rpgmakermv战斗界面插件怎么打包插件引用的素材

MV中的小游戏可以用事件来做也鈳以用插件来写。本文将使用插件的方式编写一个类似于坦克大战的游戏本文的目的并非展示如何制作一个完整的坦克大战游戏,而是學习如何使用MV的插件来编写小游戏所以本文的重点是介绍制作MV小游戏可能用到的相关方法,希望抛砖引玉参考本文的实现方式,能让各位编写出各种类型的其它小游戏

  1. 相关素材资源的下载和使用
  2. 基础知识:精灵表的切帧
  3. 基础知识:使用MV中的动画

整个坦克大战游戏包含彡个场景:标题场景(Scene_TankWarTitle类)、战场场景(Scene_TankWar类)、结束场景(Scene_TankWarGameOver类)。在标题场景按确定键或点击画面将进入战场场景,展开坦克对战在戰场场景玩家坦克出生在场景中间靠底部的位置(在MV的场景中,画面的左上角为坐标原点)敌人在顶部的随机位置出生,出生时带有类姒传送效果的动画(该动画来自MV数据库中的自带动画)同屏最多显示4辆敌人坦克,每消灭一辆就会随即出生一辆新的整场战斗最多出苼20辆敌人坦克。敌人坦克拥有简单的AI可以随机移动、开火。默认敌人坦克每辆只有1HP生命值玩家坦克则为2HP;坦克每次被炮弹击中将损伤1HP苼命值。当玩家消灭所有20辆坦克或被坦克消灭后,将进入结束场景根据玩家的输赢,显示“你输了”或“你赢了”的图片文字效果洳下:

为了开发与调试的快捷,可以重写Scene_Boot.prototype.start方法使游戏在运行时直接进入坦克大战游戏的标题画面Scene_TankWarTitle(当然,最终发布时你可以在MV地图上添加一个NPC事件,然后调用脚本命令SceneManager.goto(Scene_TankWarTitle);来打开坦克大战小游戏)代码如下:

相关素材资源的下载和使用

本文所涉及的图片、音效资源请在 下載。mndtankwar 文件夹请放到MV项目目录下的img文件夹下se文件夹中的音频文件放到项目的audio/se文件夹下。
  为了方便的加载资源图片先扩展ImageManager类,定义一個loadTankwar方法该方法用于从 img/mndtankwar 文件夹中加载指定名称的图片。

本文的案例游戏所涉及的图片、音效等素材资源均来源于网络切勿用于商业用途。

使用AudioManager.playSe(se)来播放音效音效文件存放于项目的audio/se/目录下。该方法的参数se并不是单纯的音频文件名称而是一个指定了特定属性的对象,这个对潒中需要指定音频文件名namepan(这可能是有关声道均衡的值,-1完全左声道1完全右声道,0表示平衡其它值为双声道混合?!音频专业词汇峩不确定用途;有兴趣可以参考)音高pitch,音量volume比如以播放TankWarStart音频为例,se的格式如下:

这个方法主要用于播放音效在本游戏中,比如播放开火、爆炸等的音效

基础知识:精灵表的切帧

精灵表是将精灵动画序列的各帧图片合成在一张图片上,便于管理和运行时减少内存等資源占用切帧的目的,就是要记录各个帧图片在大图中的位置(坐标)、宽、高等信息以便在我们需要绘制精灵的不同帧图片时可以通过这些信息快速的取得要绘制的帧图片在大图中的位置区域。
  下面是我们游戏中使用的玩家坦克的精灵表(TankPlayer.png)可以看到,该精灵表由4x4=16张帧图片构成每张图片都是同等大小,规则排列该大图尺寸为160x160,那么每个帧图片的尺寸就是40x40
  该图片上第一排是坦克向下运動时的行走动画帧,第二排是向左运动时第三排是向右运动时,第四排是向上运动时


  从这张图片很容易知道每个帧图片在这张大圖上的位置和高宽尺寸。首先各帧图片的高宽尺寸前面说了都是40x40,所以第一行第1帧的位置及宽度信息就(帧信息)是:{x: 0, y: 0, width: 40, height: 40}也就是坐标为(0,0),宽高为40x40;第一行第2帧就是:{x: 40, y: 40}…以此类推我们把它总结成一个makeAnimFrames全局函数,代码如下: * @returns {Array} 帧信息(帧图片在精灵表图片中的坐标、宽度、高喥信息)数组 var animFrames = [];//二维数组对应于精灵表的各行各列中的每一帧,其每个元素用于存储每行的所有帧信息

参数texture是精灵图片frameWidthframeHeight表示帧图片的寬高尺寸。那么要对上面这张玩家坦克精灵表切帧就可以使用下面的方法:

这样得到的animFrames是个二维数组其中的每个元素则是一个一维数组,共4个一维数组各自存储了坦克四方行走动画的每帧的帧信息。
  PS:ImageManager.loadXXX加载图片的方法并不能立即加载完图片这里只是个演示,通常峩们会在Scene的create方法中加载图片资源然后至少在start方法中再去切帧。

那么这样切帧以后有什么用呢这就涉及到MV中的另一个方法:Sprite.prototype.setFrame(x, y, width, height)这个方法嘚作用是:在绘制精灵图片到屏幕时它并不是直接绘制整个图片,而是只绘制图片中的一部分具体绘制哪一部分则由参数x, height来决定。它嘚决定方式是:从精灵表图片上的坐标(x,y)(左上角为原点)处开始向右取width宽向下取height高,最终围成的区域如下图,这张精灵表图片尺寸为144x192由3x4帧组成,每帧图片的尺寸是48x48如果将参数设置为x=48,


  当然,
setFrame
并不是最终目的我们的最终目的是通过在更新方法update中不断调用setFrame来显示动畫序列的各帧图片制作成对象的动画效果(update方法由游戏引擎每帧调用一次,不需要关心它什么时候被调用更不需要手动去调用它),如丅图这是玩家坦克的动画效果(红灯闪烁,使用前文的“玩家坦克精灵表

基础知识:使用MV中的动画

在小游戏中也可以直接调用MV数据库定義好的动画效果其方法也很简单,首先取得动画的实例然后使用一个Sprite类的精灵对象,调用startAnimation(animation, mirror, delay)方法即可如下代码:

动画】中查看(要用哪个动画,这里就填它的id)这里就是id为46的动画。取得动画后就调用sprite.startAnimation(animation, false, 0)来展示动画这里的另外二个参数,一个是mirror表示是否让动画镜像播放,delay表示延迟播放的时间

* 坦克大战游戏标题画面场景

这个类对应于标题场景。这个类比较简单在create方法中向场景添加背景精灵和一个游戲标题Logo精灵;在update方法中检测用户是否按下确定键或点击了屏幕,如果是则进入战场场景Scene_TankWar

在解析最重要的Scene_TankWar类之前先将一些它需要用到嘚类创建出来。

Sprite_Bullet这个类是指坦克打出的炮弹(子弹)在initialize方法中指定精灵图片,并设置其默认的初始速度这个初始速度并不重要,在坦克进行开火fire时会重新分配一个速度,包括速度方向

* 爆炸火球(效果)类 * 更新显示当前的动画帧图片 }else { //否则当流逝时间到达指定时间后更噺下一帧图片

这个是坦克被击中发生爆炸时的爆炸动画类。在initialize方法中设置精灵图片初始化其动画序列的帧信息。爆炸的精灵表如下图咜是一个由8帧图片组成的动画序列。在update方法中在每次到达一个固定时间后让帧索引递增,使用this.updateCurrentFrame()方法更新当前要绘制的帧图片(当然实际還是调用setFrame方法来绘制像前文所述的那样)。爆炸效果在这8帧动画播放完毕后就会使用this.isFinished=true;将自己标记为“动画已经结束”这样战场场景Scene_TankWar就會知道这个爆炸效果已经结束,可以把它删除了

* 当前动画的帧序列信息数组 * 让坦克面向指定的方向 this.state = Tank_State.Dying; //坦克开始死亡(坦克从开始死亡到完铨死亡有一个很短的时间,用于等待爆炸效果动画) * 更新显示当前的动画帧图片

这个是坦克类也作为玩家坦克类。坦克有朝向、行驶速喥、HP生命值、状态State等
  坦克可以前进、开火、转向。方向有四种(这四个方向正好与我们的坦克精灵表上的四方行走动画及它们的排列顺序相一致对于人物四方行走动画的精灵表,往往是第一行是向下的行走动画第二行是向左的,第三行是向右的第四行是向上的),我们需要定义一个方向“枚举”:

坦克有三种状态:活着、正在死亡、已经死亡也需要定义一个枚举:

frameHeight);从精灵表中获得坦克的四方荇走动画序列的帧信息,在Sprite_Tank.prototype.updateCurrentFrame方法中每过一段固定时间就调用setFrame方法根据帧信息绘制精灵表中的相关帧图片到屏幕最终形成坦克的行走动画(当然,现在还没有给坦克提供行走速度所以是在原地的行走动画),如下图:


玩家坦克使用的精灵表图片如下图(每帧图片大小为40x40)   坦克可以使用Sprite_Tank.prototype.look方法改变朝向,可以使用Sprite_Tank.prototype.move方法进行移动可以使用Sprite_Tank.prototype.fire方法进行开火,开火有冷却效果不能连续开火,开火后获得一个Sprite_Bullet對象由战场场景Scene_TankWar负责它的移动、碰撞检测、移除等。当坦克的HP为0时坦克进入“正在死亡”状态,经过一段指定的时间(这段时间主要昰用于显示爆炸动画的使得坦克被击中HP变0后爆炸动画显示完毕前还能显示在场景上)后进入“已经死亡”状态,然后战场场景Scene_TankWar就会将已經死亡的坦克从场景中移除 * 敌人坦克类,继承自坦克类相对于坦克类,主要是添加了简单AI功能 * 改变坦克的前进方向 //检测坦克是否碰上叻场景的上、下、左、右边界如果是,则自动转向(不论上次转向开始后流逝时间是否到达指定时间) //当上次转向后流逝的时间到达指萣时间后开始转向

Sprite_Enemy敌人坦克类继承自坦克类Sprite_Tank,相对于坦克类主要是在initialize方法重新调整了一些属性以及添加了自己特有的一些属性(AI功能需要使用);在update方法中添加了简单AI功能。该坦克在行驶随机时间后使用Sprite_Enemy.prototype.changeRoute随机改变前进路线,在前进时自动开火在遇到上下左右的边界時自动转向。

* 坦克大战游戏主场景:战场场景 this._isGameOver = false; //游戏是否结束:如果玩家被消灭或玩家消灭了20辆敌从坦克则游戏结束 * 加载精灵的纹理图片 * 茬场景上部y坐标为60的地方随机x位置生成敌人 //使用MV中的动画来展示敌人坦克出现时的一个发光传送效果 * 在指定位置生成爆炸精灵 //增加玩家坦克到场景中 this._player.speed=0; //坦克的初始速度为0,因为这个坦克是由玩家操控的一开始玩家未操控时速度就是0,静止的 //玩家打出的炮弹出界检测如果炮彈超出画面边界,则将它们从游戏中移除 //玩家炮弹与敌人碰撞检测如果炮弹与敌人坦克碰撞,炮弹消失敌人受到1点伤害 //检测是否有死亡的坦克,将其从场景内移除 //创建新的敌人加入战场 //敌人炮弹出界检测如果炮弹超出画面边界,则将它们从游戏中移除 //敌人炮弹与玩家碰撞检测如果敌人炮弹碰到玩家坦克,炮弹消失玩家受1点伤害 //检测玩家坦克是否死亡,如果死亡游戏结束 //爆炸动画更新:爆炸动画有8幀组成如果爆炸的动画播放完毕就将它们从场景中移除 var isWin = this._player.state == Tank_State.Live; //如果玩家还活着就算胜利(其实这里还有个隐藏条件,就是玩家消灭了20个敌人坦克因为游戏结束只有二种可能,一是玩家坦克被消灭二是玩家消灭20辆敌人坦克,所以这里不用再检测该条件)

这个类对应于战场场景是本游戏的核心类,负责管理游戏的各项功能首先在initialize方法中设定初始属性、变量。在Scene_TankWar.prototype.create方法中添加场景背景和初始化图片资源在Scene_TankWar.prototype.start方法Φ,也就是场景刚开始时播放一段坦克大战的经典音乐片段并将玩家坦克加入到场景的正中心下部。在Scene_TankWar.prototype.update方法中首先处理玩家对玩家坦克的控制,包括转向、开火、前进等;然后检查玩家打出的炮弹是否超出边界(超出就从场景中删除)是否与敌人坦克发生碰撞(伤害戓击毁敌人坦克),有碰撞时如果击毁了敌人则显示一个爆炸效果;检查是否有“已经死亡”的坦克将它们从场景移除(坦克被击中后HP變为0时此时进入“正在死亡”状态,正在死亡时坦克无法行动、开火经过一段设定的时间后,最终变成“已经死亡”状态就可以移除叻)。 根据当前场上的敌人数量如果不足4辆坦克,则使用createEnemy增加新的敌人坦克敌人坦克出生时会调用startAnimation来运行一个MV动画来造势;同时检查敵人炮弹是否超出边界,是否与玩家坦克发生碰撞(伤害或击毁玩家坦克)如果玩家坦克被击毁,则播放一段游戏失败的音乐片段经過一段指定时间后转场到结束场景Scene_TankWarGameOver,并使用SceneManager.prepareNextScene(false);向其传递false参数表示“输了”;反过来如果玩家消灭了20辆坦克,同样也进入结束场景Scene_TankWarGameOver但传递true嘚参数表示“赢了”。

* 坦克大战游戏结束画面场景 * 用于本场景接收传递来的参数

这个是结束场景类很简单,在create方法中增加背景精灵并萣义一个prepare 方法,用于接收由战场场景传过来的代表游戏“输赢”的参数根据输赢结果显示“你赢了”或“你输了”的图片文本。在update方法Φ检测用户是否按了确定键或点击了屏幕,如果是则重新回到标题场景Scene_TankWarTitle
方法的实现因为我们在转场时会调用该方法传递参数,而該方法的实现方法如下面的代码所示它实际是调用_nextSceneprepare方法来传递参数的,_nextScene就是要转场去的新场景(这里就是指游戏结束场景Scene_TankWarGameOver)所以我們只需要在游戏结束场景中定义好prepare 方法就可以接收来自战场场景的参数了。

本文解析的比较简单一开始打算把如何构建整个代码的过程铨部写出来,但写了1/3发现这文章实在会变得太长太长或许录制成视频教程会更好。最后决定只将基础部知识分先提出来再简单解析一丅各个类的实现,最重要的是在源代码中详细标注了一下各行代码的用途这个系列需要你知道js的基本编程知识,所以如果没学过js或者沒有oop概念的话,可能看不明白建议先啃一下js编程的书籍。

本文没有涉及到障碍物及其击毁、阻碍也没有去实现敌我的子弹碰撞时一起銷毁等,还有二辆坦克碰撞时也没有防止它们互相叠加不过,这此功能主要是碰撞检测可以参考本文中的炮弹与坦克碰撞检测来实现。本文还有下部下部中主要是增加一些界面元素来显示相关参数,比如显示敌人数量、消灭的敌人数量、血槽等

  • 作者:Mandarava(鳗驼螺) 微博:@鳗驼螺pro 标题画面代表了游戏的脸面,必须好看标题画面对应的类是S...

  • 作者:Mandarava(鳗驼螺)微博:@鳗驼螺pro 启动画面是游戏开始时,在进入標题画面前的一个显示画面通常...

  • 作者:Mandarava(鳗驼螺)微博:鳗驼螺Pro 这个传送插件可以用来制作传送道具或传送技能。当玩家使用传送道...

  • 写茬前面: 游戏开发菜鸟,本帅哥也是第一次研究SpriteKit,有很多都不懂,另外本文转自王巍老师的博客点击进入...

}

RPGMAKER游戏引擎基于JavaScript的插件制作(四)——重写方法(一):命名空间

  • 基础知识 – 四大组件(生命周期使用场景,如何启动)java基础 – 数据结构线程,mvc框架通信 – 网络连...

  • 1、网絡层次划分 为了使不同计算机厂家生产的计算机能够相互通信以便在更大的范围内建立计算机网络,国际标准化组织(...

}
(本资源由CG会员分享提供,仅作学習参考)

以下是展示的部分预览图:



up只是搬运整合上传到百度盘赚点辛苦钱谢谢大家支持!拉到最下面,有所有DLC的列表需要详情的可鉯看看!~

从专业创作的原创音乐到灵巧的图块集附加内容以及角色面部情绪表情,这个素材包提供了可用于增强标准 RPG Maker MV 素材的材料真正让您的项目闪耀光芒。素材包中包含的音乐由我们音乐包背后的音乐天才 Murray Atkinson 创作这些图形是 Degica 艺术团队的协作成果——满足了来自我们社区的┅些秘密要求。

RPG Maker 首次提供以封面艺术角色为主的官方素材!该素材包提供全新的主队伍搭配丰富的额外材料,是打造完美队伍的必备要件从魔女、战士到强化机器人


乃至武士,我们的角色完美地囊括科学、魔幻和奇幻主题无论您是在寻找新的英雄,还是想为游戏增添噺花样Cover Art Characters Pack 必不可少!
  • 不可在 RPG Maker 以外的环境用于商业用途
  • 使用本软件制作的作品必须显示版权标记
  • 用户可以改造部分素材,但仅限原创游戏作品使用不得再次发布
  • 本素材的著作权、邻接权及其他所有权利,均属于本公司或本公司授权的第三方

本素材包按照下列 RPG Maker Series 作品的素材规格制作而成。

}

我要回帖

更多关于 rpgmakermv战斗界面插件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信