赞 | 55 |
VIP | 0 |
好人卡 | 0 |
积分 | 34 |
经验 | 9754 |
最后登录 | 2024-3-7 |
在线时间 | 461 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 3414
- 在线时间
- 461 小时
- 注册时间
- 2013-12-7
- 帖子
- 333
|
附上一些我改的脚本参考。
单次点击
- //取消光标
- Window_Selectable.prototype.isCursorVisible = function() {
- return false;
- };
- //单次点击以及改变翻页方式
- Window_Selectable.prototype.onTouch = function(triggered) {
- var lastIndex = this.index();
- var x = this.canvasToLocalX(TouchInput.x);
- var y = this.canvasToLocalY(TouchInput.y);
- var hitIndex = this.hitTest(x, y);
- if (hitIndex >= 0) {
- if (hitIndex === this.index()) {
- if (triggered && this.isTouchOkEnabled()) {
- this.processOk();
- }
- } else if (this.isCursorMovable()) {
- this.select(hitIndex);
- this.processOk();
- }
- } else if (this._stayCount >= 10) {
- if (y < this.padding) {
- this.cursorPageup();
- } else if (y >= this.height - this.padding) {
- this.cursorPagedown();
- }
- }
- if (this.index() !== lastIndex) {
- SoundManager.playCursor();
- }
- };
复制代码
这只是一个通用的解决方式,其原理只是让脚本帮助玩家再点击一次选项。
而更高效与合理的做法是直接取用户点击坐标来查找对应事件。比如我要在 x:290 - 320 y:0 - 30的位置加一个返回按钮。当然,完全的使用新逻辑你需要重写几乎全部的Window_Selectable原型。
- Window_Background.prototype.update = function() {
- Window_Base.prototype.update.call(this);
- this.updatePop();
- };
- Window_Background.prototype.updatePop = function() {
- if (TouchInput.isTriggered()){
- var x = this.canvasToLocalX(TouchInput.x);
- var y = this.canvasToLocalY(TouchInput.y);
- if (x >= 290 && y >= 0 && x < 320 && y < 30){
- SceneManager.pop();
- }
- }
- };
复制代码
在Scene_Map绘制菜单按钮- Yanfly.Momo.Scene_Boot_loadSystemImages = Scene_Boot.loadSystemImages;
- Scene_Boot.loadSystemImages = function() {
- Yanfly.Momo.Scene_Boot_loadSystemImages.call(this);
- ImageManager.reserveSystem('UI');
- };
复制代码 首先UI图片需要被预加载。当然你也可以用这个方法来加载你自定义的一些图片。
- Yanfly.Momo.Scene_Map_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
- Scene_Map.prototype.createDisplayObjects = function() {
- Yanfly.Momo.Scene_Map_createDisplayObjects.call(this);
- this.createMenuBtn();
- };
- Scene_Map.prototype.createMenuBtn = function() {
- this._menuBtn = new Sprite_Button();
- this._menuBtn.bitmap = ImageManager.loadSystem('UI');
- this._menuBtn.setFrame(0, 48, 48, 48);
- this._menuBtn.x = 272;
- this._menuBtn.y = Graphics.boxHeight - 52;
- this._menuBtn.setClickHandler(this.callMenu.bind(this));
- this.addChild(this._menuBtn);
- };
复制代码 这里为地图创建了一个Sprite_Button,顾名思义,按钮精灵。并且监听点击事件,执行callMenu()。
- Yanfly.Momo.Scene_Map_isMapTouchOk = Scene_Map.prototype.isMapTouchOk;
- Scene_Map.prototype.isMapTouchOk = function() {
- if(this._menuBtn.isButtonTouched() && TouchInput._pressedTime < 10) return false;
- return Yanfly.Momo.Scene_Map_isMapTouchOk.call(this);
- };
- Yanfly.Momo.Scene_Map_update = Scene_Map.prototype.update;
- Scene_Map.prototype.update = function() {
- Yanfly.Momo.Scene_Map_update.call(this);
- this.updateUi();
- };
- Scene_Map.prototype.updateUi = function() {
- if ($gamePlayer.canMove() && (!this._fadeSprite || this._fadeSprite.opacity < 20) && $gameScreen._brightness > 235){
- this.addChild(this._menuBtn);
- } else {
- this.removeChild(this._menuBtn);
- }
- };
复制代码 这是一些兼容性代码,我并不希望点击菜单按钮时角色移动,而长按屏幕移动时不会点到菜单按钮。同时在对话等事件运行时,我希望隐藏该按钮。
绘制选择框及锁定图标
- Window_Selectable.prototype.drawCursor = function (x, y) {
- var bitmap = ImageManager.loadSystem('UI');
- this.contents.blt(bitmap, 272, 48, 48, 48, x, y);
- }
- Window_Selectable.prototype.drawLock = function (x, y) {
- var bitmap = ImageManager.loadSystem('UI');
- this.contents.blt(bitmap, 224, 48, 48, 48, x, y);
- }
复制代码 虽然隐藏了默认的光标,但有的时候确实需要让玩家知道他点选的是哪一个选项,或者哪一个选项是不可选的。通过两个图片可以很好的解决这个问题。
- if (index === this.index()) this.drawCursor(rect.x, rect.y);
复制代码 在各类选择列表的drawItem方法中加入以上一句来绘制选择框。
- if (!this.isEnabled(index)) this.drawLock(rect.x, rect.y);
复制代码 或者绘制锁定图标。
还有很多细节上的改动,比如装备物品的方法,战斗时角色命令窗口的布置,让帮助窗口显示/隐藏等。
这里就不一一举例了,无非就是在某个位置设计某个按钮点击以后执行某段代码。理解了以上代码要自己改不难。
窗口动画
- Window_MenuHelp.prototype.update = function() {
- Window_Base.prototype.update.call(this);
- if (this.active){
- if (this.x < 0) this.x += 32;
- if (TouchInput.isTriggered()){
- if (!this.isTouchedInsideFrame()) this.cancel();
- }
- if (TouchInput.isReleased() && this.isTouchedBtn() && this._btnEnabled) this.ok();
- }else{
- if (this.x > -320) this.x -= 32;
- }
- };
复制代码 在帮助窗口显示时加一个弹出动画会让你的游戏看起来生动。(可以从以上代码中看出,我把使用物品按钮也放在了帮助窗口里)
滑动翻页
- Window_MenuItem.prototype.processTouch = function() {
- if (this.isOpenAndActive()) {
- if (TouchInput.isTriggered() && this.isTouchedInsideFrame()){
- this._touchX = TouchInput._x;
- }
- if (TouchInput.isReleased() && this.isTouchedInsideFrame()) {
- if (TouchInput._x > this._touchX + 40) this.cursorPageup();
- else if (TouchInput._x < this._touchX - 40) this.cursorPagedown();
- else this.onTouch(true);
- }
- }else{
- this._touchX = NaN;
- }
- };
复制代码 这是一个保留了MV的一部分翻页逻辑的写法。当然你也可以做一个宽于屏幕的窗口,通过改变窗口的_scrollX值重绘窗口来做出真正意义上的滚动效果。
|
评分
-
查看全部评分
|