#import "gamemodel.h" #import "sprite.h" @implementation GameModel -(id) init { [super init]; sprites = [[NSMutableArray alloc] init]; toAdd = [[NSMutableArray alloc] init]; toRemove = [[NSMutableArray alloc] init]; lastUpdate = 0.0; return self; } -(NSArray*) getSprites { NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease]; [result addObjectsFromArray:sprites]; [result removeObjectsInArray:toRemove]; return result; } -(void) addSprite:(Sprite*)s { if (![sprites containsObject:s] && ![toAdd containsObject:s]) { [toAdd addObject:s]; } } -(void) removeSprite:(Sprite*)s { if (![toRemove containsObject:s] && [sprites containsObject:s]) { [toRemove addObject:s]; } } -(double) getWidth { return 1.0; } -(double) getHeight { return 1.0; } -(void) processRemovedSprites { [sprites removeObjectsInArray:toRemove]; [toRemove removeObjectsInRange:NSMakeRange(0, [toRemove count])]; } -(void) processAddedSprites { [sprites addObjectsFromArray:toAdd]; [toAdd removeObjectsInRange:NSMakeRange(0, [toAdd count])]; } -(void) update { // get current time since 1970 NSDate* currentDate = [NSDate date]; NSTimeInterval currentTime = [currentDate timeIntervalSince1970]; if (lastUpdate != 0.0) { for (int i = 0; i < [sprites count]; i++) { [(Sprite*)[sprites objectAtIndex:i] updateForTime:currentTime - lastUpdate model:self]; } } [self checkCollisions]; [self processRemovedSprites]; [self processAddedSprites]; lastUpdate = currentTime; } -(void) checkCollisions { for (int i = 0; i < [sprites count]; i++) { Sprite* s1 = [sprites objectAtIndex:i]; for (int j = i + 1; j < [sprites count]; j++) { Sprite* s2 = [sprites objectAtIndex:j]; if ([s1 collidesWith:s2]) { [self handleCollisionSprite:s1 with:s2]; } } } } -(void) handleCollisionSprite:(Sprite*)s1 with:(Sprite*)s2 { } -(void) dealloc { [sprites release]; [toAdd release]; [toRemove release]; [super dealloc]; } @end