设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 106|回复: 0

[转载] How to hide and show the TPB bar?

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    前天 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    4446

    主题

    864

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    22899
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    28239

    灌水之王

    发表于 7 天前 | 显示全部楼层 |阅读模式
    I've been recently working on an active TPB rework plugin where only enemies actually have to wait for their TPB bar to fill. I've done this by just checking if a battler is an actor and setting their tpbChargeTime to one if true. Additionally, I also added an !isGuard() and !isRestricted() check because both guarding and restriction states are rendered useless if an actor just blazes through to their next turn. Thus, I only wanted an actor's TPB bar to show if they're guarding or restricted because it's useless otherwise, so I first tried drawing the TPB bar only when an actor's guarding.

    Spoiler: Unedited Engine Code
                    JavaScript:        
    Game_Actor.prototype.performAction = function(action) {     Game_Battler.prototype.performAction.call(this, action);     if (action.isAttack()) {         this.performAttack();     } else if (action.isGuard()) {         this.requestMotion("guard");     } else if (action.isMagicSkill()) {         this.requestMotion("spell");     } else if (action.isSkill()) {         this.requestMotion("skill");     } else if (action.isItem()) {         this.requestMotion("item");     } };  Window_BattleStatus.prototype.drawItemStatus = function(index) {     const actor = this.actor(index);     const rect = this.itemRectWithPadding(index);     const nameX = this.nameX(rect);     const nameY = this.nameY(rect);     const stateIconX = this.stateIconX(rect);     const stateIconY = this.stateIconY(rect);     const basicGaugesX = this.basicGaugesX(rect);     const basicGaugesY = this.basicGaugesY(rect);     this.placeTimeGauge(actor, nameX, nameY);     this.placeActorName(actor, nameX, nameY);     this.placeStateIcon(actor, stateIconX, stateIconY);     this.placeBasicGauges(actor, basicGaugesX, basicGaugesY); };  Window_StatusBase.prototype.placeTimeGauge = function(actor, x, y) {     if (BattleManager.isTpb()) {         this.placeGauge(actor, "time", x, y);     } };  Window_StatusBase.prototype.placeGauge = function(actor, type, x, y) {     const key = "actor%1-gauge-%2".format(actor.actorId(), type);     const sprite = this.createInnerSprite(key, Sprite_Gauge);     sprite.setup(actor, type);     sprite.move(x, y);     sprite.show(); };  Window_StatusBase.prototype.createInnerSprite = function(key, spriteClass) {     const dict = this._additionalSprites;     if (dict[key]) {         return dict[key];     } else {         const sprite = new spriteClass();         dict[key] = sprite;         this.addInnerChild(sprite);         return sprite;     } };


    Spoiler: Edited Engine Code
                    JavaScript:        
    Game_Actor.prototype.performAction = function(action) {     Game_Battler.prototype.performAction.call(this, action);     if (action.isAttack()) {         this.performAttack();     } else if (action.isGuard()) {         let index = $gameParty.members().map(e => e._actorId).indexOf(this._actorId); //Finds the party index of actor         Window_BattleStatus.prototype.drawTimeGauge(index);         this.requestMotion("guard");     } else if (action.isMagicSkill()) {         this.requestMotion("spell");     } else if (action.isSkill()) {         this.requestMotion("skill");     } else if (action.isItem()) {         this.requestMotion("item");     } };  Window_BattleStatus.prototype.drawItemStatus = function(index) {     const actor = this.actor(index);     const rect = this.itemRectWithPadding(index);     const nameX = this.nameX(rect);     const nameY = this.nameY(rect);     const stateIconX = this.stateIconX(rect);     const stateIconY = this.stateIconY(rect);     const basicGaugesX = this.basicGaugesX(rect);     const basicGaugesY = this.basicGaugesY(rect);     // this.placeTimeGauge(actor, nameX, nameY);     this.placeActorName(actor, nameX, nameY);     this.placeStateIcon(actor, stateIconX, stateIconY);     this.placeBasicGauges(actor, basicGaugesX, basicGaugesY); };  Window_BattleStatus.prototype.drawTimeGauge = function(index) { //Newly made function     console.log(this); //Shows Window_StatusBase instead of Window_BattleStatus     const actor = this.actor(index);     const rect = this.itemRectWithPadding(index);     const nameX = this.nameX(rect);     const nameY = this.nameY(rect);     this.placeTimeGauge(actor, nameX, nameY); }  Window_StatusBase.prototype.placeTimeGauge = function(actor, x, y) {     if (BattleManager.isTpb()) {         this.placeGauge(actor, "time", x, y);     } };   Window_StatusBase.prototype.placeGauge = function(actor, type, x, y) {     const key = "actor%1-gauge-%2".format(actor.actorId(), type);     const sprite = this.createInnerSprite(key, Sprite_Gauge);     sprite.setup(actor, type);     sprite.move(x, y);     sprite.show(); };  Window_StatusBase.prototype.createInnerSprite = function(key, spriteClass) {     const dict = this._additionalSprites;     if (dict[key]) { //Can't read dict properly because this(context) is supposed to be Window_BattleStatus so it crashes         return dict[key];     } else {         const sprite = new spriteClass();         dict[key] = sprite;         this.addInnerChild(sprite);         return sprite;     } };


    Spoiler: Error


    Essentially the problem is that whenever I try calling Window_BattleStatus.prototype.drawTimeGauge or any other method using Window_BattleStatus, it uses the super class instead of the child class as the context. I've tried using .call(index), .call(Window_BattleStatus.prototype, index) but nothing has worked so far.

    I've been at my ropes for a couple of day so far and I tried reading rmmz_window code but it's so different from the other engine code that I'm completely baffled by everything is says. I've also come up with the idea to just draw the TPB bar invisible and update the color when guarding or just have the bar blip in and out like after attacking an enemy, but once again, rmmz_window code blind folds and beats me over with a bat.

    If anyone can explain a solution or a workaround to me like I'm 5 years old I would be really grateful.


    本贴来自国际rpgmaker官方论坛作者:LowrellLovelace处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/how-to-hide-and-show-the-tpb-bar.182477/

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-7-14 14:22 , Processed in 0.064480 second(s), 52 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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