//============================================================================= // MessageTextAnimation.js //============================================================================= // Copyright (c) 2017 Thirop // Released under the MIT license // http://opensource.org/licenses/mit-license.php //============================================================================= /*: * @plugindesc メッセージの文字に動きをつける演出 * @author シロップ * @help * QueueAnimation.jsの導入が必須です。 * このプラグインより上に配置して下さい。 * * <使い方> * イベントコマンドの「文章の表示」中に、 * 制御文字 \E[演出ID] で演出のON/OFF、種類を切り替えます。 * また、ページが変わると演出はOFFになります。 * * ◆演出ID * 0 : 演出なし * 1 : 強調 * 2 : ゆれる * 3 : ゆれる(強) * 4 : フェードイン * 5 : フェードアウト * 6 : フェードインアウト * 7 : 歪み * * ◆使用例 * この文章は、\E[1]ここから強調エフェクトで、\E[0]ここから元に戻ります。 */ //============================================================================= var Imported = Imported || {}; Imported.MessageTextAnimation = true; (function(){ var parameters = PluginManager.parameters('CWindow_MessageAnimation'); Window_Message.ANIMATION_TYPE = { NONE : 0, ENSIZE : 1, ROCK : 2, ROCK_STRONG : 3, FADE_IN : 4, FADE_OUT : 5, FADE : 6, DISTORT : 7 }; var _Window_Message_initMembers_ = Window_Message.prototype.initMembers; Window_Message.prototype.initMembers = function(){ _Window_Message_initMembers_.call(this); this._animationType = Window_Message.ANIMATION_TYPE.NONE; this._animationCharacterSprites = []; }; var _Window_Message_processEscapeCharacter_ = Window_Message.prototype.processEscapeCharacter; Window_Message.prototype.processEscapeCharacter = function(code, textState) { if(code === 'E'){ this._animationType = this.obtainEscapeParam(textState); }else{ _Window_Message_processEscapeCharacter_.call(this,code,textState); } }; var _Window_Message_newPage_ = Window_Message.prototype.newPage; Window_Message.prototype.newPage = function(textState) { _Window_Message_newPage_.call(this,textState); this._animationType = Window_Message.ANIMATION_TYPE.NONE; this._animationCharacterSprites.forEach(function(sprite){ this._windowContentsSprite.removeChild(sprite); sprite = null; }.bind(this)); this._animationCharacterSprites = []; }; Window_Message.prototype.processNormalCharacter = function(textState) { var c = textState.text[textState.index++]; var w = this.textWidth(c); if(this._animationType === Window_Message.ANIMATION_TYPE.NONE || this.isTriggered()){ this.contents.drawText(c, textState.x, textState.y, w * 2, textState.height); }else{ this.processAnimationCharacter(c,w, textState, this._animationType); } textState.x += w; }; Window_Message.prototype.processAnimationCharacter = function(character,width,textState,type){ var height = textState.height; var margin = 4; var bitmap = new Bitmap(width+2*margin,height); bitmap.fontFace = this.contents.fontFace; bitmap.fontSize = this.contents.fontSize; bitmap.textColor = this.contents.textColor; bitmap.drawText(character,margin,0,width,height,'center'); var sprite = this.animationCharacterSprite(bitmap,textState,width,height); var wait = 0; var smooth = false; var frame = 1; var marginWait; if(type === Window_Message.ANIMATION_TYPE.ENSIZE){ sprite.scale.x = 0; sprite.scale.y = 0; sprite.addAnimation(new QueueAnimationScale(6,1.5,1.5)); sprite.addAnimation(new QueueAnimationScale(6,1,1)); wait = 4; }else if(type === Window_Message.ANIMATION_TYPE.ROCK){ sprite.addAnimation(new QueueAnimationVibrate()); smooth = true; wait = 3; }else if(type === Window_Message.ANIMATION_TYPE.ROCK_STRONG){ sprite.addAnimation(new QueueAnimationVibrate(6,1,4)); smooth = true; wait = 4; }else if(type === Window_Message.ANIMATION_TYPE.FADE_IN){ sprite.opacity = 0; marginWait = 80; frame = 40; sprite.addAnimation(new QueueAnimationOpacity(frame,255)); wait = 6; }else if(type === Window_Message.ANIMATION_TYPE.FADE_OUT){ marginWait = 80; frame = 40; sprite.addAnimation(new QueueAnimationWait(marginWait)); sprite.addAnimation(new QueueAnimationOpacity(frame,0)); wait = 6; }else if(type === Window_Message.ANIMATION_TYPE.FADE){ sprite.opacity = 0; marginWait = 80; frame = 40; sprite.addAnimation(new QueueAnimationOpacity(frame,255)); sprite.addAnimation(new QueueAnimationWait(marginWait)); sprite.addAnimation(new QueueAnimationOpacity(frame,0)); wait = 6; }else if(type === Window_Message.ANIMATION_TYPE.DISTORT){ frame = 5; marginWait = 44; var dx = 4; var dy = 0; var animations = [ new QueueAnimationWait(marginWait/2), new QueueAnimationSet([ new QueueAnimationMove(frame,dx,dy), new QueueAnimationOpacity(frame,180) ]), new QueueAnimationSet([ new QueueAnimationMove(frame,-dx,-dy), new QueueAnimationOpacity(frame,250) ]), new QueueAnimationWait(marginWait/2), new QueueAnimationSet([ new QueueAnimationMove(frame,dx,dy), new QueueAnimationOpacity(frame,180) ]), new QueueAnimationWait(marginWait), new QueueAnimationSet([ new QueueAnimationMove(frame,-dx,-dy), new QueueAnimationOpacity(frame,255) ]), new QueueAnimationWait(marginWait/2) ]; sprite.addAnimation(new QueueAnimationSequence(animations,true)); dx *= -1; dy *= -1; var secondSprite = this.animationCharacterSprite(bitmap,textState,width,height); animations = [ new QueueAnimationWait(marginWait/2), new QueueAnimationSet([ new QueueAnimationMove(frame,dx,dy), new QueueAnimationOpacity(frame,180) ]), new QueueAnimationSet([ new QueueAnimationMove(frame,-dx,-dy), new QueueAnimationOpacity(frame,250) ]), new QueueAnimationWait(marginWait/2), new QueueAnimationSet([ new QueueAnimationMove(frame,dx,dy), new QueueAnimationOpacity(frame,180) ]), new QueueAnimationWait(marginWait), new QueueAnimationSet([ new QueueAnimationMove(frame,-dx,-dy), new QueueAnimationOpacity(frame,255) ]), new QueueAnimationWait(marginWait/2) ]; secondSprite.addAnimation(new QueueAnimationSequence(animations,true)); wait = 0; } bitmap.smooth = smooth; if(wait){ if(this._showFast){ wait = Math.floor(wait/2); } this.startWait(wait); } }; Window_Message.prototype.animationCharacterSprite = function(bitmap,textState,width,height){ var sprite = new Sprite(bitmap); this._windowContentsSprite.addChild(sprite); this._animationCharacterSprites.push(sprite); sprite.anchor.x = 0.5; sprite.anchor.y = 0.5; sprite.x = Math.floor(textState.x + width/2); sprite.y = Math.floor(textState.y + height/2); return sprite; }; })();