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

Project1

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

[交流讨论] TypeScript静态编译在MV中的应用

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1912
在线时间
1554 小时
注册时间
2013-4-13
帖子
917
跳转到指定楼层
1
发表于 2020-6-7 16:59:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
都0202年了, 不能再用es3的老JS了, 要么Babel, 要么直接上TS

必要运行环境: Node.JS
全局安装ts:
        npm i -g typescript
工程路径下初始化typescript 配置:
        tsc --init
按需求修改一下tsconfig.json, 输出目录, 源目录, 输出目标(我选择ES5)等等
监控模式启动:
        tsc -w
然后就可以快乐得写TS了, 不过一些声明得自己写, 反正用到啥写啥也很方便

另付一个ts写的拖拽窗口插件(RM声明文件已经省略)
TYPESCRIPT 代码复制
  1. declare type Maybe<T> = T | null;
  2. declare type Builder<T> = (...args: any[]) => T;
  3.  
  4. declare class Window_Draggable {
  5.   dragableRect: Rectangle;
  6.   updateDrag(): void;
  7. }
  8.  
  9. const setNullDefault = <T extends any>(value: Maybe<T>, defaultValue: T) => (value === null ? defaultValue : value);
  10.  
  11. const extendsDraggableWindowClass = (WindowClass: typeof Window_Base): typeof Window_Base =>
  12.   class Window_Draggable extends WindowClass implements Window_Draggable {
  13.     static draggingWin: Maybe<Window_Draggable> = null;
  14.     private _dragX: Maybe<number> = null;
  15.     private _dragY: Maybe<number> = null;
  16.     private _dragging: boolean = false;
  17.  
  18.     get dragableRect() {
  19.       return new Rectangle(this.x, this.y, this.width, this.height);
  20.     }
  21.  
  22.     constructor(...args: any[]) {
  23.       super(...args);
  24.     }
  25.  
  26.     update() {
  27.       super.update();
  28.       this.updateDrag();
  29.     }
  30.  
  31.     updateDrag() {
  32.       const isInside = this.dragableRect.contains(TouchInput.x, TouchInput.y);
  33.       const isTriggered = TouchInput.isTriggered();
  34.       const isReleased = TouchInput.isReleased();
  35.       const isPressed = TouchInput.isPressed();
  36.       const draggingWin = Window_Draggable.draggingWin;
  37.       if (isTriggered && isInside) {
  38.         this._dragX = this.canvasToLocalX(TouchInput.x);
  39.         this._dragY = this.canvasToLocalY(TouchInput.y);
  40.         this._dragging = true;
  41.         const list = SceneManager._scene._windowLayer.children;
  42.         list.sort((a, b) => Number(a === this) - Number(b === this));
  43.         Window_Draggable.draggingWin = this;
  44.       } else if (isPressed && this._dragging && draggingWin === this) {
  45.         this.x = TouchInput.x - setNullDefault(this._dragX, 0);
  46.         this.y = TouchInput.y - setNullDefault(this._dragY, 0);
  47.       } else if (isReleased) {
  48.         this._dragging = false;
  49.       }
  50.     }
  51.   };


最后输出的Javascript文件:
JAVASCRIPT 代码复制
  1. "use strict";
  2. var __extends = (this && this.__extends) || (function () {
  3.     var extendStatics = function (d, b) {
  4.         extendStatics = Object.setPrototypeOf ||
  5.             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  6.             function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  7.         return extendStatics(d, b);
  8.     };
  9.     return function (d, b) {
  10.         extendStatics(d, b);
  11.         function __() { this.constructor = d; }
  12.         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13.     };
  14. })();
  15. var setNullDefault = function (value, defaultValue) { return (value === null ? defaultValue : value); };
  16. var extendsDraggableWindowClass = function (WindowClass) { var _a; return _a = (function (_super) {
  17.         __extends(Window_Draggable, _super);
  18.         function Window_Draggable() {
  19.             var args = [];
  20.             for (var _i = 0; _i < arguments.length; _i++) {
  21.                 args[_i] = arguments[_i];
  22.             }
  23.             var _this = _super.apply(this, args) || this;
  24.             _this._dragX = null;
  25.             _this._dragY = null;
  26.             _this._dragging = false;
  27.             return _this;
  28.         }
  29.         Object.defineProperty(Window_Draggable.prototype, "dragableRect", {
  30.             get: function () {
  31.                 return new Rectangle(this.x, this.y, this.width, this.height);
  32.             },
  33.             enumerable: false,
  34.             configurable: true
  35.         });
  36.         Window_Draggable.prototype.update = function () {
  37.             _super.prototype.update.call(this);
  38.             this.updateDrag();
  39.         };
  40.         Window_Draggable.prototype.updateDrag = function () {
  41.             var _this = this;
  42.             var isInside = this.dragableRect.contains(TouchInput.x, TouchInput.y);
  43.             var isTriggered = TouchInput.isTriggered();
  44.             var isReleased = TouchInput.isReleased();
  45.             var isPressed = TouchInput.isPressed();
  46.             var draggingWin = Window_Draggable.draggingWin;
  47.             if (isTriggered && isInside) {
  48.                 this._dragX = this.canvasToLocalX(TouchInput.x);
  49.                 this._dragY = this.canvasToLocalY(TouchInput.y);
  50.                 this._dragging = true;
  51.                 var list = SceneManager._scene._windowLayer.children;
  52.                 list.sort(function (a, b) { return Number(a === _this) - Number(b === _this); });
  53.                 Window_Draggable.draggingWin = this;
  54.             }
  55.             else if (isPressed && this._dragging && draggingWin === this) {
  56.                 this.x = TouchInput.x - setNullDefault(this._dragX, 0);
  57.                 this.y = TouchInput.y - setNullDefault(this._dragY, 0);
  58.             }
  59.             else if (isReleased) {
  60.                 this._dragging = false;
  61.             }
  62.         };
  63.         return Window_Draggable;
  64.     }(WindowClass)),
  65.     _a.draggingWin = null,
  66.     _a; };


