Project1

标题: 想做一个家具摆放的插件, 求指点一些细节. [打印本页]

作者: 沉滞的剑    时间: 2016-5-20 14:37
标题: 想做一个家具摆放的插件, 求指点一些细节.
本帖最后由 沉滞的剑 于 2016-5-26 00:16 编辑

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

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

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


已经完成, 可以当成一个迷宫观察插件来用:
能实现在地图上按B键进入"观察模式", 然后使用方向键观察四周, 再次按下B键返回先前状态.
JAVASCRIPT 代码复制
  1. !function(){
  2. Input.keyMapper[66] = "Build";
  3. _Scene_Map_update = Scene_Map.prototype.update;
  4. _Scene_Map_initialize = Scene_Map.prototype.initialize;
  5. Scene_Map.prototype.initialize = function() {
  6.         _Scene_Map_initialize.call(this);
  7.         this._buildModeOn = false;
  8.         this._buildModeDirect = 0;
  9.         this._buildModeMoving = 0;
  10. };
  11. Scene_Map.prototype.update = function() {
  12.         _Scene_Map_update.call(this);
  13.         this.updateBuildModeKeyListening();
  14.         this.updateBuildModeScrolling();
  15. }
  16. Scene_Map.prototype.updateMain = function() {
  17.     var active = this.isActive();
  18.     $gameMap.update(active);
  19.     $gameTimer.update(active);
  20.     $gameScreen.update();
  21.         if(!this._buildModeOn){
  22.                 $gamePlayer.update(active);
  23.         }
  24. };
  25. Scene_Map.prototype.updateBuildModeKeyListening = function(){
  26.         if(Input.isTriggered("Build")){
  27.                 this._buildModeOn = !this._buildModeOn;
  28.                 $gameTemp.clearDestination();
  29.                 if(!this._buildModeOn){               
  30.                         $gameMap._displayX = $gamePlayer._x - Math.round($gameMap.screenTileX() / 2);
  31.                         $gameMap._displayY = $gamePlayer._y - Math.round($gameMap.screenTileY() / 2);
  32.                         $gameMap.scrollUp(0);
  33.                         $gameMap.scrollDown(0);
  34.                         $gameMap.scrollLeft(0);
  35.                         $gameMap.scrollRight(0);
  36.                         $gameSystem.enableMenu();
  37.                 }else{
  38.                         $gameSystem.disableMenu();
  39.                 }
  40.         }
  41.         if(Input.isPressed("up") && this._buildModeOn && this._buildModeDirect == 0){
  42.                 this._buildModeDirect = 1;
  43.         }
  44.         if(Input.isPressed("down") && this._buildModeOn && this._buildModeDirect == 0){
  45.                 this._buildModeDirect = 2;
  46.         }
  47.         if(Input.isPressed("left") && this._buildModeOn && this._buildModeDirect == 0){
  48.                 this._buildModeDirect = 3;
  49.         }
  50.         if(Input.isPressed("right") && this._buildModeOn && this._buildModeDirect == 0){
  51.                 this._buildModeDirect = 4;
  52.         }
  53. }
  54. Scene_Map.prototype.updateBuildModeScrolling = function(){
  55.         switch(this._buildModeDirect){
  56.                 case 0: break;
  57.                 case 1:
  58.                         this._buildModeMoving++;
  59.                         $gameMap.scrollUp(0.1);
  60.                         break;
  61.                 case 2:
  62.                         this._buildModeMoving++;
  63.                         $gameMap.scrollDown(0.1);
  64.                         break;
  65.                 case 3:
  66.                         this._buildModeMoving++;
  67.                         $gameMap.scrollLeft(0.1);
  68.                         break;
  69.                 case 4:
  70.                         this._buildModeMoving++;
  71.                         $gameMap.scrollRight(0.1);
  72.                         break;
  73.         }
  74.         if(this._buildModeMoving >= 10){
  75.                 this._buildModeDirect = 0;
  76.                 this._buildModeMoving = 0;
  77.         }
  78. }
  79. }();

作者: 在野月光    时间: 2016-5-23 17:04
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 的镜头转换?
笔者未测试过 )

作者: 沉滞的剑    时间: 2016-5-25 18:10
在野月光 发表于 2016-5-23 17:04
1、MV中按下B键,需要先在MV中添加 B 键对应的键值。
打开rpg_core.js 找到 Input.keyMapper ,在其下插入 ...

感谢, 又研究了很长时间, 终于写出了点东西.
但是我不知道从"建筑模式"返回后镜头回到角色身上.
我现在的代码如下:
JAVASCRIPT 代码复制
  1. !function(){
  2. Input.keyMapper[66] = "Build";
  3. _Scene_Map_update = Scene_Map.prototype.update;
  4. _Scene_Map_initialize = Scene_Map.prototype.initialize;
  5. Scene_Map.prototype.initialize = function() {
  6.         _Scene_Map_initialize.call(this);
  7.         this._buildModeOn = false;
  8. };
  9. Scene_Map.prototype.update = function() {
  10.         _Scene_Map_update.call(this);
  11.         if(Input.isTriggered("Build")){
  12.                 alert("Build pressed");
  13.                 this._buildModeOn = !this._buildModeOn;
  14.         }
  15.         if(Input.isTriggered("up") && this._buildModeOn){
  16.                 $gameMap._displayY -= 1;
  17.         }
  18. };
  19. Scene_Map.prototype.updateMain = function() {
  20.     var active = this.isActive();
  21.     $gameMap.update(active);
  22.     $gameTimer.update(active);
  23.     $gameScreen.update();
  24.         if(!this._buildModeOn){
  25.                 $gamePlayer.update(active);
  26.         }
  27. };
  28. }();

作者: 小颗粒    时间: 2016-5-25 23:42
放家具是用鼠标点的那种创造模式吗

作者: 在野月光    时间: 2016-5-26 02:53


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








欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1