查看: 3639|回复: 15

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

[复制链接]
梦石
0
星屑
1907
在线时间
1555 小时
注册时间
2013-4-13
回帖
783
发表于 2020-6-7 16:59:19 | 显示全部楼层 |阅读模式

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

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

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

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

另付一个ts写的拖拽窗口插件(RM声明文件已经省略)
[pre lang="typescript"]declare type Maybe<T> = T | null;
declare type Builder<T> = (...args: any[]) => T;

declare class Window_Draggable {
  dragableRect: Rectangle;
  updateDrag(): void;
}

const setNullDefault = <T extends any>(value: Maybe<T>, defaultValue: T) => (value === null ? defaultValue : value);

const extendsDraggableWindowClass = (WindowClass: typeof Window_Base): typeof Window_Base =>
  class Window_Draggable extends WindowClass implements Window_Draggable {
    static draggingWin: Maybe<Window_Draggable> = null;
    private _dragX: Maybe<number> = null;
    private _dragY: Maybe<number> = null;
    private _dragging: boolean = false;

    get dragableRect() {
      return new Rectangle(this.x, this.y, this.width, this.height);
    }

    constructor(...args: any[]) {
      super(...args);
    }

    update() {
      super.update();
      this.updateDrag();
    }

    updateDrag() {
      const isInside = this.dragableRect.contains(TouchInput.x, TouchInput.y);
      const isTriggered = TouchInput.isTriggered();
      const isReleased = TouchInput.isReleased();
      const isPressed = TouchInput.isPressed();
      const draggingWin = Window_Draggable.draggingWin;
      if (isTriggered && isInside) {
        this._dragX = this.canvasToLocalX(TouchInput.x);
        this._dragY = this.canvasToLocalY(TouchInput.y);
        this._dragging = true;
        const list = SceneManager._scene._windowLayer.children;
        list.sort((a, b) => Number(a === this) - Number(b === this));
        Window_Draggable.draggingWin = this;
      } else if (isPressed && this._dragging && draggingWin === this) {
        this.x = TouchInput.x - setNullDefault(this._dragX, 0);
        this.y = TouchInput.y - setNullDefault(this._dragY, 0);
      } else if (isReleased) {
        this._dragging = false;
      }
    }
  };
[/pre]

最后输出的Javascript文件:
[pre lang="javascript"]"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var setNullDefault = function (value, defaultValue) { return (value === null ? defaultValue : value); };
var extendsDraggableWindowClass = function (WindowClass) { var _a; return _a = (function (_super) {
        __extends(Window_Draggable, _super);
        function Window_Draggable() {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var _this = _super.apply(this, args) || this;
            _this._dragX = null;
            _this._dragY = null;
            _this._dragging = false;
            return _this;
        }
        Object.defineProperty(Window_Draggable.prototype, "dragableRect", {
            get: function () {
                return new Rectangle(this.x, this.y, this.width, this.height);
            },
            enumerable: false,
            configurable: true
        });
        Window_Draggable.prototype.update = function () {
            _super.prototype.update.call(this);
            this.updateDrag();
        };
        Window_Draggable.prototype.updateDrag = function () {
            var _this = this;
            var isInside = this.dragableRect.contains(TouchInput.x, TouchInput.y);
            var isTriggered = TouchInput.isTriggered();
            var isReleased = TouchInput.isReleased();
            var isPressed = TouchInput.isPressed();
            var draggingWin = Window_Draggable.draggingWin;
            if (isTriggered && isInside) {
                this._dragX = this.canvasToLocalX(TouchInput.x);
                this._dragY = this.canvasToLocalY(TouchInput.y);
                this._dragging = true;
                var list = SceneManager._scene._windowLayer.children;
                list.sort(function (a, b) { return Number(a === _this) - Number(b === _this); });
                Window_Draggable.draggingWin = this;
            }
            else if (isPressed && this._dragging && draggingWin === this) {
                this.x = TouchInput.x - setNullDefault(this._dragX, 0);
                this.y = TouchInput.y - setNullDefault(this._dragY, 0);
            }
            else if (isReleased) {
                this._dragging = false;
            }
        };
        return Window_Draggable;
    }(WindowClass)),
    _a.draggingWin = null,
    _a; };
[/pre]

附上我的js目录(我引入了lodash库, 同时安装了@types/lodash):
[pre lang="javascript"]js
│  main.js
│  plugins.js
│  rpg_core.js
│  rpg_managers.js
│  rpg_objects.js
│  rpg_scenes.js
│  rpg_sprites.js
│  rpg_windows.js
│
├─libs
│      fpsmeter.js
│      iphone-inline-video.browser.js
│      lodash.min.js
│      lz-string.js
│      pixi-picture.js
│      pixi-tilemap.js
│      pixi.js
│
├─notes
│      index.txt
│
├─plugins
│      CleanWindow.js
│
└─src
        CleanWindow.ts
        rpg_core.d.ts
        rpg_managers.d.ts
        rpg_windows.d.ts[/pre]
夏普的道具店

塞露提亚-道具屋的经营妙方同人作品
发布帖:点击这里
梦石
2
星屑
6767
在线时间
501 小时
注册时间
2018-3-23
回帖
487

R考场第七期银奖

发表于 2020-6-7 17:22:03 | 显示全部楼层
虽然看不懂但是前排沙发
(可能因为写习惯前端觉得还是原生的JS方便233333

点评

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

使用道具 举报

梦石
0
星屑
15295
在线时间
720 小时
注册时间
2011-7-16
回帖
1373

开拓者

发表于 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
另外,我的插件、范例、游戏都在这里
回复

使用道具 举报

梦石
0
星屑
3486
在线时间
294 小时
注册时间
2020-1-27
回帖
180
发表于 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
回复

使用道具 举报

梦石
0
星屑
24
在线时间
3 小时
注册时间
2020-7-31
回帖
2
发表于 2020-8-1 11:56:52 来自手机 | 显示全部楼层
未来的趋势一定是ts,ts强大太多了
回复

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部