附上我的js目录(我引入了lodash库, 同时安装了@types/lodash):
JAVASCRIPT 代码复制
  1. js
  2. │  main.js
  3. │  plugins.js
  4. │  rpg_core.js
  5. │  rpg_managers.js
  6. │  rpg_objects.js
  7. │  rpg_scenes.js
  8. │  rpg_sprites.js
  9. │  rpg_windows.js
  10. ├─libs
  11. │      fpsmeter.js
  12. │      iphone-inline-video.browser.js
  13. │      lodash.min.js
  14. │      lz-string.js
  15. │      pixi-picture.js
  16. │      pixi-tilemap.js
  17. │      pixi.js
  18. ├─notes
  19. │      index.txt
  20. ├─plugins
  21. │      CleanWindow.js
  22. └─src
  23.         CleanWindow.ts
  24.         rpg_core.d.ts
  25.         rpg_managers.d.ts
  26.         rpg_windows.d.ts
夏普的道具店

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

Lv1.梦旅人

梦石
0
星屑
24
在线时间
3 小时
注册时间
2020-7-31
帖子
3
6
发表于 2020-8-1 19:02:45 | 只看该作者
zths 发表于 2020-6-9 17:19
所以就是 所谓的 封装 封装 再 封装。
语言语言套语言。
最后写个 hello world 都要 1GB ...(过分了 ...

ts 比js 强大十倍以上,你说的问题的确存在,但是相对于ts的好处,可以忽略不计。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
24
在线时间
3 小时
注册时间
2020-7-31
帖子
3
5
发表于 2020-8-1 11:56:52 手机端发表。 | 只看该作者
未来的趋势一定是ts,ts强大太多了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
4
发表于 2020-6-9 17:19:14 | 只看该作者
walf_man 发表于 2020-6-9 17:12
大佬不愧是大佬,不过还是感觉js代码看起来好看一些呀,这ts完全就看不懂了
不禁感叹,为何要发明 ...

所以就是 所谓的 封装 封装 再 封装。
语言语言套语言。
最后写个 hello world 都要 1GB ...(过分了

点评

没错呀  发表于 2020-6-11 11:23
带来的负面问题也被 硬件/系统/轮子 迭代弥补掉。 说实话 干活真的简单了,但是 也没意思了..  发表于 2020-6-10 21:50
开发速度快了 但实际内涵没有了(针对上层的产品开发人员). 普通公司也不想要去深究内部原理(或者做轮子)的人,要的就是出活,干得快..  发表于 2020-6-10 21:49
不针对这个 总体来看,项目就是在变大 依赖一坨坨的引 轮子套轮子套轮子.  发表于 2020-6-10 21:47
真的要较真那就只能手搓汇编了.看起来这发展本身就是拿性能换功能,一直在降低门槛和规范化. 把底层一切可以不关心的全部模糊/规范化不让人接触到   发表于 2020-6-10 21:45
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14637
在线时间
718 小时
注册时间
2011-7-16
帖子
1428

开拓者

3
发表于 2020-6-9 17:12:19 | 只看该作者
大佬不愧是大佬,不过还是感觉js代码看起来好看一些呀,这ts完全就看不懂了
不禁感叹,为何要发明那么多语言

点评

有道理呀  发表于 2020-6-10 13:31
让IDE用各种类型错误尽情鞭挞你吧, 开始痛一点, 慢慢会发现这感觉甜~  发表于 2020-6-9 19:35
RMMV网络插件,开源免费,内含服务器端,无需强制登录,云数据,弹幕,云存档,排名,兑换码,版本检测,可自由上架下架删除。q群399090587
免打包运行MV游戏,云游戏,安卓App雷神游戏厅,在线玩游戏,上传下载游戏
开源游戏:重装机兵之重装归来【RMMV制作】全球首款按照美剧分季分集的方式发布的游戏
体素画 -- MV画3D像素图的画板
RMMV显示3D模型和场景的插件
RMMV显示spine骨骼动画的插件
RMMV秘密通道插件
突破敌群数量上限8个的插件
在rmmv中显示gif动态图片的插件
一款可以在mv游戏界面的任意位置显示任意文字的插件
RMMV Toast 插件 带物品得失提示,可以设置开启关闭 兼容yep itemcore
制作一个改名卡道具插件、调整标题页面菜单的插件、在标题页面之前显示大段文字的插件、标题页面显示版本号的插件
物品得失自动提示自动上色自动换行插件
我的Q群 663889472
另外,我的插件、范例、游戏都在这里
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
6687
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

2
发表于 2020-6-7 17:22:03 | 只看该作者
虽然看不懂但是前排沙发
(可能因为写习惯前端觉得还是原生的JS方便233333

点评

太深奧了....666666...  发表于 2020-6-7 22:29
祝好。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-2 15:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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