RPGMZ游戏引擎 一个窗口 文本居中显示

个人纪录保存

project1论坛 小圈子 人才 不得学习技术

javascript 复制代码
    function _New_Window() {
        this.initialize(...arguments);
    };
     
	_New_Window.prototype = Object.create(Window_Base.prototype);
    _New_Window.prototype.constructor = _New_Window;
    // 初始化窗口
    _New_Window.prototype.initialize = function(rect) {
        Window_Base.prototype.initialize.call(this, rect);
		this.npc_text="";
		this._lastText = '';
		this.paddingScale = 2;
		this.isWindow = 1; //是什么窗口; 
    };
    _New_Window.prototype.refresh = function() {
        if (this._lastText === this.npc_text) return;

        // 1. 切割文本
        let lines = this.npc_text.split(/\r?\n/); 
        let newLines = [];
        lines.forEach(row => {
            if (row.length > 0) {
                newLines.push(row);
            }
        });
		lines = newLines;
		if (lines.length === 0) lines = [""];
        // 2. 必须先创建画布,才能测量宽度
        if (!this.contents) {
            this.createContents();
        }

        // 3. 计算最长行宽度
        let maxTextW = 0;
        for (let i = 0; i < lines.length; i++) {
            let w = this.contents.measureTextWidth(lines[i]);
            if (w > maxTextW) maxTextW = w;
        }

        let lineH = this.lineHeight();
        let pad = this.padding * this.paddingScale;

        // 4. 计算窗口真实大小
        this.width = maxTextW + pad ;
        this.height = lines.length * lineH + pad;

        // 5. 重置画布 + 清空(你要的 clear 在这里)
        this.createContents();
        this.contents.clear();

        // 6. 垂直居中绘制
        let totalTextH = lines.length * lineH;
        let startY = (this.contents.height - totalTextH) / 2;

        for (let i = 0; i < lines.length; i++) {
            let y = startY + i * lineH;
            this.drawText(lines[i], 0, y, this.contents.width, "center");
        }

        // 7. 窗口定位
        switch (this.isWindow) {
            case 0: //整体窗口居中显示
                const cx = (Graphics.width - this.width) / 2;
                const cy = (Graphics.height - this.height) / 2;
                this.move(cx, cy, this.width, this.height);
            break;
            case 1://某个精灵顶部定位
                this.move(0 - this.width / 2, 0 - this.height - 74, this.width, this.height);
            break;
        }

        this._lastText = this.npc_text;
    };
	
	_New_Window.prototype.update = function(){
		this.refresh();

	};
相关推荐
云和数据.ChenGuang5 分钟前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu26 分钟前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
凯基迪科技1 小时前
Unity游戏加密锁逆向方案、选型与攻防分析
游戏·unity·游戏引擎
多弗朗皮卡丘1 小时前
C++的IO流
开发语言·c++·io流·文件io流
liyi_hz20081 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3271 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate2 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx2 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
摇滚侠2 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记
xiangyun612 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl