//============================================================================= // Saba_Performance.js //============================================================================= /*:ja * @plugindesc まだテスト版です。OFFにする場合は 0 を入力してください * @author Sabakan * * @param notDrawAtBitmapSnap * @desc snap作成時に canvas を経由しないようにします。
■副作用: 小。画面遷移系を変更している場合はエラーになります。 * @default 1 * * @param recycleCanvas * @desc Canvas を使い回すことで生成コストを下げます。また、必要でないときは作成しないようにします。■副作用: 中。 * @default 1 * * @param skipSnapForBackgroundByNewGame * @desc ゲーム開始時にSnapForBackgroundをしないようにします。
■副作用: 小。ゲーム開始時に特殊な処理をしている場合は無効にしてください * @default 1 * * @param skipSnapForBackgroundByMapChange * @desc マップ移動時にSnapForBackgroundをしないようにします。
■副作用: 小 * @default 1 * * @param usePixiSpriteToDrawWindow_Base * @desc PIXI.Spriteを使ってWindow_Baseを描画します。
■副作用: 中。Windowの描画を変更している場合は無効にしてください * @default 1 * * @param useFilterToChangePictureTone * @desc PIXI のフィルタを使ってピクチャの色調を変化させます。
■副作用: 大。グレー効果は効かなくなります * @default 1 * * @param reduceWindowInitializeProcess * @desc ウィンドウの初期化の無駄な処理を減らします
■副作用: なし * @default 1 * * @param alternateBitmapClearMethod * @desc Bitmap.clear() メソッドを高速な方法に切り替えます
■副作用: 中。Bitmap.clear()を呼ぶと、CanvasRenderingContext2Dのスタイルもクリアされます * @default 1 * * @param usePixiSpriteToDrawIcon * @desc PIXI.Spriteを使ってIconを描画します。
■副作用: 中。アイコンのZ順に影響が出ることがあります * @default 1 * * @param usePixiSpriteToDrawFace * @desc PIXI.Spriteを使ってFaceを描画します。
■副作用: 中。顔グラのZ順に影響が出ることがあります * @default 1 * * @param usePixiSpriteToDrawCharacter * @desc PIXI.Spriteを使ってCharacterを描画します。
■副作用: 中。キャラグラのZ順に影響が出ることがあります * @default 1 * * @param usePixiGraphicsToDrawMenuBg * @desc * @default 1 * * @param skipUnnecessaryRefresh * @desc ウィンドウの初期化の無駄な処理を減らします
■副作用: なし * @default 1 * * @param lazyInitializationBitmapAtSprite_Timer * @desc タイマー用の Bitmap を、必要になるまで作成しないようにします
■副作用: 小 * @default 1 * * @param lazyInitializationWeather * @desc 天気用の Bitmap を、必要になるまで作成しないようにします
■副作用: 小 * @default 1 * * @param lazyCreationWindow_MapName * @desc マップネームウィンドウを、必要になるまで作成しないようにします
■副作用: 小 * @default 1 * * @param lazyCreationWindow_ScrollText * @desc スクロールテキストウィンドウを、必要になるまで作成しないようにします
■副作用: 小 * @default 1 * * @param useSpriteToDrawSprite_Destination * @desc * @default 1 * * @param skipWindow_CommandFirstCreateContents * @desc 不要な createContents をスキップします
■副作用: 小。通常は影響がないはずです * @default 1 * * @param useDefaultTextColor * @desc pixelを調べずにテキストカラーを取得するようにします
■副作用: 小。テキストカラーを変更していても、それが反映されません * @default 1 * * @param reduceLoadingGlobalInfo * @desc * @default 1 * * @param notLoadingVolumeZeroAudio * @desc config でボリュームが 0 に設定したオーディオを読み込まないようにします
■副作用: 小。ボリュームを 0 から 1 以上にあげると、最初から再生されます * @default 1 * * @param usePixiByWindow_BattleLogBg * @desc バトルログの背景を PIXI を使って描画しますbr>■副作用: 小 * @default 1 * * @help * ・MV1.3 WebGL モード限定です * ・canvas 呼び出しで固まってしまう機種に対して効果を発揮します */ var Saba; (function (Saba) { var parameters = PluginManager.parameters('Saba_Performance'); /** * 子供を destroy しつつ削除します */ PIXI.Container.prototype.destroyAndRemoveChildren = function() { for (var i = this.children.length; i >= 0; i--) { if (this.children[i]) { this.children[i].destroy({children: true, texture: true}); } } this.removeChildren(); }; Saba.toPixiColor = function(color) { var r = parseInt(color.substring(1, 3), 16); var g = parseInt(color.substring(3, 5), 16); var b = parseInt(color.substring(5, 7), 16); var intColor = (r << 16) | (g << 8) | b; return intColor; }; if (parseInt(parameters['notDrawAtBitmapSnap'])) { /** * snap作成時に canvas を経由しない。 * メニューのオープンが速くなる。 */ var renderTexture; Bitmap.snap = function(stage) { var width = Graphics.width; var height = Graphics.height; // var bitmap = new Bitmap(width, height); if (! renderTexture) { renderTexture = PIXI.RenderTexture.create(width, height); } if (stage) { Graphics._renderer.render(stage, renderTexture); stage.worldTransform.identity(); return new PIXI.Sprite(new PIXI.Texture(renderTexture)); // context.drawImage(canvas, 0, 0); } else { //TODO: Ivan: what if stage is not present? } return null; }; /** * Bitmap.blur が使えなくなるのでフィルタで代用 */ Scene_MenuBase.prototype.createBackground = function() { this._backgroundSprite = SceneManager.backgroundBitmap(); var blurFilter = new PIXI.filters.BlurFilter(1); this._backgroundSprite.filters = [blurFilter]; var destroy = this._backgroundSprite.destroy; this._backgroundSprite.destroy = function(options) { // DO nothing this.filters = null; }; this.addChild(this._backgroundSprite); }; SceneManager.snapForBackground = function() { this._backgroundBitmap = this.snap(); this._backgroundBitmap.isBackgroundBitmap = true; // this._backgroundBitmap.blur(); }; Spriteset_Battle.prototype.createBackground = function() { }; } if (parseInt(parameters['recycleCanvas'])) { Window_Base.prototype.refreshDimmerBitmap = function () { if (this._dimmerSprite) { var bitmap = this._dimmerSprite.bitmap; var w = this.width; var h = this.height; var m = this.padding; var c1 = this.dimColor1(); var c2 = this.dimColor2(); if (bitmap.width != w || bitmap.height != h) { this._dimmerSprite.bitmap = new Bitmap(w, h); bitmap = this._dimmerSprite.bitmap; } bitmap.gradientFillRect(0, 0, w, m, c2, c1, true); bitmap.fillRect(0, m, w, h - m * 2, c1); bitmap.gradientFillRect(0, h - m, w, m, c1, c2, true); this._dimmerSprite.setFrame(0, 0, w, h); } }; PIXI.extras.TilingSprite.prototype.destroy = function() { PIXI.Sprite.prototype.destroy.call(this); }; PIXI.DisplayObject.prototype.returnChildCanvas = function() { if (this.returnCanvas) { this.returnCanvas(); } }; PIXI.Container.prototype.returnChildCanvas = function() { if (this.returnCanvas) { this.returnCanvas(); } for (var i = 0; i < this.children.length; i++) { var child = this.children[i]; if (child.returnChildCanvas) { child.returnChildCanvas(); } } }; /** * 一度作成した canvas を使い回すことで、初期化のコストを減らす。 * ゲームの起動、シーン遷移などが速くなる。 */ SceneManager.changeScene = function() { if (this.isSceneChanging() && !this.isCurrentSceneBusy()) { if (this._scene) { this._scene.terminate(); this._scene.returnChildCanvas(); this._previousClass = this._scene.constructor; this._previousScene = this._scene; } this._scene = this._nextScene; if (this._scene) { this._scene.create(); this._nextScene = null; this._sceneStarted = false; this.onSceneCreate(); } if (this._exiting) { this.terminate(); } if (this._previousScene) { this._previousScene.destroy({children: true, texture: true}); this._previousScene.visible = false; this._previousScene = null; } } }; SceneManager.renderScene = function() { if (this.isCurrentSceneStarted()) { Graphics.render(this._scene); } else if (this._scene) { this.onSceneLoading(); } }; Window.prototype.returnCanvas = function() { if (this.contents && this.contents.returnCanvas) { this.contents.returnCanvas(); } }; Sprite.prototype.returnCanvas = function() { if (this.bitmap && this.bitmap.returnCanvas) { this.bitmap.returnCanvas(); } }; var canvasCacheMap = {}; function getCanvasCache(width, height) { var key = width + '_' + height; canvasCacheMap[key] = canvasCacheMap[key] || []; if (canvasCacheMap[key].length > 0) { return canvasCacheMap[key].pop(); } var canvasCache = {}; canvasCache._canvas = document.createElement('canvas'); canvasCache._context = canvasCache._canvas.getContext('2d'); canvasCache._canvas.width = width; canvasCache._canvas.height = height; return canvasCache; } function putCanvasCache(bitmap) { var canvasCache = {}; canvasCache._canvas = bitmap._canvas; canvasCache._context = bitmap._context; var key = bitmap._canvas.width + '_' + bitmap._canvas.height; canvasCacheMap[key] = canvasCacheMap[key] || []; canvasCacheMap[key].push(canvasCache); } Bitmap.prototype.returnCanvas = function() { if (this._disposed) { return; } this._disposed = true; if (! this._context) { return; } //this._baseTexture.destroy(); putCanvasCache(this); }; Bitmap.prototype.destroy = function() { this._context = null; this._canvas = null; if (this._baseTexture) { this._baseTexture.destroy(); } this._baseTexture = null; this._image = null; this._url = null; this.textColor = null; this.outlineColor = null; this._loadListeners = null; }; Bitmap.prototype.initialize = function(width, height) { if (width !== undefined) { width = Math.max(width || 0, 1); height = Math.max(height || 0, 1); var cache = getCanvasCache(width, height); this._canvas = cache._canvas; this._context = cache._context; this._baseTexture = new PIXI.BaseTexture(this._canvas); this.clear(); this.paintOpacity = 255; } else { // 幅を指定しない場合は canvas を作成しない this._baseTexture = new PIXI.BaseTexture(null); this._canvas = {dummy: true}; // dummy this._canvas.width = Math.max(width || 0, 1); this._canvas.height = Math.max(height || 0, 1); this._baseTexture.source = this._canvas; } this._baseTexture.mipmap = false; this._baseTexture.scaleMode = PIXI.SCALE_MODES.NEAREST; this._image = null; this._url = ''; this._paintOpacity = 255; this._smooth = false; this._loadListeners = []; this._isLoading = false; this._hasError = false; /** * Cache entry, for images. In all cases _url is the same as cacheEntry.key * @type CacheEntry */ this.cacheEntry = null; /** * The face name of the font. * * @property fontFace * @type String */ this.fontFace = 'GameFont'; /** * The size of the font in pixels. * * @property fontSize * @type Number */ this.fontSize = 28; /** * Whether the font is italic. * * @property fontItalic * @type Boolean */ this.fontItalic = false; /** * The color of the text in CSS format. * * @property textColor * @type String */ this.textColor = '#ffffff'; /** * The color of the outline of the text in CSS format. * * @property outlineColor * @type String */ this.outlineColor = 'rgba(0, 0, 0, 0.5)'; /** * The width of the outline of the text. * * @property outlineWidth * @type Number */ this.outlineWidth = 4; }; Bitmap.prototype._onLoad = function() { if(Decrypter.hasEncryptedImages) { window.URL.revokeObjectURL(this._image.src); } this._isLoading = false; this._baseTexture.loadSource(this._image); this._canvas = this._image; this.resize(this._image.width, this._image.height); this._baseTexture.emit('loaded', this._baseTexture); // this._context.drawImage(this._image, 0, 0); this._setDirty(); this._callLoadListeners(); }; var _Bitmap_rotateHue = Bitmap.prototype.rotateHue; Bitmap.prototype.rotateHue = function(offset) { if (offset && this.width > 0 && this.height > 0) { if (! this._context) { // この時だけ仕方なく描画。 var cache = getCanvasCache(); this._canvas = cache._canvas; this._context = cache._context; this.resize(this._image.width, this._image.height); this._context.drawImage(this._image, 0, 0); } } _Bitmap_rotateHue.call(this, offset); }; Object.defineProperty(Sprite.prototype, 'bitmap', { set: function(value) { if (this._bitmap !== value) { if (this._bitmap) { this._bitmap.returnCanvas(); this._bitmap._loadListeners = []; } this._bitmap = value; if (this._bitmap) { this.setFrame(0, 0, 0, 0); this._bitmap.addLoadListener(this._onBitmapLoad.bind(this)); } else { this.texture.frame = Rectangle.emptyRectangle; } } }, configurable: true }); Bitmap.prototype.getPixel = function(x, y) { if (! this._context) { // この時だけ仕方なく描画。 var cache = getCanvasCache(); this._canvas = cache._canvas; this._context = cache._context; this.resize(this._image.width, this._image.height); this._context.drawImage(this._image, 0, 0); } var data = this._context.getImageData(x, y, 1, 1).data; var result = '#'; for (var i = 0; i < 3; i++) { result += data[i].toString(16).padZero(2); } return result; }; var _Bitmap_getAlphaPixel = Bitmap.prototype.getAlphaPixel; Bitmap.prototype.getAlphaPixel = function(x, y) { if (! this._context) { // この時だけ仕方なく描画。 var cache = getCanvasCache(); this._canvas = cache._canvas; this._context = cache._context; this.resize(this._image.width, this._image.height); this._context.drawImage(this._image, 0, 0); } return _Bitmap_getAlphaPixel.call(this, x, y); }; ImageManager.loadEmptyBitmap = function() { var empty = this.cache.getItem('empty'); if (!empty) { empty = new Bitmap(1); this.cache.setItem('empty', empty); } return empty; }; Sprite.prototype._createTinter = function(w, h) { if (!this._canvas2) { this._canvas2 = document.createElement('canvas'); this._context = this._canvas2.getContext('2d'); } this._canvas2.width = w; this._canvas2.height = h; if (!this._tintTexture) { this._tintTexture = new PIXI.BaseTexture(this._canvas2); } this._tintTexture.width = w; this._tintTexture.height = h; this._tintTexture.scaleMode = this._bitmap.baseTexture.scaleMode; }; } if (parseInt(parameters['skipSnapForBackgroundByNewGame'])) { /** * Scene_Title から newGame の選択時は、snapForBackground が不必要 */ Scene_Title.prototype.terminate = function() { Scene_Base.prototype.terminate.call(this); if (!SceneManager.isNextScene(Scene_Map)) { SceneManager.snapForBackground(); } }; } if (parseInt(parameters['skipSnapForBackgroundByMapChange'])) { /** * マップ切り替え時は SceneManager.snapForBackground を呼ばないようにした */ Scene_Map.prototype.terminate = function() { Scene_Base.prototype.terminate.call(this); if (!SceneManager.isNextScene(Scene_Battle) && !SceneManager.isNextScene(Scene_Map)) { this._spriteset.update(); this._mapNameWindow.hide(); SceneManager.snapForBackground(); } $gameScreen.clearZoom(); }; } if (parseInt(parameters['usePixiSpriteToDrawWindow_Base'])) { /** * Window の描画は drawImage が何度も走るので PIXI.Sprite で代用 */ Window.prototype._refreshBack = function() { var m = this._margin; var w = this._width - m * 2; var h = this._height - m * 2; var bitmap = new Bitmap(w, h); this._windowBackSprite.bitmap = bitmap; this._windowBackSprite.setFrame(0, 0, w, h); this._windowBackSprite.move(m, m); this._windowBackSprite._toneFilter = new ToneFilter(); if (w > 0 && h > 0 && this._windowskin) { this._windowBackSprite.destroyAndRemoveChildren(); var baseTexture = this.getBaseTexture(); var p = 96; var texture = new PIXI.Texture(baseTexture); texture.frame = new PIXI.Rectangle(0, 0, p, p); var backSprite = new PIXI.Sprite(texture); backSprite.width = w; backSprite.height = h; this._windowBackSprite.addChild(backSprite); // bitmap.blt(this._windowskin, 0, 0, p, p, 0, 0, w, h); var tileTexture = new PIXI.Texture(baseTexture, new PIXI.Rectangle(0, p, p, p)); var tilingSprite = new PIXI.extras.TilingSprite(tileTexture, w, h); this._windowBackSprite.addChild(tilingSprite); var tone = this._colorTone; this._windowBackSprite._toneFilter.reset(); this._windowBackSprite._toneFilter.adjustTone(tone[0], tone[1], tone[2]); //bitmap.adjustTone(tone[0], tone[1], tone[2]); } }; Window.prototype.getBaseTexture = function() { var baseTexture = PIXI.utils.BaseTextureCache[this._windowskin._image.src]; if (! baseTexture) { baseTexture = new PIXI.BaseTexture(this._windowskin._image, PIXI.SCALE_MODES.DEFAULT); baseTexture.imageUrl = this._windowskin._image.src; PIXI.utils.BaseTextureCache[this._windowskin._image.src] = baseTexture; } return baseTexture; }; Window.prototype._refreshFrame = function() { var w = this._width; var h = this._height; var m = 24; // var bitmap = new Bitmap(w, h); // this._windowFrameSprite.bitmap = bitmap; this._windowFrameSprite.setFrame(0, 0, w, h); if (w > 0 && h > 0 && this._windowskin) { // var skin = this._windowskin; var baseTexture = this.getBaseTexture(); var parent = this._windowFrameSprite; parent.destroyAndRemoveChildren(); var p = 96; var q = 96; this._addPixiSprite(parent, baseTexture, p+m, 0+0, p-m*2, m, m, 0, w-m*2, m); this._addPixiSprite(parent, baseTexture, p+m, 0+q-m, p-m*2, m, m, h-m, w-m*2, m); this._addPixiSprite(parent, baseTexture, p+0, 0+m, m, p-m*2, 0, m, m, h-m*2); this._addPixiSprite(parent, baseTexture, p+q-m, 0+m, m, p-m*2, w-m, m, m, h-m*2); this._addPixiSprite(parent, baseTexture, p+0, 0+0, m, m, 0, 0, m, m); this._addPixiSprite(parent, baseTexture, p+q-m, 0+0, m, m, w-m, 0, m, m); this._addPixiSprite(parent, baseTexture, p+0, 0+q-m, m, m, 0, h-m, m, m); this._addPixiSprite(parent, baseTexture, p+q-m, 0+q-m, m, m, w-m, h-m, m, m); // bitmap.blt(skin, p+m, 0+0, p-m*2, m, m, 0, w-m*2, m); // bitmap.blt(skin, p+m, 0+q-m, p-m*2, m, m, h-m, w-m*2, m); // bitmap.blt(skin, p+0, 0+m, m, p-m*2, 0, m, m, h-m*2); // bitmap.blt(skin, p+q-m, 0+m, m, p-m*2, w-m, m, m, h-m*2); // bitmap.blt(skin, p+0, 0+0, m, m, 0, 0, m, m); // bitmap.blt(skin, p+q-m, 0+0, m, m, w-m, 0, m, m); // bitmap.blt(skin, p+0, 0+q-m, m, m, 0, h-m, m, m); // bitmap.blt(skin, p+q-m, 0+q-m, m, m, w-m, h-m, m, m); } }; Window.prototype._addPixiSprite = function(parent, baseTexture, sx, sy, sw, sh, dx, dy, dw, dh) { var texture = new PIXI.Texture(baseTexture); texture.frame = new PIXI.Rectangle(sx, sy, sw, sh); var sprite = new PIXI.Sprite(texture); sprite.width = dw; sprite.height = dh; sprite.position.x = dx; sprite.position.y = dy; parent.addChild(sprite); }; Window.prototype._refreshCursor = function() { var pad = this._padding; var x = this._cursorRect.x + pad - this.origin.x; var y = this._cursorRect.y + pad - this.origin.y; var w = this._cursorRect.width; var h = this._cursorRect.height; var m = 4; var x2 = Math.max(x, pad); var y2 = Math.max(y, pad); var ox = x - x2; var oy = y - y2; var w2 = Math.min(w, this._width - pad - x2); var h2 = Math.min(h, this._height - pad - y2); // var bitmap = new Bitmap(w2, h2); // this._windowCursorSprite.bitmap = bitmap; this._windowCursorSprite.setFrame(0, 0, w2, h2); this._windowCursorSprite.move(x2, y2); var parent = this._windowCursorSprite; parent.destroyAndRemoveChildren(); if (w > 0 && h > 0 && this._windowskin) { // var skin = this._windowskin; var p = 96; var q = 48; var baseTexture = this.getBaseTexture(); this._addPixiSprite(parent, baseTexture, p+m, p+m, q-m*2, q-m*2, ox+m, oy+m, w-m*2, h-m*2); this._addPixiSprite(parent, baseTexture, p+m, p+0, q-m*2, m, ox+m, oy+0, w-m*2, m); this._addPixiSprite(parent, baseTexture, p+m, p+q-m, q-m*2, m, ox+m, oy+h-m, w-m*2, m); this._addPixiSprite(parent, baseTexture, p+0, p+m, m, q-m*2, ox+0, oy+m, m, h-m*2); this._addPixiSprite(parent, baseTexture, p+q-m, p+m, m, q-m*2, ox+w-m, oy+m, m, h-m*2); this._addPixiSprite(parent, baseTexture, p+0, p+0, m, m, ox+0, oy+0, m, m); this._addPixiSprite(parent, baseTexture, p+q-m, p+0, m, m, ox+w-m, oy+0, m, m); this._addPixiSprite(parent, baseTexture, p+0, p+q-m, m, m, ox+0, oy+h-m, m, m); this._addPixiSprite(parent, baseTexture, p+q-m, p+q-m, m, m, ox+w-m, oy+h-m, m, m); // bitmap.blt(skin, p+m, p+m, q-m*2, q-m*2, ox+m, oy+m, w-m*2, h-m*2); // bitmap.blt(skin, p+m, p+0, q-m*2, m, ox+m, oy+0, w-m*2, m); // bitmap.blt(skin, p+m, p+q-m, q-m*2, m, ox+m, oy+h-m, w-m*2, m); // bitmap.blt(skin, p+0, p+m, m, q-m*2, ox+0, oy+m, m, h-m*2); // bitmap.blt(skin, p+q-m, p+m, m, q-m*2, ox+w-m, oy+m, m, h-m*2); // bitmap.blt(skin, p+0, p+0, m, m, ox+0, oy+0, m, m); // bitmap.blt(skin, p+q-m, p+0, m, m, ox+w-m, oy+0, m, m); // bitmap.blt(skin, p+0, p+q-m, m, m, ox+0, oy+h-m, m, m); // bitmap.blt(skin, p+q-m, p+q-m, m, m, ox+w-m, oy+h-m, m, m); } }; } if (parseInt(parameters['useFilterToChangePictureTone'])) { /** * 色調の変化の度に drawImage が走るのでフィルタで代用 */ Sprite.prototype.setColorTone = function(tone) { if (!(tone instanceof Array)) { throw new Error('Argument must be an array'); } if (!this._colorTone.equals(tone)) { if (! this._toneFilter) { this._toneFilter = new ToneFilter(); this.filters = [this._toneFilter]; } this._colorTone = tone.clone(); this._toneFilter.reset(); this._toneFilter.adjustTone(tone[0], tone[1], tone[2]); } }; } if (parseInt(parameters['reduceWindowInitializeProcess'])) { /** * ウィンドウの初期化で3回 _refreshAllParts が走るので1回にまとめた */ var _Window_Base_initialize = Window_Base.prototype.initialize; Window_Base.prototype.initialize = function(x, y, width, height) { this._initializing = true; _Window_Base_initialize.call(this, x, y, width, height); this._initializing = false; this._refreshAllParts(); }; var _Window__refreshAllParts = Window.prototype._refreshAllParts; Window.prototype._refreshAllParts = function() { if (this._initializing) { return; } _Window__refreshAllParts.call(this); }; } if (parseInt(parameters['alternateBitmapClearMethod'])) { /** * Chromium の clearRect は遅い */ Bitmap.prototype.clear = function() { this._canvas.width = this._canvas.width; // 裏技 this._setDirty(); //this.clearRect(0, 0, this.width, this.height); }; } if (parseInt(parameters['usePixiSpriteToDrawIcon'])) { /** * drawIcon では drawImage が行われるので PIXI.Sprite で代用 */ Window_Base.prototype.drawIcon = function(iconIndex, x, y) { var baseTexture = PIXI.utils.BaseTextureCache['system/IconSet']; if (! baseTexture) { var bitmap = ImageManager.loadSystem('IconSet'); if (! bitmap.isReady()) { return; } baseTexture = new PIXI.BaseTexture(bitmap._image, PIXI.SCALE_MODES.DEFAULT); baseTexture.imageUrl = 'system/IconSet'; PIXI.utils.BaseTextureCache['system/IconSet'] = baseTexture; } var pw = Window_Base._iconWidth; var ph = Window_Base._iconHeight; var sx = iconIndex % 16 * pw; var sy = Math.floor(iconIndex / 16) * ph; var texture = new PIXI.Texture(baseTexture); texture.frame = new PIXI.Rectangle(sx, sy, pw, ph); var sprite = new PIXI.Sprite(texture); sprite.position.x = x; sprite.position.y = y; sprite.alpha = this.contents.paintOpacity / 255.0; this._windowContentsSprite.addChild(sprite); // this.contents.blt(bitmap, sx, sy, pw, ph, x, y); }; } if (parseInt(parameters['usePixiSpriteToDrawFace'])) { /** * drawFace では drawImage が行われるので PIXI.Sprite で代用 */ Window_Base.prototype.drawFace = function(faceName, faceIndex, x, y, width, height) { if (! faceName) { return; } width = width || Window_Base._faceWidth; height = height || Window_Base._faceHeight; var baseTexture = PIXI.utils.BaseTextureCache['face/' + faceName]; if (! baseTexture) { var bitmap = ImageManager.loadFace(faceName); if (! bitmap.isReady()) { return; } baseTexture = new PIXI.BaseTexture(bitmap._image, PIXI.SCALE_MODES.DEFAULT); baseTexture.imageUrl = 'face/' + faceName; PIXI.utils.BaseTextureCache['face/' + faceName] = baseTexture; } var pw = Window_Base._faceWidth; var ph = Window_Base._faceHeight; var sw = Math.min(width, pw); var sh = Math.min(height, ph); var dx = Math.floor(x + Math.max(width - pw, 0) / 2); var dy = Math.floor(y + Math.max(height - ph, 0) / 2); var sx = faceIndex % 4 * pw + (pw - sw) / 2; var sy = Math.floor(faceIndex / 4) * ph + (ph - sh) / 2; if (sx + sw > baseTexture.width || sy + sh > baseTexture.height) { console.error(faceName + ' グラフィックの描画領域が画像サイズをはみ出しています'); return; } var texture = new PIXI.Texture(baseTexture); texture.frame = new PIXI.Rectangle(sx, sy, sw, sh); var sprite = new PIXI.Sprite(texture); sprite.position.x = dx; sprite.position.y = dy; sprite.alpha = this.contents.paintOpacity / 255.0; this._windowContentsSprite.addChild(sprite); //this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy); }; } if (parseInt(parameters['usePixiSpriteToDrawCharacter'])) { /** * drawCharacter では drawImage が行われるので PIXI.Sprite で代用 */ Window_Base.prototype.drawCharacter = function(characterName, characterIndex, x, y) { if (! characterName) { return; } var baseTexture = PIXI.utils.BaseTextureCache['character/' + characterName]; if (! baseTexture) { var bitmap = ImageManager.loadCharacter(characterName); if (! bitmap.isReady()) { return; } baseTexture = new PIXI.BaseTexture(bitmap._image, PIXI.SCALE_MODES.DEFAULT); baseTexture.imageUrl = 'character/' + characterName; PIXI.utils.BaseTextureCache['character/' + characterName] = baseTexture; } var big = ImageManager.isBigCharacter(characterName); var pw = baseTexture.width / (big ? 3 : 12); var ph = baseTexture.height / (big ? 4 : 8); var n = characterIndex; var sx = (n % 4 * 3 + 1) * pw; var sy = (Math.floor(n / 4) * 4) * ph; var texture = new PIXI.Texture(baseTexture); texture.frame = new PIXI.Rectangle(sx, sy, pw, ph); var sprite = new PIXI.Sprite(texture); sprite.position.x = x - pw / 2; sprite.position.y = y - ph; this._windowContentsSprite.addChild(sprite); //this.contents.blt(bitmap, sx, sy, pw, ph, x - pw / 2, y - ph); }; } if (parseInt(parameters['usePixiSpriteToDrawIcon']) || parseInt(parameters['usePixiSpriteToDrawFace']) || parseInt(parameters['usePixiSpriteToDrawCharacter'])) { /** * drawXXX 系を PIXI.Sprite で代用するときに必要なもの */ Bitmap.prototype.setClearHandler = function(onClear) { this.onClear = onClear; }; var _Bitmap_clear = Bitmap.prototype.clear; Bitmap.prototype.clear = function() { _Bitmap_clear.call(this); if (this.onClear) { this.onClear(); } }; var _Window_Base_createContents = Window_Base.prototype.createContents; Window_Base.prototype.createContents = function() { _Window_Base_createContents.call(this); this.contents.setClearHandler(this.onClearContents.bind(this)); this.contents.clear(); }; var _Window_Base_destroy = Window_Base.prototype.destroy; Window_Base.prototype.destroy = function(options) { if (this.contents && this.contents.onClear) { this.contents.onClear = null; } _Window_Base_destroy.call(this, options); }; Window_Base.prototype.onClearContents = function() { // PIXI.Sprite を消去 this._windowContentsSprite.destroyAndRemoveChildren(); }; } if (parseInt(parameters['usePixiGraphicsToDrawMenuBg'])) { /** * メニュー背景の描画を PIXI.Graphics で代用する */ Window_MenuStatus.prototype.drawItemBackground = function(index) { if (index === this._pendingIndex) { var rect = this.itemRect(index); var color = this.pendingColor(); var graphics = new PIXI.Graphics(); graphics.beginFill(color, this.translucentOpacity() / 255.0); graphics.drawRect(rect.x, rect.y, rect.width, rect.height); this.addChild(graphics); // this.changePaintOpacity(false); // this.contents.fillRect(rect.x, rect.y, rect.width, rect.height, color); // this.changePaintOpacity(true); } }; } if (parseInt(parameters['skipUnnecessaryRefresh'])) { /** * 以下のウィンドウの初期化時の refresh() は不要 */ Window_MapName.prototype.initialize = function() { var wight = this.windowWidth(); var height = this.windowHeight(); Window_Base.prototype.initialize.call(this, 0, 0, wight, height); this.opacity = 0; this.contentsOpacity = 0; this._showCount = 0; // this.refresh(); }; Window_BattleEnemy.prototype.initialize = function(x, y) { this._enemies = []; var width = this.windowWidth(); var height = this.windowHeight(); Window_Selectable.prototype.initialize.call(this, x, y, width, height); // this.refresh(); this.hide(); }; } if (parseInt(parameters['lazyInitializationBitmapAtSprite_Timer'])) { /** * タイマーを表示する必要があるまでタイマーの Bitmap を作成しない。 */ Sprite_Timer.prototype.initialize = function() { Sprite.prototype.initialize.call(this); this._seconds = 0; // this.createBitmap(); this.update(); }; var _Sprite_Timer_redraw = Sprite_Timer.prototype.redraw; Sprite_Timer.prototype.redraw = function() { if (! this._bitmap) { this.createBitmap(); } _Sprite_Timer_redraw.call(this); }; var _Sprite_Timer_updatePosition = Sprite_Timer.prototype.updatePosition; Sprite_Timer.prototype.updatePosition = function() { if (! this._bitmao) { return; } _Sprite_Timer_updatePosition.call(this); }; } if (parseInt(parameters['lazyInitializationWeather'])) { /** * 天気を表示する直前まで Bitmap を作成しない */ Weather.prototype._createBitmaps = function() { // this._rainBitmap = new Bitmap(1, 60); // this._rainBitmap.fillAll('white'); // this._stormBitmap = new Bitmap(2, 100); // this._stormBitmap.fillAll('white'); // this._snowBitmap = new Bitmap(9, 9); // this._snowBitmap.drawCircle(4, 4, 4, 'white'); }; var _Weather_updateRainSprite = Weather.prototype._updateRainSprite; Weather.prototype._updateRainSprite = function(sprite) { if (! this._rainBitmap) { this._rainBitmap = new Bitmap(1, 60); this._rainBitmap.fillAll('white'); } _Weather_updateRainSprite.call(this, sprite); }; var _Weather__updateStormSprite = Weather.prototype._updateStormSprite; Weather.prototype._updateStormSprite = function(sprite) { if (! this._stormBitmap) { this._stormBitmap = new Bitmap(2, 100); this._stormBitmap.fillAll('white'); } _Weather__updateStormSprite.call(this, sprite); }; var _Weather_updateSnowSprite = Weather.prototype._updateSnowSprite; Weather.prototype._updateSnowSprite = function(sprite) { if (! this._snowBitmap) { this._snowBitmap = new Bitmap(9, 9); this._snowBitmap.drawCircle(4, 4, 4, 'white'); } _Weather_updateSnowSprite.call(this, sprite); }; } if (parseInt(parameters['lazyCreationWindow_MapName'])) { /** * Window_MapName は、open() が呼ばれて、かつマップ名を表示する必要があるまで作成しない。 * window 順がずれる可能性あり(最前面になる) */ var _Scene_Map_createMapNameWindow = Scene_Map.prototype.createMapNameWindow; Scene_Map.prototype.createMapNameWindow = function() { var self = this; // dummy this._mapNameWindow = { hide: function() {}, close: function() {}, open: function() { if ($gameMap.displayName()) { _Scene_Map_createMapNameWindow.call(self); self._mapNameWindow.open(); } } }; // this._mapNameWindow = new Window_MapName(); // this.addChild(this._mapNameWindow); }; } if (parseInt(parameters['lazyCreationWindow_ScrollText'])) { /** * Scene_Map の Window_ScrollText は、必要になるまで作成しない。 */ var _Scene_Map_createScrollTextWindow = Scene_Map.prototype.createScrollTextWindow; Scene_Map.prototype.createScrollTextWindow = function() { // this._scrollTextWindow = new Window_ScrollText(); // this.addWindow(this._scrollTextWindow); }; var _Scene_Map_update = Scene_Map.prototype.update; Scene_Map.prototype.update = function() { if ($gameMessage.scrollMode()) { if (! this._scrollTextWindow) { _Scene_Map_createScrollTextWindow.call(this); } } _Scene_Map_update.call(this); }; /** * Scene_Battle の Window_ScrollText は、必要になるまで作成しない。 */ var _Scene_Battle_createScrollTextWindow = Scene_Battle.prototype.createScrollTextWindow; Scene_Battle.prototype.createScrollTextWindow = function() { // this._scrollTextWindow = new Window_ScrollText(); // this.addWindow(this._scrollTextWindow); }; var _Scene_Battle_update = Scene_Battle.prototype.update; Scene_Battle.prototype.update = function() { if ($gameMessage.scrollMode()) { if (! this._scrollTextWindow) { _Scene_Battle_createScrollTextWindow.call(this); } } _Scene_Battle_update.call(this); }; } if (parseInt(parameters['useSpriteToDrawSprite_Destination'])) { /** * 行き先を表示するスプライトは PIXI.Texture を使う */ Sprite_Destination.prototype.createBitmap = function() { var tileWidth = $gameMap.tileWidth(); var tileHeight = $gameMap.tileHeight(); var bitmap = ImageManager.loadSystem('Window'); baseTexture = new PIXI.BaseTexture(bitmap._image, PIXI.SCALE_MODES.DEFAULT); var texture = new PIXI.Texture(baseTexture); texture.frame = new PIXI.Rectangle(96, 144, 12, 12); this.texture = texture; this.anchor.x = 0.5; this.anchor.y = 0.5; this.blendMode = Graphics.BLEND_ADD; }; Sprite_Destination.prototype.updateAnimation = function() { this._frameCount++; this._frameCount %= 20; this.opacity = (20 - this._frameCount) * 6; this.scale.x = (1 + this._frameCount / 20) * 4; this.scale.y = this.scale.x; }; } if (parseInt(parameters['skipWindow_CommandFirstCreateContents'])) { /** * Window_Command の初回の createContents は必ず無駄になるのでスキップ */ var _Window_Command_createContents = Window_Command.prototype.createContents; Window_Command.prototype.createContents = function() { // this.contents = new Bitmap(this.contentsWidth(), this.contentsHeight()); // this.resetFontSettings(); }; Window_Command.prototype.refresh = function() { this.clearCommandList(); this.makeCommandList(); _Window_Command_createContents.call(this); Window_Selectable.prototype.refresh.call(this); }; } if (parseInt(parameters['useDefaultTextColor'])) { /** * テキストカラーを定義しておくことで、pixel を調べずにテキストカラーを取得する * @param {[type]} n [description] * @return {[type]} [description] */ Window_Base.prototype.textColor = function(n) { switch (n) { case 0: return '#ffffff'; case 1: return '#20a0d6'; case 2: return '#ff784c'; case 3: return '#66cc40'; case 4: return '#99ccff'; case 5: return '#ccc0ff'; case 6: return '#ffffa0'; case 7: return '#808080'; case 8: return '#c0c0c0'; case 9: return '#2080cc'; case 10: return '#ff3810'; case 11: return '#00a010'; case 12: return '#3e9ade'; case 13: return '#a098ff'; case 14: return '#ffcc20'; case 15: return '#000000'; case 16: return '#84aaff'; case 17: return '#ffff40'; case 18: return '#ff2020'; case 19: return '#202040'; case 20: return '#e08040'; case 21: return '#f0c040'; case 22: return '#4080c0'; case 23: return '#40c0f0'; case 24: return '#80ff80'; case 25: return '#c08080'; case 26: return '#8080ff'; case 27: return '#ff80ff'; case 28: return '#00a040'; case 29: return '#00e060'; case 30: return '#a060e0'; case 31: return '#c080ff'; } return '#000000'; }; } if (parseInt(parameters['reduceLoadingGlobalInfo'])) { /** * タイトル、セーブ画面、ロード画面で loadingGlobalInfo が何度も走るので減らす */ var _Scene_File_initialize = Scene_File.prototype.initialize; Scene_File.prototype.initialize = function() { this._globalInfo = DataManager.loadGlobalInfo(); _Scene_File_initialize.call(this); }; Scene_File.prototype.create = function() { Scene_MenuBase.prototype.create.call(this); DataManager.loadAllSavefileImages(this._globalInfo); this.createHelpWindow(); this.createListWindow(); }; Scene_Load.prototype.firstSavefileIndex = function() { return DataManager.latestSavefileId(this._globalInfo) - 1; }; var _Window_SavefileList_initialize = Window_SavefileList.prototype.initialize; Window_SavefileList.prototype.initialize = function(x, y, width, height) { this._globalInfo = DataManager.loadGlobalInfo(); _Window_SavefileList_initialize.call(this, x, y, width, height); }; Window_SavefileList.prototype.drawItem = function(index) { var id = index + 1; var valid = DataManager.isThisGameFileInfo(this._globalInfo[id]); var info = this._globalInfo[id] ? this._globalInfo[id] : null; var rect = this.itemRectForText(index); this.resetTextColor(); if (this._mode === 'load') { this.changePaintOpacity(valid); } this.drawFileId(id, rect.x, rect.y); if (info) { this.changePaintOpacity(valid); this.drawContents(info, rect, valid); this.changePaintOpacity(true); } }; DataManager.loadAllSavefileImages = function(globalInfo) { if (! globalInfo) { globalInfo = this.loadGlobalInfo(); } if (globalInfo) { for (var i = 1; i < globalInfo.length; i++) { var info = globalInfo[i]; if (this.isThisGameFileInfo(info)) { this.loadSavefileImages(info); } } } }; DataManager.isThisGameFileInfo = function(savefile) { if (! savefile) { return false; } if (StorageManager.isLocalMode()) { return true; } return (savefile.globalId === this._globalId && savefile.title === $dataSystem.gameTitle); }; DataManager.isAnySavefileExists = function(globalInfo) { if (! globalInfo) { globalInfo = this.loadGlobalInfo(); } if (globalInfo) { for (var i = 1; i < globalInfo.length; i++) { var info = globalInfo[i]; if (this.isThisGameFileInfo(info)) { return true; } } } return false; }; DataManager.latestSavefileId = function(globalInfo) { if (! globalInfo) { globalInfo = this.loadGlobalInfo(); } var savefileId = 1; var timestamp = 0; if (globalInfo) { for (var i = 1; i < globalInfo.length; i++) { var info = globalInfo[i]; if (this.isThisGameFileInfo(info) && info.timestamp > timestamp) { timestamp = info.timestamp; savefileId = i; } } } return savefileId; }; Window_TitleCommand.prototype.isContinueEnabled = function() { if (! this._globalInfo) { this._globalInfo = DataManager.loadGlobalInfo(); } return DataManager.isAnySavefileExists(this._globalInfo); }; } if (parseInt(parameters['notLoadingVolumeZeroAudio'])) { var _AudioManager_playSe = AudioManager.playSe; AudioManager.playSe = function(se) { if (this._seVolume <= 0) { return; } _AudioManager_playSe.call(this, se); }; var _AudioManager_playStaticSe = AudioManager.playStaticSe; AudioManager.playStaticSe = function(se) { if (this._seVolume <= 0) { return; } _AudioManager_playStaticSe.call(this, se); }; var _AudioManager_playMe2 = AudioManager.playMe; AudioManager.playMe = function(me, isCache) { if (this._meVolume <= 0) { return; } _AudioManager_playMe2.call(this, me, isCache); }; var _AudioManager_playBgs = AudioManager.playBgs; AudioManager.playBgs = function(bgs, pos) { if (this._bgsVolume <= 0) { this.stopBgs(); return; } _AudioManager_playBgs.call(this, bgs, pos); }; var _AudioManager_playBgm = AudioManager.playBgm; AudioManager.playBgm = function(bgm, pos) { if (this._bgmVolume <= 0) { this._lastVolumeZeroBgm = bgm; return; } _AudioManager_playBgm.call(this, bgm, pos); }; var _AudioManager_stopBgm = AudioManager.stopBgm; AudioManager.stopBgm = function() { this._lastVolumeZeroBgm = null; _AudioManager_stopBgm.call(this); }; Object.defineProperty(AudioManager, 'bgmVolume', { set: function(value) { if (this._bgmVolume <= 0 && value > 0 && this._lastVolumeZeroBgm) { this._bgmVolume = value; this.playBgm(this._lastVolumeZeroBgm, 0); this._lastVolumeZeroBgm = null; } else { this._bgmVolume = value; this.updateBgmParameters(this._currentBgm); } }, configurable: true }); } if (parseInt(parameters['usePixiByWindow_BattleLogBg'])) { Window_BattleLog.prototype.createBackBitmap = function() { }; Window_BattleLog.prototype.createBackSprite = function() { this._backSprite = new Sprite(); this._backSprite.y = this.y; this.addChildToBack(this._backSprite); }; Window_BattleLog.prototype.drawBackground = function() { var rect = this.backRect(); var color = this.backColor(); var graphics = new PIXI.Graphics(); graphics.beginFill(Saba.toPixiColor(color), this.backPaintOpacity() / 255/0); graphics.drawRect(rect.x, rect.y, rect.width, rect.height); graphics.endFill(); this._backSprite.addChild(graphics); }; } var _Sprite_refresh = Sprite.prototype._refresh; Sprite.prototype._refresh = function() { if (! this.texture) { return; } _Sprite_refresh.call(this); }; })(Saba || (Saba = {}));