Ticket #2395: colorFadeImprovements_v2.patch
File colorFadeImprovements_v2.patch, 11.7 KB (added by , 10 years ago) |
---|
-
binaries/data/mods/public/gui/common/colorFades.js
1 1 /* 2 DESCRIPTION : Some functions to make colo ur fades on GUI elements (f.e. used for hero and group icons)2 DESCRIPTION : Some functions to make color fades on GUI elements (f.e. used for hero and group icons) 3 3 NOTES : 4 4 */ 5 5 6 // Used for storing object names of running color fades in order to stop them, if the fade is restarted before the old ended 7 var g_colorFade = {}; 8 g_colorFade["id"] = {}; 9 g_colorFade["tick"] = {}; 6 // Used for storing information about color fades 7 var g_colorFade = {}; 10 8 11 9 /** 12 * starts fading a colour of a GUI object using the sprite argument 13 * name: name of the object which colour should be faded 14 * changeInterval: interval in ms when the next colour change should be made 15 * duration: maximal duration of the complete fade 16 * colour: RGB + opacity object with keys r,g,b and o 10 * returns the init RGB color setting 11 */ 12 function getInitColorFadeRGB() 13 { 14 var rgb = {"r": 0, "g": 0, "b": 0, "o": 100}; 15 return rgb; 16 } 17 18 /** 19 * starts fading a color of a GUI object using the sprite argument 20 * name: name of the object which color should be faded 21 * tickInterval: interval in ms when the next color change should be made 22 * duration: maximal duration of the complete fade (if 0 it runs until it is stopped) 17 23 * fun_colorTransform: function which transform the colors; 18 * arguments: [colour object, tickCounter] 24 * arguments: [var data] 25 * restartAble [optional: if false, the fade can not be restarted; default: true 19 26 * fun_smoothRestart [optional]: a function, which returns a smooth tick counter, if the fade should be started; 20 * arguments: [tickCounter of current fade; not smaller than 1 or it restarts at 0] returns: smooth tick counter value 21 * tickCounter [optional]: should not be set by hand! - how often the function was called recursively 27 * arguments: [var data]; must return false, if smooth restart was not possible and true, if it was ok 22 28 */ 23 function fadeColour(name, changeInterval, duration, colour, fun_colorTransform, fun_smoothRestart, tickCounter)29 function startColorFade(name, tickInterval, duration, fun_colorTransform, restartAble, fun_smoothRestart) 24 30 { 25 31 // get the overlay 26 32 var overlay = Engine.GetGUIObjectByName(name); … … 28 34 return; 29 35 30 36 // check, if fade overlay was started just now 31 if (! tickCounter)37 if (!isColorFadeRunning(name)) 32 38 { 33 tickCounter = 1;34 39 overlay.hidden = false; 35 36 // check, if another animation is running and restart it, if it's the case 37 if (isColourFadeRunning(name)) 38 { 39 restartColourFade(name, changeInterval, duration, colour, fun_colorTransform, fun_smoothRestart, g_colorFade.tick[name]); 40 return; 41 } 40 // store the values into a var to make it more flexible (can be changed from every function) 41 var data = { "timerId": -1, 42 "tickInterval": tickInterval, 43 "duration": duration, 44 "fun_colorTransform": fun_colorTransform, 45 "restartAble": restartAble || restartAble === undefined, //TODO: add default parameter when it is supported (spiderMonkey upgrade #1886) 46 "fun_smoothRestart": fun_smoothRestart, 47 "tickCounter": 0, 48 "justStopAtExternCall": duration == 0, 49 "stopFade": false, 50 "rgb": getInitColorFadeRGB() 51 }; 52 // store it! 53 g_colorFade[name] = data; 54 55 // start with fading 56 fadeColorTick(name); 42 57 } 58 else if (restartAble) 59 { 60 restartColorFade(name, tickInterval, duration, fun_colorTransform, restartAble, fun_smoothRestart); 61 return; 62 } 63 } 64 65 /** 66 * makes the color changes in a tick 67 * name: name of the object which color should be faded 68 */ 69 function fadeColorTick(name) 70 { 71 // make some checks 72 if (!isColorFadeRunning(name)) 73 return; 74 75 var overlay = Engine.GetGUIObjectByName(name); 76 if (!overlay) 77 return; 78 var data = g_colorFade[name]; 79 80 // change the color 81 data.fun_colorTransform(data); 43 82 44 // get colors 45 fun_colorTransform(colour, tickCounter); 46 47 // set new colour 48 overlay.sprite="colour: "+colour.r+" "+colour.g+" "+colour.b+" "+colour.o; 83 // set new color 84 var rgb = data.rgb; 85 overlay.sprite="colour: " + rgb.r + " " + rgb.g + " " + rgb.b + " " + rgb.o; 49 86 50 87 // recusive call, if duration is positive 51 duration-= changeInterval; 52 if (duration > 0 && colour.o > 0) 88 if (!data.stopFade && (data.justStopAtExternCall || data.duration - (data.tickInterval * data.tickCounter) > 0)) 53 89 { 54 var id = setTimeout(function() { fadeColo ur(name, changeInterval, duration, colour, fun_colorTransform, fun_smoothRestart, ++tickCounter); }, changeInterval);55 g_colorFade.id[name]= id;56 g_colorFade.tick[name] = tickCounter;90 var id = setTimeout(function() { fadeColorTick(name); }, data.tickInterval); 91 data.timerId = id; 92 data.tickCounter++; 57 93 } 58 94 else 59 95 { 60 96 overlay.hidden = true; 61 stopColo urFade(name);97 stopColorFade(name); 62 98 } 63 99 } 64 100 65 66 101 /** 67 * checks, if a colo ur fade on that object is running68 * name: name of the object which colo ur fade should be checked102 * checks, if a color fade on that object is running 103 * name: name of the object which color fade should be checked 69 104 * return: true a running fade was found 70 105 */ 71 function isColo urFadeRunning(name)106 function isColorFadeRunning(name) 72 107 { 73 return name in g_colorFade .id;108 return name in g_colorFade; 74 109 } 75 110 76 111 /** 77 * stops fading a colo ur78 * name: name of the object which colo ur fade should be stopped79 * hideOverlay : hides the overlay, if true112 * stops fading a color 113 * name: name of the object which color fade should be stopped 114 * hideOverlay [optional]: hides the overlay, if true [default: true] 80 115 * return: true a running fade was stopped 81 116 */ 82 function stopColo urFade(name, hideOverlay)117 function stopColorFade(name, hideOverlay) 83 118 { 84 // check, if a colo ur fade is running85 if (!isColo urFadeRunning(name))119 // check, if a color fade is running 120 if (!isColorFadeRunning(name)) 86 121 return false; 87 122 88 123 // delete the timer 89 clearTimeout(g_colorFade.id[name]); 90 delete g_colorFade.id[name]; 91 delete g_colorFade.tick[name]; 92 124 clearTimeout(g_colorFade[name].timerId); 125 delete g_colorFade[name]; 126 93 127 // get the overlay and hide it 94 if (hideOverlay )128 if (hideOverlay || hideOverlay === undefined) //TODO: add default parameter when it is supported (spiderMonkey upgrade #1886) 95 129 { 96 130 var overlay = Engine.GetGUIObjectByName(name); 97 if (overlay)131 if (overlay) 98 132 overlay.hidden = true; 99 133 } 100 134 return true; … … 101 135 } 102 136 103 137 /** 104 * restarts a colo ur fade105 * see paramter in fadeColourfunction138 * restarts a color fade 139 * see paramter in startColorFade function 106 140 */ 107 function restartColo urFade(name, changeInterval, duration, colour, fun_colorTransform, fun_smoothRestart, tickCounter)141 function restartColorFade(name) 108 142 { 109 // check, if a colo ur fade is running110 if (!isColo urFadeRunning(name))143 // check, if a color fade is running 144 if (!isColorFadeRunning(name)) 111 145 return false; 112 146 147 var data = g_colorFade[name]; 113 148 // check, if fade can be restarted smoothly 114 if ( fun_smoothRestart)149 if (data.fun_smoothRestart) 115 150 { 116 tickCounter = fun_smoothRestart(colour, tickCounter); 117 // set new function to existing timer 118 var fun = function() { fadeColour(name, changeInterval, duration, colour, fun_colorTransform, fun_smoothRestart, tickCounter); }; 119 setNewTimerFunction(g_colorFade.id[name], fun); 151 // if call was too late 152 if (!data.fun_smoothRestart(data)) 153 { 154 data.rgb = getInitColorFadeRGB(); // set RGB start values 155 data.tickCounter = 0; 156 } 120 157 } 121 158 // stop it and restart it 122 159 else 123 160 { 124 stopColo urFade(name, true);125 fadeColour(name, changeInterval, duration, colour, fun_colorTransform);161 stopColorFade(name, false); 162 startColorFade(name, data.changeInterval, data.duration, data.fun_colorTransform, data.restartAble, data.fun_smoothRestart); 126 163 } 127 164 return true; 128 165 } … … 133 170 134 171 var g_fadeAttackUnit = {}; 135 172 g_fadeAttackUnit.blinkingTicks = 50; // how many ticks should first blinking phase be 136 g_fadeAttackUnit.blinkingChangeInterval = 5; // how often should the colo ur be changed during the blinking phase137 g_fadeAttackUnit.gb ColourChangeRate = 3; // how fast should blue and green part of the colour change173 g_fadeAttackUnit.blinkingChangeInterval = 5; // how often should the color be changed during the blinking phase 174 g_fadeAttackUnit.gbcolorChangeRate = 3; // how fast should blue and green part of the color change 138 175 g_fadeAttackUnit.fadeOutStart = 100; // when should the fade out start using the opacity 139 176 g_fadeAttackUnit.opacityChangeRate = 3; // how fast should opacity change 140 177 141 /** 142 * rgb: colour object with keys r,g,b and o 143 * tickCounter: how often the fade was executed 144 */ 145 function colourFade_attackUnit(rgb, tickCounter) 178 function colorFade_attackUnit(data) 146 179 { 180 var rgb = data.rgb; 181 182 // init color 183 if (data.tickCounter == 0) 184 rgb.r = 175; 147 185 // blinking 148 if ( tickCounter < g_fadeAttackUnit.blinkingTicks)186 if (data.tickCounter < g_fadeAttackUnit.blinkingTicks) 149 187 { 150 188 // slow that process down 151 if ( tickCounter % g_fadeAttackUnit.blinkingChangeInterval != 0)189 if (data.tickCounter % g_fadeAttackUnit.blinkingChangeInterval != 0) 152 190 return; 153 191 154 rgb.g = rgb.g == 0 ? 255 : rgb.g = 0; 155 rgb.b = rgb.b == 0 ? 255 : rgb.b = 0; 192 rgb.g = rgb.g == 0 ? 255 : 0; 156 193 } 157 // wait a short time and then colo ur fade from red to grey to nothing158 else if ( tickCounter >= g_fadeAttackUnit.blinkingTicks + g_fadeAttackUnit.blinkingChangeInterval)194 // wait a short time and then color fade from red to grey to nothing 195 else if ( data.tickCounter >= g_fadeAttackUnit.blinkingTicks + g_fadeAttackUnit.blinkingChangeInterval) 159 196 { 160 rgb.g = rgb.g < 255 ? rgb.g += g_fadeAttackUnit.gbColourChangeRate * Math.sqrt(tickCounter - g_fadeAttackUnit.blinkingTicks) : 255; 161 rgb.b = rgb.g; 197 rgb.g = rgb.g < 255 ? rgb.g += g_fadeAttackUnit.gbcolorChangeRate * Math.sqrt(data.tickCounter - g_fadeAttackUnit.blinkingTicks) : 255; 162 198 163 199 // start with fading it out 164 200 if (rgb.g > g_fadeAttackUnit.fadeOutStart) 165 201 rgb.o = rgb.o > g_fadeAttackUnit.opacityChangeRate ? rgb.o -= g_fadeAttackUnit.opacityChangeRate : 0; 202 // check for end 203 if (rgb.o == 0) 204 data.stopFade = true; 166 205 } 206 rgb.b = rgb.g; 167 207 } 168 208 169 /** 170 * makes a smooth fade, if the attack on the unit has not stopped yet 171 * rgb: colour object with keys r,g,b and o 172 * tickCounter: how often the fade was executed 173 */ 174 function smoothColourFadeRestart_attackUnit(rgb, tickCounter) 209 function smoothColorFadeRestart_attackUnit(data) 175 210 { 176 211 // check, if in blinking phase 177 if ( tickCounter < g_fadeAttackUnit.blinkingTicks)212 if (data.tickCounter < g_fadeAttackUnit.blinkingTicks) 178 213 { 179 // get rgb to current state 180 for (var i = 1; i <= tickCounter; i++) 181 colourFade_attackUnit(rgb, i); 182 // set the tick counter back to start 183 return (tickCounter % (g_fadeAttackUnit.blinkingChangeInterval * 2)) + 1; 214 data.tickCounter = data.tickCounter % (g_fadeAttackUnit.blinkingChangeInterval * 2); 215 return true; 184 216 } 185 return 1;217 return false; 186 218 } 187 219 188 220 //[END] of hero fade functions 221 No newline at end of file -
binaries/data/mods/public/gui/session/session.js
595 595 { 596 596 g_previousHeroHitPoints = heroState.hitpoints; 597 597 // trigger the animation 598 fadeColour("heroHitOverlay", 100, 10000, {"r": 175,"g": 0,"b": 0,"o": 100}, colourFade_attackUnit, smoothColourFadeRestart_attackUnit);598 startColorFade("heroHitOverlay", 100, 0, colorFade_attackUnit, true, smoothColorFadeRestart_attackUnit); 599 599 return; 600 600 } 601 601 }