じ☆ve冰风 发表于 7 天前

How to hide and show the TPB bar?

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) {         return dict;   } else {         const sprite = new spriteClass();         dict = 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) { //Can't read dict properly because this(context) is supposed to be Window_BattleStatus so it crashes         return dict;   } else {         const sprite = new spriteClass();         dict = 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/
页: [1]
查看完整版本: How to hide and show the TPB bar?