设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 602|回复: 0
打印 上一主题 下一主题

[原创发布] [分享]一种基于面条代码的窗口修改方案

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4562
在线时间
631 小时
注册时间
2021-3-24
帖子
488
跳转到指定楼层
1
发表于 2023-8-17 10:03:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
适用人群:懂JS 但不知道怎么下手MV插件的开发者
缓解症状:对纯触摸窗口进行修改
不适反应:面条代码,需要自己2次封装(对的对的 我就是要用垃圾代码来刺激你)

以下代码仅供参考,我提供一个思路。
请以自己的思维阅读理解并拓展。
///////////////////////////////////////////////////////////////////////////////////////////////////////
首先给Sprite的原型链上增加以下方法
来获得其相对于窗口的X和Y
JAVASCRIPT 代码复制
  1. Sprite.prototype.getTotalValue = function(propertyName) {
  2.     let total = this[propertyName];
  3.     for (let current = this; current && current.parent && current.parent[propertyName]; current = current.parent) {
  4.         total += current.parent[propertyName];
  5.     }
  6.     return total;
  7. }
  8. Sprite.prototype.getX = function() {return this.getTotalValue('x');}
  9. Sprite.prototype.getY = function() {return this.getTotalValue('y');}

///////////////////////////////////////////////////////////////////////////////////////////////////////
场景(Scene)->窗口(Window)->精灵(Sprite)->位图(Bitmap)
是我理解的构成视图(游戏画面)的基本元素
可以理解成 分子 原子 电子

游戏画面运行的当前的场景
比如
JAVASCRIPT 代码复制
  1. window.onload = function() {
  2.     SceneManager.run(Scene_Boot);
  3. };

这是MV的启动主入口 让场景SceneManager启动Scene_Boot场景
SceneManager.push(进入下一个场景)SceneManager.pop(返回上一个场景)
充斥这整个游戏运行过程。

那么 我们如何修改一个场景
拿设置窗口举例
在img里定义好 这个场景会用到的图片,进行预加载。
当图片加载后 load会自增 ,那么 只有确定图片都加载完成后,才执行原本 create中要执行的代码。
JAVASCRIPT 代码复制
  1. Scene_Options.prototype.initialize = function() {
  2.     Scene_MenuBase.prototype.initialize.call(this);
  3.     this.img=[
  4.         ["img/pictures/","SYSTEN_DB"],
  5.         ["img/pictures/","SYSTEN_LANGUAGE_left"],
  6.         ["img/pictures/","SYSTEN_LANGUAGE_right"],
  7.         ["img/pictures/","button_back_white"],
  8.     ]
  9.     this.load=0
  10.     this._bit=[]
  11.     for(let i=0;i<this.img.length;i++) this.loadBit(i,this.img[i])
  12. };
  13. Scene_Options.prototype.loadBit = function (key,val) {
  14.     this._bit[key] =ImageManager.loadBitmap(val[0],val[1],0,true)
  15.     this._bit[key].addLoadListener(function () {this.load++}.bind(this));
  16. };
  17. Scene_Options.prototype.create = function() {
  18.     Scene_MenuBase.prototype.create.call(this);
  19.     if(this.load===this.img.length) this.createOptionsWindow();
  20.     else setTimeout(()=>{this.create()},100)
  21. };

//////////////////////////////////////////////////////////////////////////////////////////////////////
createOptionsWindow 会执行以下方法
创建一个属于window的类  addWindow可以理解成把这个类加入到场景中
为了方便快速出效果 我把this._bit和this 直接传入,运行上没什么问题。
当然我推荐你自己构造更优雅的方式
JAVASCRIPT 代码复制
  1. this._optionsWindow = new Window_Options(this._bit,this);
  2. this.addWindow(this._optionsWindow);

//////////////////////////////////////////////////////////////////////////////////////////////////////
this.opacity=0可以理解成 直接去掉原本的MV样式
这里我把传入的bit[0] 作为background(Sprite)Bitmap
this.listData是其他要生成的Sprite 定义了使用哪个bit和与生成的位置,name是触发时的标记
JAVASCRIPT 代码复制
  1. Window_Options.prototype.initialize = function(bit,orgin) {
  2.     this._bit=bit
  3.     this._orgin=orgin
  4.     Window_Base.prototype.initialize.call(this, 0, 0);
  5.     this.opacity=0
  6.     this._background = new Sprite(bit[0]);
  7.     this.addChildAt(this._background, 1);
  8.     this.x=(Graphics.boxWidth-this.windowWidth())/2
  9.     this.y=(Graphics.boxHeight-this.windowHeight())/2
  10.  
  11.     this.listData=[
  12.         {bit:3,x:20,y:465,name:"back"},
  13.         {bit:1,x:180,y:130,name:"bgmR"},
  14.         {bit:1,x:180,y:215,name:"seR"},
  15.         {bit:1,x:180,y:300,name:"bgsR"},
  16.         {bit:1,x:180,y:385,name:"meR"},
  17.  
  18.         {bit:2,x:340,y:130,name:"bgmL"},
  19.         {bit:2,x:340,y:215,name:"seL"},
  20.         {bit:2,x:340,y:300,name:"bgsL"},
  21.         {bit:2,x:340,y:385,name:"meL"}
  22.     ]
  23.     this.list=[]
  24.     for(let i=0;i<this.listData.length;i++){
  25.         let b=new Sprite(this._bit[this.listData[i].bit])
  26.         b.x=this.listData[i].x
  27.         b.y=this.listData[i].y
  28.         b.name=this.listData[i].name
  29.         this.list[i]=b
  30.         this.addChild(b);
  31.  
  32.     }
  33. };

//////////////////////////////////////////////////////////////////////////////////////////////////////
触发方式判定
JAVASCRIPT 代码复制
  1. Window_Options.prototype.update= function() {
  2.     Window_Base.prototype.update.call(this);
  3.     this.processTouch()
  4. };
  5. Window_Options.prototype.processTouch = function() {
  6.     if (TouchInput.isTriggered()) {
  7.         for (let item of this.list) {
  8.             let x=item.getX()
  9.             let y=item.getY()
  10.             if (TouchInput.x >= x &&
  11.                 TouchInput.x <= x + item.width &&
  12.                 TouchInput.y >= y &&
  13.                 TouchInput.y <= y + item.height) {
  14.                  this.Handler(item.name)
  15.             }
  16.         }
  17.     }
  18.  
  19. Window_Options.prototype.Handler=function (name){
  20.     let value
  21.     switch (name) {
  22.         case "back":
  23.             this._orgin.popScene()
  24.             SoundManager.playCancel();
  25.             break
  26.     }
  27. }
  28. }

评分

参与人数 1+1 收起 理由
马铃薯条 + 1

查看全部评分

摸了
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-28 23:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表