You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ycrpg/js/plugins/SF_LoadingScene.js

508 lines
18 KiB
JavaScript

3 years ago
//=============================================================================
// SaltedFish Plugins - Loading Scene
// SF_LoadingScene.js
//=============================================================================
"use strict";
var Imported = Imported || {};
Imported.SF_LoadingScene = true;
var SF_Plugins = SF_Plugins || {};
//=============================================================================
/*~struct~tip:
* @param tips
* @desc random show when loading
* @type text[]
* @default []
*
* @param initialize
* @text initialize function
* @desc run this only once time when game started
* @type note
* @default ""
*
* @param create
* @text create function
* @desc run this once when start loading
* @type note
* @default ""
*
* @param update
* @text update function
* @desc run this each frame when in loading.
* so you can use this to make animation
* @type note
* @default ""
*
* @param terminate
* @text terminate function
* @desc run this when removed
* @type note
* @default ""
*
* @param canExit
* @text can Exit function
* @desc call this each update after new scene loaded
* @type note
* @default "return true;"
*
*/
/*~struct~picture:
*
* @param pictures
* @desc loop as gif files
* @type file[]
* @default []
*
* @param initialize
* @text initilize function
* @desc run this only once time when game started
* @type note
* @default ""
*
*
* @param create
* @text create function
* @desc run this once when start loading
* @type note
* @default ""
*
* @param update
* @text update function
* @desc run this each frame when in loading.
* so you can use this to make animation
* @type note
* @default ""
*
* @param terminate
* @text terminate function
* @desc run this when removed
* @type note
* @default ""
*
* @param canExit
* @text can Exit function
* @desc call this in each update after new scene loaded
* @type note
* @default "return true;"
*
*/
/*:
* @plugindesc Show Loading when loading
* @author SaltedFish
*
* @help
*
* ============================================================================
* Introduction
* ============================================================================
*
* require SF_InputBindControl.js and SF_SkipLoadError.js
* loop these pictures as gif on loading game resource
*
* ============================================================================
* Changelog
* ============================================================================
*
* v1.0 - initial release
*
* ============================================================================
* End of Helpfile
* ============================================================================
*
*
* @param loading picture
* @desc SHow when loading
* @type struct<picture>[]
* @default []
*
* @param fade speed
* @desc the nunmber of speed that alpha(0~1) change per frame
* @type number
* @min 0
* @max 1
* @decimals 4
* @default 0.1000
*
* @param fading in
* @desc loading scene fading in or not
* @on enable
* @off disable
* @default true
* @type boolean
*
* @param fading out
* @desc loading scene fading out or not
* @on enable
* @off disable
* @default true
* @type boolean
*
* @param alpha min
* @desc Scene fade alpha minimum
* @type number
* @decimals 4
* @min 0
* @max 1
* @default 0.5000
*
* @param all tips
* @desc show tips when animation loops
* @type struct<tip>[]
*
* @param disabled fade scene
* @desc these scene may be not faded
* @type text[]
* @default ["Scene_Boot"]
*
*/
//=============================================================================
if (!Imported.SF_InputBindControl || !Imported.SF_SkipLoadError) {
console.error("SF_LoadingScene.js requires SF_InputBindControl.js and SF_SkipLoadError.js");
alert("SF_LoadingScene.js requires SF_InputBindControl.js and SF_SkipLoadError.js");
}
(function () {
var SF_LoadingScene = {};
SF_Plugins.SF_LoadingScene = SF_LoadingScene;
SF_LoadingScene.version = 1.0;
//=============================================================================
// Parameter
//=============================================================================
SF_LoadingScene.parameters = PluginManager.parameters('SF_LoadingScene');
SF_LoadingScene.fadeSpeed = Number(SF_LoadingScene.parameters['fade speed']) || 0.1;
SF_LoadingScene.needLoopSceneFadeIn = String(SF_LoadingScene.parameters['fade in']).toLowerCase() === "true";
SF_LoadingScene.needLoopSceneFadeOut = String(SF_LoadingScene.parameters['fade out']).toLowerCase() === "true";
SF_LoadingScene.alphaMin = Number(SF_LoadingScene.parameters['alpha min']);
SF_LoadingScene.loadingTips = JsonEx.parse(SF_LoadingScene.parameters['all tips'])
.map(function (tip) { return JsonEx.parse(tip); });
SF_LoadingScene.loadingPictures = JsonEx.parse(SF_LoadingScene.parameters['loading picture'])
.map(function (picture) { return JsonEx.parse(picture); });
SF_LoadingScene.disabledFadeScene = JsonEx.parse(SF_LoadingScene.parameters['disabled fade scene']);
// fading_out_old_scene
// fading_in_loading_scene
// loop_loading_scene
// fading_out_loading_scene
// fading_in_new_scene
SF_LoadingScene.upperCanvasStatues = null;
//=============================================================================
// LodadingScene_Text
//=============================================================================
function LoadingScene_Text() {
this.initialize.apply(this, arguments);
}
SF_LoadingScene.LoadingScene_Text = LoadingScene_Text;
LoadingScene_Text.prototype = Object.create(PIXI.Text.prototype);
LoadingScene_Text.prototype.constructor = LoadingScene_Text;
LoadingScene_Text.prototype.initialize = function (tip) {
PIXI.Text.call(this);
this.allTips = JsonEx.parse(tip.tips);
this.customFunc = {};
this.customFunc.initialize = (new Function("tip", JsonEx.parse(tip.initialize))).bind(this, this);
this.customFunc.create = (new Function("tip", JsonEx.parse(tip.create))).bind(this, this);
this.customFunc.update = (new Function("tip", JsonEx.parse(tip.update))).bind(this, this);
this.customFunc.terminate = (new Function("tip", JsonEx.parse(tip.terminate))).bind(this, this);
this.customFunc.canExit = (new Function("tip", JsonEx.parse(tip.canExit))).bind(this, this);
this.customFunc.initialize();
};
LoadingScene_Text.prototype.create = function () {
this.customFunc.create();
};
LoadingScene_Text.prototype.update = function () {
this.customFunc.update();
};
LoadingScene_Text.prototype.canExit = function () {
return this.customFunc.canExit();
};
LoadingScene_Text.prototype.terminate = function () {
this.customFunc.terminate();
};
//=============================================================================
// LoadingScene_Picture
//=============================================================================
function LoadingScene_Picture() {
this.initialize.apply(this, arguments);
}
LoadingScene_Picture.prototype = Object.create(Sprite.prototype);
LoadingScene_Picture.prototype.constructor = LoadingScene_Picture;
SF_LoadingScene.LoadingScene_Picture = LoadingScene_Picture;
LoadingScene_Picture.prototype.initialize = function (picture) {
Sprite.prototype.initialize.apply(this, null);
this.loopBitmaps = [];
JsonEx.parse(picture.pictures).forEach(function (fileName) {
this.loopBitmaps.push(Bitmap.load(fileName + '.png'));
}, this);
this.customFunc = {};
this.customFunc.initialize = (new Function("picture", JsonEx.parse(picture.initialize))).bind(this, this);
this.customFunc.create = (new Function("picture", JsonEx.parse(picture.create))).bind(this, this);
this.customFunc.update = (new Function("picture", JsonEx.parse(picture.update))).bind(this, this);
this.customFunc.terminate = (new Function("picture", JsonEx.parse(picture.terminate))).bind(this, this);
this.customFunc.canExit = (new Function("picture", JsonEx.parse(picture.canExit))).bind(this, this);
this.customFunc.initialize();
};
LoadingScene_Picture.prototype.create = function () {
this.customFunc.create();
};
LoadingScene_Picture.prototype.update = function () {
this.customFunc.update();
};
LoadingScene_Picture.prototype.fadingInEnded = function () {
};
LoadingScene_Picture.prototype.canExit = function () {
return this.customFunc.canExit();
};
LoadingScene_Picture.prototype.terminate = function () {
this.customFunc.terminate();
};
//=============================================================================
// Graphics
//=============================================================================
SF_LoadingScene.Graphics_setLoadingImage = Graphics.setLoadingImage;
Graphics.setLoadingImage = function (src) {
SF_LoadingScene.previousSceneSprite = new Sprite();
SF_LoadingScene.nextSceneSprite = new Sprite();
SF_LoadingScene.loadingScene = new PIXI.Container();
SF_LoadingScene.allLoadingPictures = new PIXI.Container();
SF_LoadingScene.loadingPictures.forEach(function (picture) {
this.allLoadingPictures.addChild(new LoadingScene_Picture(picture));
}, SF_LoadingScene);
SF_LoadingScene.allLoadingTips = new PIXI.Container();
SF_LoadingScene.loadingTips.forEach(function (tip) {
this.allLoadingTips.addChild(new LoadingScene_Text(tip));
}, SF_LoadingScene);
SF_LoadingScene.loadingScene.addChild(SF_LoadingScene.allLoadingPictures);
SF_LoadingScene.loadingScene.addChild(SF_LoadingScene.allLoadingTips);
SF_LoadingScene.pixiRender = new PIXI.autoDetectRenderer({
width: Graphics._width,
height: Graphics._height,
view: Graphics._upperCanvas,
transparent: true,
preserveDrawingBuffer: true,
clearBeforeRender: true
});
SF_LoadingScene.upperCanvasStatues = "";
SF_LoadingScene.animationFrameId = undefined;
SF_LoadingScene.globalAlpha = undefined;
SF_LoadingScene.totalCount = undefined;
return;
};
SF_LoadingScene.Graphics_startLoading = Graphics.startLoading;
Graphics.startLoading = function () {
if (!isNaN(SF_LoadingScene.animationFrameId) || SF_Plugins.SF_SkipLoadError.FileLoadingList.length == 0) return;
Graphics._canvas.style.opacity = 0;
Graphics._upperCanvas.style.opacity = 1;
if (SF_LoadingScene.disabledFadeScene.contains(SceneManager._scene.constructor.name)) {
if (SF_LoadingScene.needLoopSceneFadeIn) {
SF_LoadingScene.fadingIn = true;
SF_LoadingScene.fadingOut = false;
SF_LoadingScene.upperCanvasStatues = "fading_in_loading_scene";
SF_LoadingScene.globalAlpha = SF_LoadingScene.alphaMin;
} else {
SF_LoadingScene.fadingIn = false;
SF_LoadingScene.fadingOut = false;
SF_LoadingScene.upperCanvasStatues = "loop_loading_scene";
SF_LoadingScene.globalAlpha = 1;
}
} else {
SF_LoadingScene.fadingIn = false;
SF_LoadingScene.fadingOut = true;
SF_LoadingScene.upperCanvasStatues = "fading_out_old_scene";
SF_LoadingScene.globalAlpha = 1;
SF_LoadingScene.previousSceneSprite.bitmap = SceneManager.snap();
}
SF_LoadingScene.allLoadingPictures.children.forEach(function (picture) {
picture.create();
});
SF_LoadingScene.allLoadingTips.children.forEach(function (tip) {
tip.create();
});
SF_LoadingScene.totalCount = 0;
SF_LoadingScene.needContinue = true;
SF_LoadingScene.newSceneLoaded = false;
SF_LoadingScene.animationFrameId = window.requestAnimationFrame(SF_LoadingScene.animationOnUpperCanvas);
return;
};
SF_LoadingScene.animationOnUpperCanvas = function () {
SF_LoadingScene.totalCount++;
Graphics._clearUpperCanvas();
if (SF_LoadingScene.upperCanvasStatues == "fading_out_old_scene") {
SF_LoadingScene.previousSceneSprite.alpha = SF_LoadingScene.globalAlpha;
SF_LoadingScene.pixiRender.render(SF_LoadingScene.previousSceneSprite);
if (SF_LoadingScene.globalAlpha <= SF_LoadingScene.alphaMin) {
if (SF_LoadingScene.needLoopSceneFadeIn) {
SF_LoadingScene.upperCanvasStatues = 'fading_in_loading_scene';
SF_LoadingScene.fadingIn = true;
SF_LoadingScene.fadingOut = false;
} else {
SF_LoadingScene.upperCanvasStatues = 'loop_loading_scene';
SF_LoadingScene.fadingIn = false;
SF_LoadingScene.fadingOut = false;
SF_LoadingScene.globalAlpha = 1;
}
}
} else if (SF_LoadingScene.upperCanvasStatues == "fading_in_loading_scene") {
SF_LoadingScene.loadingScene.alpha = SF_LoadingScene.globalAlpha;
SF_LoadingScene.updateLoadingScene();
SF_LoadingScene.pixiRender.render(SF_LoadingScene.loadingScene);
if (SF_LoadingScene.globalAlpha >= 1) {
SF_LoadingScene.fadingIn = false;
SF_LoadingScene.fadingOut = false;
SF_LoadingScene.upperCanvasStatues = "loop_loading_scene";
}
} else if (SF_LoadingScene.upperCanvasStatues == "loop_loading_scene") {
SF_LoadingScene.loadingScene.alpha = SF_LoadingScene.globalAlpha;
SF_LoadingScene.updateLoadingScene();
SF_LoadingScene.pixiRender.render(SF_LoadingScene.loadingScene);
if (SF_LoadingScene.canExitLoadingScene()) {
if (SF_LoadingScene.needLoopSceneFadeOut) {
SF_LoadingScene.fadingOut = true;
SF_LoadingScene.fadingIn = false;
SF_LoadingScene.upperCanvasStatues = "fading_out_loading_scene";
} else if (!SF_LoadingScene.disabledFadeScene.contains(SceneManager._scene.constructor.name)) {
SF_LoadingScene.fadingOut = false;
SF_LoadingScene.fadingIn = true;
SF_LoadingScene.globalAlpha = SF_LoadingScene.alphaMin;
SF_LoadingScene.upperCanvasStatues = "fading_in_new_scene";
} else {
SF_LoadingScene.needContinue = false;
}
}
} else if (SF_LoadingScene.upperCanvasStatues == "fading_out_loading_scene") {
SF_LoadingScene.loadingScene.alpha = SF_LoadingScene.globalAlpha;
SF_LoadingScene.updateLoadingScene();
SF_LoadingScene.pixiRender.render(SF_LoadingScene.loadingScene);
if (SF_LoadingScene.globalAlpha <= SF_LoadingScene.alphaMin) {
if (!SF_LoadingScene.disabledFadeScene.contains(SceneManager._scene.constructor.name)) {
SF_LoadingScene.fadingOut = false;
SF_LoadingScene.fadingIn = true;
SF_LoadingScene.globalAlpha = SF_LoadingScene.alphaMin;
SF_LoadingScene.upperCanvasStatues = "fading_in_new_scene";
} else {
SF_LoadingScene.needContinue = false;
}
}
} else if (SF_LoadingScene.upperCanvasStatues == "fading_in_new_scene") {
SF_LoadingScene.nextSceneSprite.alpha = SF_LoadingScene.globalAlpha;
SF_LoadingScene.pixiRender.render(SF_LoadingScene.nextSceneSprite);
if (SF_LoadingScene.globalAlpha >= 1) {
SF_LoadingScene.needContinue = false;
}
} else {
throw new SyntaxError('some error happen in SF_LoadingScene plugins');
}
SF_LoadingScene.updateUpperCanvasAlpha();
if (SF_LoadingScene.needContinue) {
SF_LoadingScene.animationFrameId = requestAnimationFrame(SF_LoadingScene.animationOnUpperCanvas);
} else {
SF_LoadingScene.endLoading();
}
};
SF_LoadingScene.endLoading = function () {
Graphics._clearUpperCanvas();
SF_LoadingScene.terminateLoadingScene();
Graphics._upperCanvas.style.opacity = 0;
Graphics._canvas.style.opacity = 1;
SF_LoadingScene.animationFrameId = undefined;
SceneManager.resume();
};
SF_LoadingScene.updateLoadingScene = function () {
SF_LoadingScene.loadingScene.children.forEach(function (child) {
child.children.forEach(function (child) {
child.update();
});
});
};
SF_LoadingScene.canExitLoadingScene = function () {
return SF_LoadingScene.newSceneLoaded && SF_LoadingScene.loadingScene.children.every(function (child) {
return child.children.every(function (child) {
return child.canExit();
});
});
};
SF_LoadingScene.terminateLoadingScene = function () {
SF_LoadingScene.loadingScene.children.forEach(function (child) {
child.children.forEach(function (child) {
child.terminate();
});
});
};
SF_LoadingScene.updateUpperCanvasAlpha = function () {
if (SF_LoadingScene.fadingIn) {
SF_LoadingScene.globalAlpha = (SF_LoadingScene.globalAlpha + SF_LoadingScene.fadeSpeed).clamp(0, 1);
} else if (SF_LoadingScene.fadingOut) {
SF_LoadingScene.globalAlpha = (SF_LoadingScene.globalAlpha - SF_LoadingScene.fadeSpeed).clamp(0, 1);
}
};
SF_LoadingScene.Graphics_endLoading = Graphics.endLoading;
Graphics.endLoading = function () {
if (SceneManager._nextScene || isNaN(SF_LoadingScene.animationFrameId)) return;
if (!SF_LoadingScene.disabledFadeScene.contains(SceneManager._scene.constructor.name))
SF_LoadingScene.nextSceneSprite.bitmap = SceneManager.snap();
SF_LoadingScene.newSceneLoaded = true;
SceneManager.stop();
};
SF_LoadingScene.Graphics_updateLoading = Graphics.updateLoading;
Graphics.updateLoading = function () { };
SF_LoadingScene.Graphics_clearUpperCanvas = Graphics._clearUpperCanvas;
Graphics._clearUpperCanvas = function () {
if (SF_LoadingScene.pixiRender) {
SF_LoadingScene.pixiRender.clear();
} else {
SF_LoadingScene.Graphics_clearUpperCanvas.apply(this, arguments);
}
};
})();