RMMV Displaying a window while the game is active?

bishiba

Adept
Veteran
Joined
Apr 6, 2016
Messages
273
Reaction score
160
First Language
Swedish
Primarily Uses
N/A
So the question is wheter or note the post name is possible. I know that you can add sprites and such.

But if I would like to have a window that displays in the top left constantly during play, is that doable? I would've tried but I am currently not at home, and if it's possible I'd just like to know where to start when I get back

best regards,
Bishiba
 

caethyril

^_^
Global Mod
Joined
Feb 21, 2018
Messages
3,048
Reaction score
2,358
First Language
EN
Primarily Uses
RMMZ
Like a HUD? Yes, it's possible: create a new window instance and use the scene's addWindow method to add it to the scene~
 

bishiba

Adept
Veteran
Joined
Apr 6, 2016
Messages
273
Reaction score
160
First Language
Swedish
Primarily Uses
N/A
Like a HUD? Yes, it's possible: create a new window instance and use the scene's addWindow method to add it to the scene~
Alright, been trying to get this window to show. But I am getting the error:
1638458881073.png

It is pointing to this function:
JavaScript:
Scene_Base.prototype.addWindow = function(window) {
    this._windowLayer.addChild(window);
};
I don't understand why the Scene._windowLayer would be undefined?

And here is the function I am using, it doesn't have a feature, it's just me trying to get a window to show.
JavaScript:
Scene_Map.prototype.create = function() {
    Scene_Base.prototype.create.call(this);
    this._transfer = $gamePlayer.isTransferring();
    var mapId = this._transfer ? $gamePlayer.newMapId() : $gameMap.mapId();
    DataManager.loadMapData(mapId);
    this.createMapWindow();
};

Scene_Map.prototype.createMapWindow = function() {
    var x = 44;
    var y = 22;
    var width = 66;
    var height = 400;
    this._mapWindow = new Window_MapWindow(x, y, width, height);
    this.addWindow(this._mapWindow);
};

function Window_MapWindow() {
    this.initialize.apply(this, arguments);
}

Window_MapWindow.prototype = Object.create(Window_Base.prototype);
Window_MapWindow.prototype.constructor = Window_MapWindow;

Window_MapWindow.prototype.initialize = function(x, y, width, height) {
    Window_Base.prototype.initialize.call(this, x, y, width, height);
    this._touching = false;
    this._enemy = null;
};


EDIT:
Changed the two functions in my code. Not getting the error, but I am not getting any window displayed.


JavaScript:
Scene_Map.prototype.create = function() {
    Scene_Base.prototype.create.call(this);
    this._transfer = $gamePlayer.isTransferring();
    var mapId = this._transfer ? $gamePlayer.newMapId() : $gameMap.mapId();
    DataManager.loadMapData(mapId);
    this.createWindowLayer()
    this.createMapWindow();
};

Scene_Map.prototype.createMapWindow = function() {
    var x = 44;
    var y = 22;
    var width = 600;
    var height = 400;
    this._mapWindow = new Window_MapWindow(x, y, width, height);
    this.addWindow(this._mapWindow);
};
 
Last edited:

caethyril

^_^
Global Mod
Joined
Feb 21, 2018
Messages
3,048
Reaction score
2,358
First Language
EN
Primarily Uses
RMMZ
It's because the window layer will generally not have been added by the end of the scene's create method. The scene creates its display objects only after the map data has loaded:
JavaScript:
Scene_Map.prototype.onMapLoaded = function() {
    if (this._transfer) {
        $gamePlayer.performTransfer();
    }
    this.createDisplayObjects();
};
Instead, you should patch the createDisplayObjects method, which gets called when the database has loaded. E.g.
JavaScript:
// Private scope to avoid naming clashes
(function() {
  // Store original method
  var _Scene_Map_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
  // Define override
  Scene_Map.prototype.createDisplayObjects = function() {
    // Invoke stored method
    _Scene_Map_createDisplayObjects.apply(this, arguments);
    // Run extra code
    this.createMapWindow();
  };
})();
Also, note that a patch/alias, like I've used here, usually lets you write less code than a full override and gives a better chance of compatibility with other plugins~

Edit: I didn't see your edit before, sorry. :kaoslp:
EDIT:
Changed the two functions in my code. Not getting the error, but I am not getting any window displayed.


JavaScript:
Scene_Map.prototype.create = function() {
    Scene_Base.prototype.create.call(this);
    this._transfer = $gamePlayer.isTransferring();
    var mapId = this._transfer ? $gamePlayer.newMapId() : $gameMap.mapId();
    DataManager.loadMapData(mapId);
    this.createWindowLayer()
    this.createMapWindow();
};
// snip //
The window layer is re-created when the map data loads, which is why this doesn't work. createDisplayObjects is the way to go! :kaohi:
 
Last edited:

Latest Threads

Latest Profile Posts

And here I thought I've lost my music sense. Good exercise once in a while
Made Edits to a Character Art from 'Hibiki Katakura MV Monsters' (DLC), to Look More like One of My Own Characters. :LZScheeze:

Decided to retake an old concept I was working on long ago, first change I decided to tackle on right away is the sprites. Never been fan of the default chibis, so I edited it a bit... :kaoswt:
8YavqRj.png

Not sure if this will be the final take, but I like it more than the regular one.
Need a few testers for my new plugin, any takers?
Good night (or day) to everyone! :smile:

Forum statistics

Threads
118,529
Messages
1,116,699
Members
155,558
Latest member
LuckyCatOtome
Top