/*
* cocos2d for iPhone: http://www.cocos2d-iphone.org
*
* Copyright (c) 2009 On-Core
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#import "CCActionGrid.h"
#import "CCDirector.h"
#pragma mark -
#pragma mark GridAction
@implementation CCGridAction
@synthesize gridSize = gridSize_;
+(id) actionWithSize:(ccGridSize)size duration:(ccTime)d
{
return [[[self alloc] initWithSize:size duration:d ] autorelease];
}
-(id) initWithSize:(ccGridSize)gSize duration:(ccTime)d
{
if ( (self = [super initWithDuration:d]) )
{
gridSize_ = gSize;
}
return self;
}
-(void)startWithTarget:(id)aTarget
{
[super startWithTarget:aTarget];
CCGridBase *newgrid = [self grid];
CCNode *t = (CCNode*) target_;
CCGridBase *targetGrid = [t grid];
if ( targetGrid && targetGrid.reuseGrid > 0 )
{
if ( targetGrid.active && targetGrid.gridSize.x == gridSize_.x && targetGrid.gridSize.y == gridSize_.y && [targetGrid isKindOfClass:[newgrid class]] )
[targetGrid reuse];
else
[NSException raise:@"GridBase" format:@"Cannot reuse grid"];
}
else
{
if ( targetGrid && targetGrid.active )
targetGrid.active = NO;
t.grid = newgrid;
t.grid.active = YES;
}
}
-(CCGridBase *)grid
{
[NSException raise:@"GridBase" format:@"Abstract class needs implementation"];
return nil;
}
- (CCActionInterval*) reverse
{
return [CCReverseTime actionWithAction:self];
}
-(id) copyWithZone: (NSZone*) zone
{
CCGridAction *copy = [[[self class] allocWithZone:zone] initWithSize:gridSize_ duration:duration_];
return copy;
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark Grid3DAction
@implementation CCGrid3DAction
-(CCGridBase *)grid
{
return [CCGrid3D gridWithSize:gridSize_];
}
-(ccVertex3F)vertex:(ccGridSize)pos
{
CCGrid3D *g = (CCGrid3D *)[target_ grid];
return [g vertex:pos];
}
-(ccVertex3F)originalVertex:(ccGridSize)pos
{
CCGrid3D *g = (CCGrid3D *)[target_ grid];
return [g originalVertex:pos];
}
-(void)setVertex:(ccGridSize)pos vertex:(ccVertex3F)vertex
{
CCGrid3D *g = (CCGrid3D *)[target_ grid];
[g setVertex:pos vertex:vertex];
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark TiledGrid3DAction
@implementation CCTiledGrid3DAction
-(CCGridBase *)grid
{
return [CCTiledGrid3D gridWithSize:gridSize_];
}
-(ccQuad3)tile:(ccGridSize)pos
{
CCTiledGrid3D *g = (CCTiledGrid3D *)[target_ grid];
return [g tile:pos];
}
-(ccQuad3)originalTile:(ccGridSize)pos
{
CCTiledGrid3D *g = (CCTiledGrid3D *)[target_ grid];
return [g originalTile:pos];
}
-(void)setTile:(ccGridSize)pos coords:(ccQuad3)coords
{
CCTiledGrid3D *g = (CCTiledGrid3D *)[target_ grid];
[g setTile:pos coords:coords];
}
@end
////////////////////////////////////////////////////////////
@interface CCActionInterval (Amplitude)
-(void)setAmplitudeRate:(CGFloat)amp;
-(CGFloat)getAmplitudeRate;
@end
@implementation CCActionInterval (Amplitude)
-(void)setAmplitudeRate:(CGFloat)amp
{
[NSException raise:@"IntervalAction (Amplitude)" format:@"Abstract class needs implementation"];
}
-(CGFloat)getAmplitudeRate
{
[NSException raise:@"IntervalAction (Amplitude)" format:@"Abstract class needs implementation"];
return 0;
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark AccelDeccelAmplitude
@implementation CCAccelDeccelAmplitude
@synthesize rate=rate_;
+(id)actionWithAction:(CCAction*)action duration:(ccTime)d
{
return [[[self alloc] initWithAction:action duration:d ] autorelease];
}
-(id)initWithAction:(CCAction *)action duration:(ccTime)d
{
if ( (self = [super initWithDuration:d]) )
{
rate_ = 1.0f;
other_ = (CCActionInterval*)[action retain];
}
return self;
}
-(void)dealloc
{
[other_ release];
[super dealloc];
}
-(void)startWithTarget:(id)aTarget
{
[super startWithTarget:aTarget];
[other_ startWithTarget:target_];
}
-(void) update: (ccTime) time
{
float f = time*2;
if (f > 1)
{
f -= 1;
f = 1 - f;
}
[other_ setAmplitudeRate:powf(f, rate_)];
[other_ update:time];
}
- (CCActionInterval*) reverse
{
return [CCAccelDeccelAmplitude actionWithAction:[other_ reverse] duration:duration_];
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark AccelAmplitude
@implementation CCAccelAmplitude
@synthesize rate=rate_;
+(id)actionWithAction:(CCAction*)action duration:(ccTime)d
{
return [[[self alloc] initWithAction:action duration:d ] autorelease];
}
-(id)initWithAction:(CCAction *)action duration:(ccTime)d
{
if ( (self = [super initWithDuration:d]) )
{
rate_ = 1.0f;
other_ = (CCActionInterval*)[action retain];
}
return self;
}
-(void)dealloc
{
[other_ release];
[super dealloc];
}
-(void)startWithTarget:(id)aTarget
{
[super startWithTarget:aTarget];
[other_ startWithTarget:target_];
}
-(void) update: (ccTime) time
{
[other_ setAmplitudeRate:powf(time, rate_)];
[other_ update:time];
}
- (CCActionInterval*) reverse
{
return [CCAccelAmplitude actionWithAction:[other_ reverse] duration:self.duration];
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark DeccelAmplitude
@implementation CCDeccelAmplitude
@synthesize rate=rate_;
+(id)actionWithAction:(CCAction*)action duration:(ccTime)d
{
return [[[self alloc] initWithAction:action duration:d ] autorelease];
}
-(id)initWithAction:(CCAction *)action duration:(ccTime)d
{
if ( (self = [super initWithDuration:d]) )
{
rate_ = 1.0f;
other_ = (CCActionInterval*)[action retain];
}
return self;
}
-(void)dealloc
{
[other_ release];
[super dealloc];
}
-(void)startWithTarget:(id)aTarget
{
[super startWithTarget:aTarget];
[other_ startWithTarget:target_];
}
-(void) update: (ccTime) time
{
[other_ setAmplitudeRate:powf((1-time), rate_)];
[other_ update:time];
}
- (CCActionInterval*) reverse
{
return [CCDeccelAmplitude actionWithAction:[other_ reverse] duration:self.duration];
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark StopGrid
@implementation CCStopGrid
-(void)startWithTarget:(id)aTarget
{
[super startWithTarget:aTarget];
if ( [[self target] grid] && [[[self target] grid] active] ) {
[[[self target] grid] setActive: NO];
// [[self target] setGrid: nil];
}
}
@end
////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark ReuseGrid
@implementation CCReuseGrid
+(id)actionWithTimes:(int)times
{
return [[[self alloc] initWithTimes:times ] autorelease];
}
-(id)initWithTimes:(int)times
{
if ( (self = [super init]) )
t_ = times;
return self;
}
-(void)startWithTarget:(id)aTarget
{
[super startWithTarget:aTarget];
CCNode *myTarget = (CCNode*) [self target];
if ( myTarget.grid && myTarget.grid.active )
myTarget.grid.reuseGrid += t_;
}
@end