diff options
Diffstat (limited to 'libs/cocos2d/CCActionEase.m')
-rwxr-xr-x | libs/cocos2d/CCActionEase.m | 534 |
1 files changed, 534 insertions, 0 deletions
diff --git a/libs/cocos2d/CCActionEase.m b/libs/cocos2d/CCActionEase.m new file mode 100755 index 0000000..f28be11 --- /dev/null +++ b/libs/cocos2d/CCActionEase.m | |||
@@ -0,0 +1,534 @@ | |||
1 | /* | ||
2 | * cocos2d for iPhone: http://www.cocos2d-iphone.org | ||
3 | * | ||
4 | * Copyright (c) 2008-2009 Jason Booth | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
7 | * of this software and associated documentation files (the "Software"), to deal | ||
8 | * in the Software without restriction, including without limitation the rights | ||
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
10 | * copies of the Software, and to permit persons to whom the Software is | ||
11 | * furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
22 | * THE SOFTWARE. | ||
23 | * | ||
24 | */ | ||
25 | |||
26 | |||
27 | /* | ||
28 | * Elastic, Back and Bounce actions based on code from: | ||
29 | * http://github.com/NikhilK/silverlightfx/ | ||
30 | * | ||
31 | * by http://github.com/NikhilK | ||
32 | */ | ||
33 | |||
34 | #import "CCActionEase.h" | ||
35 | |||
36 | #ifndef M_PI_X_2 | ||
37 | #define M_PI_X_2 (float)M_PI * 2.0f | ||
38 | #endif | ||
39 | |||
40 | #pragma mark EaseAction | ||
41 | |||
42 | // | ||
43 | // EaseAction | ||
44 | // | ||
45 | @implementation CCActionEase | ||
46 | |||
47 | +(id) actionWithAction: (CCActionInterval*) action | ||
48 | { | ||
49 | return [[[self alloc] initWithAction: action] autorelease ]; | ||
50 | } | ||
51 | |||
52 | -(id) initWithAction: (CCActionInterval*) action | ||
53 | { | ||
54 | NSAssert( action!=nil, @"Ease: arguments must be non-nil"); | ||
55 | |||
56 | if( (self=[super initWithDuration: action.duration]) ) | ||
57 | other = [action retain]; | ||
58 | |||
59 | return self; | ||
60 | } | ||
61 | |||
62 | -(id) copyWithZone: (NSZone*) zone | ||
63 | { | ||
64 | CCAction *copy = [[[self class] allocWithZone:zone] initWithAction:[[other copy] autorelease]]; | ||
65 | return copy; | ||
66 | } | ||
67 | |||
68 | -(void) dealloc | ||
69 | { | ||
70 | [other release]; | ||
71 | [super dealloc]; | ||
72 | } | ||
73 | |||
74 | -(void) startWithTarget:(id)aTarget | ||
75 | { | ||
76 | [super startWithTarget:aTarget]; | ||
77 | [other startWithTarget:target_]; | ||
78 | } | ||
79 | |||
80 | -(void) stop | ||
81 | { | ||
82 | [other stop]; | ||
83 | [super stop]; | ||
84 | } | ||
85 | |||
86 | -(void) update: (ccTime) t | ||
87 | { | ||
88 | [other update: t]; | ||
89 | } | ||
90 | |||
91 | -(CCActionInterval*) reverse | ||
92 | { | ||
93 | return [[self class] actionWithAction: [other reverse]]; | ||
94 | } | ||
95 | @end | ||
96 | |||
97 | |||
98 | #pragma mark - | ||
99 | #pragma mark EaseRate | ||
100 | |||
101 | // | ||
102 | // EaseRateAction | ||
103 | // | ||
104 | @implementation CCEaseRateAction | ||
105 | @synthesize rate; | ||
106 | +(id) actionWithAction: (CCActionInterval*) action rate:(float)aRate | ||
107 | { | ||
108 | return [[[self alloc] initWithAction: action rate:aRate] autorelease ]; | ||
109 | } | ||
110 | |||
111 | -(id) initWithAction: (CCActionInterval*) action rate:(float)aRate | ||
112 | { | ||
113 | if( (self=[super initWithAction:action ]) ) | ||
114 | self.rate = aRate; | ||
115 | |||
116 | return self; | ||
117 | } | ||
118 | |||
119 | -(id) copyWithZone: (NSZone*) zone | ||
120 | { | ||
121 | CCAction *copy = [[[self class] allocWithZone:zone] initWithAction:[[other copy] autorelease] rate:rate]; | ||
122 | return copy; | ||
123 | } | ||
124 | |||
125 | -(void) dealloc | ||
126 | { | ||
127 | [super dealloc]; | ||
128 | } | ||
129 | |||
130 | -(CCActionInterval*) reverse | ||
131 | { | ||
132 | return [[self class] actionWithAction: [other reverse] rate:1/rate]; | ||
133 | } | ||
134 | @end | ||
135 | |||
136 | // | ||
137 | // EeseIn | ||
138 | // | ||
139 | @implementation CCEaseIn | ||
140 | -(void) update: (ccTime) t | ||
141 | { | ||
142 | [other update: powf(t,rate)]; | ||
143 | } | ||
144 | @end | ||
145 | |||
146 | // | ||
147 | // EaseOut | ||
148 | // | ||
149 | @implementation CCEaseOut | ||
150 | -(void) update: (ccTime) t | ||
151 | { | ||
152 | [other update: powf(t,1/rate)]; | ||
153 | } | ||
154 | @end | ||
155 | |||
156 | // | ||
157 | // EaseInOut | ||
158 | // | ||
159 | @implementation CCEaseInOut | ||
160 | -(void) update: (ccTime) t | ||
161 | { | ||
162 | int sign =1; | ||
163 | int r = (int) rate; | ||
164 | if (r % 2 == 0) | ||
165 | sign = -1; | ||
166 | t *= 2; | ||
167 | if (t < 1) | ||
168 | [other update: 0.5f * powf (t, rate)]; | ||
169 | else | ||
170 | [other update: sign*0.5f * (powf (t-2, rate) + sign*2)]; | ||
171 | } | ||
172 | |||
173 | // InOut and OutIn are symmetrical | ||
174 | -(CCActionInterval*) reverse | ||
175 | { | ||
176 | return [[self class] actionWithAction: [other reverse] rate:rate]; | ||
177 | } | ||
178 | |||
179 | @end | ||
180 | |||
181 | #pragma mark - | ||
182 | #pragma mark EaseExponential | ||
183 | |||
184 | // | ||
185 | // EaseExponentialIn | ||
186 | // | ||
187 | @implementation CCEaseExponentialIn | ||
188 | -(void) update: (ccTime) t | ||
189 | { | ||
190 | [other update: (t==0) ? 0 : powf(2, 10 * (t/1 - 1)) - 1 * 0.001f]; | ||
191 | } | ||
192 | |||
193 | - (CCActionInterval*) reverse | ||
194 | { | ||
195 | return [CCEaseExponentialOut actionWithAction: [other reverse]]; | ||
196 | } | ||
197 | @end | ||
198 | |||
199 | // | ||
200 | // EaseExponentialOut | ||
201 | // | ||
202 | @implementation CCEaseExponentialOut | ||
203 | -(void) update: (ccTime) t | ||
204 | { | ||
205 | [other update: (t==1) ? 1 : (-powf(2, -10 * t/1) + 1)]; | ||
206 | } | ||
207 | |||
208 | - (CCActionInterval*) reverse | ||
209 | { | ||
210 | return [CCEaseExponentialIn actionWithAction: [other reverse]]; | ||
211 | } | ||
212 | @end | ||
213 | |||
214 | // | ||
215 | // EaseExponentialInOut | ||
216 | // | ||
217 | @implementation CCEaseExponentialInOut | ||
218 | -(void) update: (ccTime) t | ||
219 | { | ||
220 | t /= 0.5f; | ||
221 | if (t < 1) | ||
222 | t = 0.5f * powf(2, 10 * (t - 1)); | ||
223 | else | ||
224 | t = 0.5f * (-powf(2, -10 * (t -1) ) + 2); | ||
225 | |||
226 | [other update:t]; | ||
227 | } | ||
228 | @end | ||
229 | |||
230 | |||
231 | #pragma mark - | ||
232 | #pragma mark EaseSin actions | ||
233 | |||
234 | // | ||
235 | // EaseSineIn | ||
236 | // | ||
237 | @implementation CCEaseSineIn | ||
238 | -(void) update: (ccTime) t | ||
239 | { | ||
240 | [other update:-1*cosf(t * (float)M_PI_2) +1]; | ||
241 | } | ||
242 | |||
243 | - (CCActionInterval*) reverse | ||
244 | { | ||
245 | return [CCEaseSineOut actionWithAction: [other reverse]]; | ||
246 | } | ||
247 | @end | ||
248 | |||
249 | // | ||
250 | // EaseSineOut | ||
251 | // | ||
252 | @implementation CCEaseSineOut | ||
253 | -(void) update: (ccTime) t | ||
254 | { | ||
255 | [other update:sinf(t * (float)M_PI_2)]; | ||
256 | } | ||
257 | |||
258 | - (CCActionInterval*) reverse | ||
259 | { | ||
260 | return [CCEaseSineIn actionWithAction: [other reverse]]; | ||
261 | } | ||
262 | @end | ||
263 | |||
264 | // | ||
265 | // EaseSineInOut | ||
266 | // | ||
267 | @implementation CCEaseSineInOut | ||
268 | -(void) update: (ccTime) t | ||
269 | { | ||
270 | [other update:-0.5f*(cosf( (float)M_PI*t) - 1)]; | ||
271 | } | ||
272 | @end | ||
273 | |||
274 | #pragma mark - | ||
275 | #pragma mark EaseElastic actions | ||
276 | |||
277 | // | ||
278 | // EaseElastic | ||
279 | // | ||
280 | @implementation CCEaseElastic | ||
281 | |||
282 | @synthesize period = period_; | ||
283 | |||
284 | +(id) actionWithAction: (CCActionInterval*) action | ||
285 | { | ||
286 | return [[[self alloc] initWithAction:action period:0.3f] autorelease]; | ||
287 | } | ||
288 | |||
289 | +(id) actionWithAction: (CCActionInterval*) action period:(float)period | ||
290 | { | ||
291 | return [[[self alloc] initWithAction:action period:period] autorelease]; | ||
292 | } | ||
293 | |||
294 | -(id) initWithAction: (CCActionInterval*) action | ||
295 | { | ||
296 | return [self initWithAction:action period:0.3f]; | ||
297 | } | ||
298 | |||
299 | -(id) initWithAction: (CCActionInterval*) action period:(float)period | ||
300 | { | ||
301 | if( (self=[super initWithAction:action]) ) | ||
302 | period_ = period; | ||
303 | |||
304 | return self; | ||
305 | } | ||
306 | |||
307 | -(id) copyWithZone: (NSZone*) zone | ||
308 | { | ||
309 | CCAction *copy = [[[self class] allocWithZone:zone] initWithAction:[[other copy] autorelease] period:period_]; | ||
310 | return copy; | ||
311 | } | ||
312 | |||
313 | -(CCActionInterval*) reverse | ||
314 | { | ||
315 | NSAssert(NO,@"Override me"); | ||
316 | return nil; | ||
317 | } | ||
318 | |||
319 | @end | ||
320 | |||
321 | // | ||
322 | // EaseElasticIn | ||
323 | // | ||
324 | |||
325 | @implementation CCEaseElasticIn | ||
326 | -(void) update: (ccTime) t | ||
327 | { | ||
328 | ccTime newT = 0; | ||
329 | if (t == 0 || t == 1) | ||
330 | newT = t; | ||
331 | |||
332 | else { | ||
333 | float s = period_ / 4; | ||
334 | t = t - 1; | ||
335 | newT = -powf(2, 10 * t) * sinf( (t-s) *M_PI_X_2 / period_); | ||
336 | } | ||
337 | [other update:newT]; | ||
338 | } | ||
339 | |||
340 | - (CCActionInterval*) reverse | ||
341 | { | ||
342 | return [CCEaseElasticOut actionWithAction: [other reverse] period:period_]; | ||
343 | } | ||
344 | |||
345 | @end | ||
346 | |||
347 | // | ||
348 | // EaseElasticOut | ||
349 | // | ||
350 | @implementation CCEaseElasticOut | ||
351 | |||
352 | -(void) update: (ccTime) t | ||
353 | { | ||
354 | ccTime newT = 0; | ||
355 | if (t == 0 || t == 1) { | ||
356 | newT = t; | ||
357 | |||
358 | } else { | ||
359 | float s = period_ / 4; | ||
360 | newT = powf(2, -10 * t) * sinf( (t-s) *M_PI_X_2 / period_) + 1; | ||
361 | } | ||
362 | [other update:newT]; | ||
363 | } | ||
364 | |||
365 | - (CCActionInterval*) reverse | ||
366 | { | ||
367 | return [CCEaseElasticIn actionWithAction: [other reverse] period:period_]; | ||
368 | } | ||
369 | |||
370 | @end | ||
371 | |||
372 | // | ||
373 | // EaseElasticInOut | ||
374 | // | ||
375 | @implementation CCEaseElasticInOut | ||
376 | -(void) update: (ccTime) t | ||
377 | { | ||
378 | ccTime newT = 0; | ||
379 | |||
380 | if( t == 0 || t == 1 ) | ||
381 | newT = t; | ||
382 | else { | ||
383 | t = t * 2; | ||
384 | if(! period_ ) | ||
385 | period_ = 0.3f * 1.5f; | ||
386 | ccTime s = period_ / 4; | ||
387 | |||
388 | t = t -1; | ||
389 | if( t < 0 ) | ||
390 | newT = -0.5f * powf(2, 10 * t) * sinf((t - s) * M_PI_X_2 / period_); | ||
391 | else | ||
392 | newT = powf(2, -10 * t) * sinf((t - s) * M_PI_X_2 / period_) * 0.5f + 1; | ||
393 | } | ||
394 | [other update:newT]; | ||
395 | } | ||
396 | |||
397 | - (CCActionInterval*) reverse | ||
398 | { | ||
399 | return [CCEaseElasticInOut actionWithAction: [other reverse] period:period_]; | ||
400 | } | ||
401 | |||
402 | @end | ||
403 | |||
404 | #pragma mark - | ||
405 | #pragma mark EaseBounce actions | ||
406 | |||
407 | // | ||
408 | // EaseBounce | ||
409 | // | ||
410 | @implementation CCEaseBounce | ||
411 | -(ccTime) bounceTime:(ccTime) t | ||
412 | { | ||
413 | if (t < 1 / 2.75) { | ||
414 | return 7.5625f * t * t; | ||
415 | } | ||
416 | else if (t < 2 / 2.75) { | ||
417 | t -= 1.5f / 2.75f; | ||
418 | return 7.5625f * t * t + 0.75f; | ||
419 | } | ||
420 | else if (t < 2.5 / 2.75) { | ||
421 | t -= 2.25f / 2.75f; | ||
422 | return 7.5625f * t * t + 0.9375f; | ||
423 | } | ||
424 | |||
425 | t -= 2.625f / 2.75f; | ||
426 | return 7.5625f * t * t + 0.984375f; | ||
427 | } | ||
428 | @end | ||
429 | |||
430 | // | ||
431 | // EaseBounceIn | ||
432 | // | ||
433 | |||
434 | @implementation CCEaseBounceIn | ||
435 | |||
436 | -(void) update: (ccTime) t | ||
437 | { | ||
438 | ccTime newT = 1 - [self bounceTime:1-t]; | ||
439 | [other update:newT]; | ||
440 | } | ||
441 | |||
442 | - (CCActionInterval*) reverse | ||
443 | { | ||
444 | return [CCEaseBounceOut actionWithAction: [other reverse]]; | ||
445 | } | ||
446 | |||
447 | @end | ||
448 | |||
449 | @implementation CCEaseBounceOut | ||
450 | |||
451 | -(void) update: (ccTime) t | ||
452 | { | ||
453 | ccTime newT = [self bounceTime:t]; | ||
454 | [other update:newT]; | ||
455 | } | ||
456 | |||
457 | - (CCActionInterval*) reverse | ||
458 | { | ||
459 | return [CCEaseBounceIn actionWithAction: [other reverse]]; | ||
460 | } | ||
461 | |||
462 | @end | ||
463 | |||
464 | @implementation CCEaseBounceInOut | ||
465 | |||
466 | -(void) update: (ccTime) t | ||
467 | { | ||
468 | ccTime newT = 0; | ||
469 | if (t < 0.5) { | ||
470 | t = t * 2; | ||
471 | newT = (1 - [self bounceTime:1-t] ) * 0.5f; | ||
472 | } else | ||
473 | newT = [self bounceTime:t * 2 - 1] * 0.5f + 0.5f; | ||
474 | |||
475 | [other update:newT]; | ||
476 | } | ||
477 | @end | ||
478 | |||
479 | #pragma mark - | ||
480 | #pragma mark Ease Back actions | ||
481 | |||
482 | // | ||
483 | // EaseBackIn | ||
484 | // | ||
485 | @implementation CCEaseBackIn | ||
486 | |||
487 | -(void) update: (ccTime) t | ||
488 | { | ||
489 | ccTime overshoot = 1.70158f; | ||
490 | [other update: t * t * ((overshoot + 1) * t - overshoot)]; | ||
491 | } | ||
492 | |||
493 | - (CCActionInterval*) reverse | ||
494 | { | ||
495 | return [CCEaseBackOut actionWithAction: [other reverse]]; | ||
496 | } | ||
497 | @end | ||
498 | |||
499 | // | ||
500 | // EaseBackOut | ||
501 | // | ||
502 | @implementation CCEaseBackOut | ||
503 | -(void) update: (ccTime) t | ||
504 | { | ||
505 | ccTime overshoot = 1.70158f; | ||
506 | |||
507 | t = t - 1; | ||
508 | [other update: t * t * ((overshoot + 1) * t + overshoot) + 1]; | ||
509 | } | ||
510 | |||
511 | - (CCActionInterval*) reverse | ||
512 | { | ||
513 | return [CCEaseBackIn actionWithAction: [other reverse]]; | ||
514 | } | ||
515 | @end | ||
516 | |||
517 | // | ||
518 | // EaseBackInOut | ||
519 | // | ||
520 | @implementation CCEaseBackInOut | ||
521 | |||
522 | -(void) update: (ccTime) t | ||
523 | { | ||
524 | ccTime overshoot = 1.70158f * 1.525f; | ||
525 | |||
526 | t = t * 2; | ||
527 | if (t < 1) | ||
528 | [other update: (t * t * ((overshoot + 1) * t - overshoot)) / 2]; | ||
529 | else { | ||
530 | t = t - 2; | ||
531 | [other update: (t * t * ((overshoot + 1) * t + overshoot)) / 2 + 1]; | ||
532 | } | ||
533 | } | ||
534 | @end | ||