查看: 3967|回复: 4

[已经解决] 想做一个家具摆放的插件, 求指点一些细节.

[复制链接]
梦石
0
星屑
1907
在线时间
1555 小时
注册时间
2013-4-13
回帖
783
发表于 2016-5-20 14:37:10 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 沉滞的剑 于 2016-5-26 00:16 编辑

想做一个系统练练手, 顺便熟悉一下新工具(花了100刀入的正至今还没怎么碰过, 不能就这么便宜了G胖)
构思是在一幅地图中可以进入建造模式, 在可建造区域可以摆放家具(可交互).
不想要现成的脚本, 想从头做起, 希望大家指点一下其中关窍.
作为一个纯新一下子目标这么大也许不现实, 但是还是希望各位不吝赐教.
我现在是0基础, 勉强突袭了1天JS, 不过官方的脚本大多都看得懂.

目前正在做的效果是按下一个指定键(比如:B)就能进入建筑状态.
这个状态下镜头不跟随角色, 而可以自由地在地图上移动.
按退出键可以返回原先的状态

也就是说我想知道如何在一个场景里响应键盘事件
如何禁止或允许键盘使角色移动
如何在地图内修改镜头


已经完成, 可以当成一个迷宫观察插件来用:
能实现在地图上按B键进入"观察模式", 然后使用方向键观察四周, 再次按下B键返回先前状态.
[pre lang="javascript"]!function(){
Input.keyMapper[66] = "Build";
_Scene_Map_update = Scene_Map.prototype.update;
_Scene_Map_initialize = Scene_Map.prototype.initialize;
Scene_Map.prototype.initialize = function() {
        _Scene_Map_initialize.call(this);
        this._buildModeOn = false;
        this._buildModeDirect = 0;
        this._buildModeMoving = 0;
};
Scene_Map.prototype.update = function() {
        _Scene_Map_update.call(this);
        this.updateBuildModeKeyListening();
        this.updateBuildModeScrolling();
}
Scene_Map.prototype.updateMain = function() {
    var active = this.isActive();
    $gameMap.update(active);
    $gameTimer.update(active);
    $gameScreen.update();
        if(!this._buildModeOn){
                $gamePlayer.update(active);
        }
};
Scene_Map.prototype.updateBuildModeKeyListening = function(){
        if(Input.isTriggered("Build")){
                this._buildModeOn = !this._buildModeOn;
                $gameTemp.clearDestination();
                if(!this._buildModeOn){               
                        $gameMap._displayX = $gamePlayer._x - Math.round($gameMap.screenTileX() / 2);
                        $gameMap._displayY = $gamePlayer._y - Math.round($gameMap.screenTileY() / 2);
                        $gameMap.scrollUp(0);
                        $gameMap.scrollDown(0);
                        $gameMap.scrollLeft(0);
                        $gameMap.scrollRight(0);
                        $gameSystem.enableMenu();
                }else{
                        $gameSystem.disableMenu();
                }
        }
        if(Input.isPressed("up") && this._buildModeOn && this._buildModeDirect == 0){
                this._buildModeDirect = 1;
        }
        if(Input.isPressed("down") && this._buildModeOn && this._buildModeDirect == 0){
                this._buildModeDirect = 2;
        }
        if(Input.isPressed("left") && this._buildModeOn && this._buildModeDirect == 0){
                this._buildModeDirect = 3;
        }
        if(Input.isPressed("right") && this._buildModeOn && this._buildModeDirect == 0){
                this._buildModeDirect = 4;
        }
}
Scene_Map.prototype.updateBuildModeScrolling = function(){
        switch(this._buildModeDirect){
                case 0: break;
                case 1:
                        this._buildModeMoving++;
                        $gameMap.scrollUp(0.1);
                        break;
                case 2:
                        this._buildModeMoving++;
                        $gameMap.scrollDown(0.1);
                        break;
                case 3:
                        this._buildModeMoving++;
                        $gameMap.scrollLeft(0.1);
                        break;
                case 4:
                        this._buildModeMoving++;
                        $gameMap.scrollRight(0.1);
                        break;
        }
        if(this._buildModeMoving >= 10){
                this._buildModeDirect = 0;
                this._buildModeMoving = 0;
        }
}
}();[/pre]
夏普的道具店

