2010-03-17 9 views
1

J'ai essayé d'écrire une collision avec les "flotteurs" en mouvement mais je n'ai pas réussi. Est-ce que quelque chose est peut-être au mauvais endroit du code "collision"?collision avec des objets en mouvement

// 
// FruitsView.m 
// 

#import "FruitsView.h" 
#import "Constants.h" 
#import "Utilities.h" 

#define kFloat1Speed 0.15 
#define kFloat2Speed 0.3 
#define kFloat3Speed 0.2 

@interface FruitsView (Private) 
- (void) stopTimer; 
@end 

@implementation FruitsView 
@synthesize apple, float1, float2, float3, posFloat1, posFloat2, posFloat3; 


-(void)onTimer { 

float1.center = CGPointMake(float1.center.x+posFloat1.x,float1.cen ter.y+posFloat1.y); 

if(float1.center.x > 380 || float1.center.x < -60) 
posFloat1.x = -posFloat1.x; 
if(float1.center.y > 100 || float1.center.y < -40) 
posFloat1.y = -posFloat1.y; 

float2.center = CGPointMake(float2.center.x+posFloat2.x,float2.cen ter.y+posFloat2.y); 

if(float2.center.x > 380 || float2.center.x < -50) 
posFloat2.x = -posFloat2.x; 
if(float2.center.y > 150 || float2.center.y < -30) 
posFloat2.y = -posFloat2.y; 

float3.center = CGPointMake(float3.center.x+posFloat3.x,float3.cen ter.y+posFloat3.y); 

if(float3.center.x > 380 || float3.center.x < -70) 
posFloat3.x = -posFloat3.x; 
if(float3.center.y > 100 || float3.center.y < -20) 
posFloat3.y = -posFloat3.y; 


if(CGRectIntersectsRect(apple.frame,float1.frame)) { 
if(apple.center.y > float1.center.y) { 
posApple.y = -posApple.y; 
} 
} 

if(CGRectIntersectsRect(apple.frame,float2.frame)) { 
if(apple.center.y > float2.center.y) { 
posFloat2.y = -posFloat2.y; 
} 
} 

if(CGRectIntersectsRect(apple.frame,float3.frame)) { 
if(apple.center.y > float3.center.y) { 
posFloat3.y = -posFloat3.y; 
} 
} 
} 

#pragma mark Initialisation/destruction 

- (void)awakeFromNib { 

[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self selector:@selector(onTimer) userInfo:nil repeats:YES]; 

posFloat1 = CGPointMake(kFloat1Speed, 0); 
posFloat2 = CGPointMake(kFloat2Speed, 0); 
posFloat3 = CGPointMake(kFloat3Speed, 0); 

timer = nil; 
modeLock = lockNotYetChosen; 

defaultSize = self.bounds.size.width; 

modal = self.tag; 

[[UIAccelerometer sharedAccelerometer] setDelegate:self]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationRepeatCount:1]; 
eadbea.transform = CGAffineTransformMakeScale(0.5,0.5); 
[UIView commitAnimations]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationRepeatCount:1]; 
apple.transform = CGAffineTransformMakeScale(0.5,0.5); 
[UIView commitAnimations]; 
} 

#pragma mark Background animation processing 

- (void) startTimer { 
if (!timer) { 
timer = [[NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES] retain]; 
} 
} 


- (void) stopTimer { 
[timer invalidate]; 
[timer release]; 
timer = nil; 
} 

- (void) check:(CGPoint*)position delta:(CGSize*)delta halfSize:(CGSize)halfSize forBouncingAgainst:(CGSize)containerSize { 

if ((position->x - halfSize.width)<0) 
{ 
delta->width = fabsf(delta->width)*BOUNCE_DAMPING; 
position->x = halfSize.width; 
} 
if ((position->x + halfSize.width)>containerSize.width) 
{ 
delta->width = fabsf(delta->width)*-BOUNCE_DAMPING; 
position->x = containerSize.width - halfSize.width; 
} 
if ((position->y - halfSize.height)<0) 
{ 
delta->height = fabsf(delta->height)*BOUNCE_DAMPING; 
position->y = halfSize.height; 
} 
if ((position->y + halfSize.height)>containerSize.height) 
{ 
delta->height = fabsf(delta->height)*-BOUNCE_DAMPING; 
position->y = containerSize.height - halfSize.height; 
} 
} 


- (void) timerTick: (NSTimer*)timer { 

dragDelta = CGSizeScale(dragDelta, INERTIAL_DAMPING); 

if ((fabsf(dragDelta.width)>DELTA_ZERO_THRESHOLD) || (fabsf(dragDelta.height)>DELTA_ZERO_THRESHOLD)) 
{ 
CGPoint ctr = CGPointApplyDelta(self.center, dragDelta); 

CGSize halfSize = CGSizeMake(self.bounds.size.width/4, self.bounds.size.height/4); 
[self check:&ctr delta:&dragDelta halfSize:halfSize forBouncingAgainst:self.superview.bounds.size]; 

self.center = ctr; 
} 
else 
{ 
[self stopTimer]; 
} 
} 

#pragma mark Input Handling 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
NSSet* allTouches = [event touchesForView:self]; 
if ([allTouches count]==1) 
{ 
if (modeLock>lockNotYetChosen) return; 

UITouch* anyTouch = [touches anyObject]; 
lastMove = anyTouch.timestamp; 
CGPoint now = [anyTouch locationInView: self.superview]; 
CGPoint then = [anyTouch previousLocationInView: self.superview]; 
dragDelta = CGPointDelta(now, then); 

self.center = CGPointApplyDelta(self.center, dragDelta); 
[self stopTimer]; 
} 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

NSSet* allTouches = [event touchesForView:self]; 
if ([touches count]==[allTouches count]) 
{ 
modeLock = lockNotYetChosen; 

if ((event.timestamp - lastMove) > MOVEMENT_PAUSE_THRESHOLD) 
return; 
if ((fabsf(dragDelta.width)>INERTIA_THRESHOLD) || (fabsf(dragDelta.height)>INERTIA_THRESHOLD)) 
{ 
[self startTimer]; 
} 
} 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
modeLock = lockNotYetChosen; 
[self stopTimer]; 
} 

- (void)dealloc 
{ 
[float1 release]; 
[float2 release]; 
[float3 release]; 
[apple release]; 
[bear_head release]; 
[self stopTimer]; 
[super dealloc]; 
} 

@end 

Répondre

1

Plutôt que de faire tous vos flotteurs, il suffit d'utiliser deux NSRect et vérifier si elles se coupent en utilisant NSIntersectionRect(rectA, rectB). Ensuite, vous pouvez faire quelque chose comme if(!NSIsEmptyRect(NSIntersectionRect(playerRect, monsterRect))) gameOver();

Vive

Nik

+0

grâce. mais les 3 flotteurs se déplacent à gauche et à droite avec des vitesses différentes et la pomme est déplacée par touchesMoved. acclamations blacksheep – blacksheep