塞露提亚-道具屋的经营妙方同人作品
发布帖:点击这里
梦石
0
星屑
50
在线时间
370 小时
注册时间
2016-1-7
回帖
81
发表于 2016-5-23 17:04:00 | 显示全部楼层
1、MV中按下B键,需要先在MV中添加 B 键对应的键值。
打开rpg_core.js 找到 Input.keyMapper ,在其下插入:

66: 'B' ,

其它键代码可以自行百度"虚拟键代码对照表"。
也可继续往下找到 Input._onKeyDown ,
自己调试 event.keyCode ,获取与键盘对应的键值。

2、MV在启动游戏后,就能响应键盘事件了,
关键是楼主希望从哪个场景(Scene)接入相应的按键。
常见的 Scene 一般是:
Scene_Title 标题画面,也就是“开始、继续、选项”的那个画面;
Scene_Map 当前场景,也就是游戏窗口;
Scene_Menu 菜单画面,就是游戏中按ESC键弹出的那个画面。
Scene_Battle 战斗画面...等等。

3、操控角色移动、跳跃等等的那个场景是 Scene_Map 。
所以,禁止或允许角色怎么样,MV实际上就只是切换调动Scene_Map的过程。
比如,在游戏中按下ESC键,出现了菜单画面,然后角色及NPC都不动了。
实际上是MV将Scene_Map换走了,而接入了Scene_Menu。
她们都是独立的场景,各自的update处理的事情不同;
Scene_Map被调走了,Scene_Map的update也同时停止了执行,
所以角色便不受控制了。
只是在Scene_Map调出前MV做了截图及对截图的模糊处理,
然后将截图作为Scene_Menu的底图对菜单画面进行铺垫。
然后我们便看到了一个在菜单画面下,疑似游戏画面被冻结的假象。
详情可参阅 Scene_Map.prototype.terminate的描述。
所以,楼主要在MV中禁止、允许角色,
可参考MV是怎样调入调出菜单的,以及菜单的生成方法。
(最后将菜单画面重新设计成楼主想要的那种画面就是了。)

4、MV中更换场景镜头的视觉 。
MV是通过修改自己的 $gameMap._displayX 和 $gameMap._displayY
这两条轴的值,实现的镜头转换。
( MV基本是在Scene_Map 实现的,
是否同时支持其他的 Scene 的镜头转换?
笔者未测试过 )

评分

参与人数 1梦石 +2 收起 理由
余烬之中 + 2 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
1907
在线时间
1555 小时
注册时间
2013-4-13
回帖
783
 楼主| 发表于 2016-5-25 18:10:14 | 显示全部楼层
在野月光 发表于 2016-5-23 17:04
1、MV中按下B键,需要先在MV中添加 B 键对应的键值。
打开rpg_core.js 找到 Input.keyMapper ,在其下插入 ...

感谢, 又研究了很长时间, 终于写出了点东西.
但是我不知道从"建筑模式"返回后镜头回到角色身上.
我现在的代码如下:
[pre lang="javascript"]!function(){
Input.keyMapper[66] = "Build";
_Scene_Map_update = Scene_Map.prototype.update;
_Scene_Map_initialize = Scene_Map.prototype.initialize;
Scene_Map.prototype.initialize = function() {
        _Scene_Map_initialize.call(this);
        this._buildModeOn = false;
};
Scene_Map.prototype.update = function() {
        _Scene_Map_update.call(this);
        if(Input.isTriggered("Build")){
                alert("Build pressed");
                this._buildModeOn = !this._buildModeOn;
        }
        if(Input.isTriggered("up") && this._buildModeOn){
                $gameMap._displayY -= 1;
        }
};
Scene_Map.prototype.updateMain = function() {
    var active = this.isActive();
    $gameMap.update(active);
    $gameTimer.update(active);
    $gameScreen.update();
        if(!this._buildModeOn){
                $gamePlayer.update(active);
        }
};
}();[/pre]
夏普的道具店

塞露提亚-道具屋的经营妙方同人作品
发布帖:点击这里
回复

使用道具 举报

梦石
0
星屑
50
在线时间
38 小时
注册时间
2013-9-11
回帖
12
发表于 2016-5-25 23:42:38 来自手机 | 显示全部楼层
放家具是用鼠标点的那种创造模式吗
回复

使用道具 举报

梦石
0
星屑
50
在线时间
370 小时
注册时间
2016-1-7
回帖
81
发表于 2016-5-26 02:53:46 | 显示全部楼层


$gamePlayer.center($gamePlayer.x , $gamePlayer.y );

MVGif.gif

点评

感谢  发表于 2016-5-26 15:04
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部