2010-03-14 5 views
4

Je viens d'avoir ma méthode de clavier pour fonctionner. Mais je reçois le bip du système chaque fois que j'appuie sur la touche. Je n'ai aucune idée de ce qui ne va pas. Googled pendant des heures et tout le monde dit est que si vous avez votre méthode keyDown vous devez également implémenter le acceptsFirstResponder. fait cela et ça ne marche toujours pas.keyDown fonctionne mais je reçois des bips

#import <Cocoa/Cocoa.h> 
#import "PaddleView.h" 
#import "BallView.h" 

@interface GameController : NSView { 
    PaddleView *leftPaddle; 
    PaddleView *rightPaddle; 
    BallView * ball; 

    CGPoint ballVelocity; 

    int gameState; 

    int player1Score; 
    int player2Score; 
} 

@property (retain) IBOutlet PaddleView *leftPaddle; 
@property (retain) IBOutlet PaddleView *rightPaddle; 
@property (retain) IBOutlet BallView *ball; 

- (void)reset:(BOOL)newGame; 

@end 

#import "GameController.h" 

#define GameStateRunning 1 
#define GameStatePause 2 

#define BallSpeedX 0.2 
#define BallSpeedY 0.3 

#define CompMoveSpeed 15 

#define ScoreToWin 5 

@implementation GameController 

@synthesize leftPaddle, rightPaddle, ball; 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if(self) {  
     gameState = GameStatePause; 
     ballVelocity = CGPointMake(BallSpeedX, BallSpeedY); 
     [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES]; 

    } 
    return self; 
} 

- (void)gameLoop { 
    if(gameState == GameStateRunning) { 
     [ball setFrameOrigin:CGPointMake(ball.frame.origin.x + ballVelocity.x, ball.frame.origin.y + ballVelocity.y)]; 

     if(ball.frame.origin.x + 15 > self.frame.size.width || ball.frame.origin.x < 0) { 
      ballVelocity.x =- ballVelocity.x; 
     } 

     if(ball.frame.origin.y + 35 > self.frame.size.height || ball.frame.origin.y < 0) { 
      ballVelocity.y =- ballVelocity.y; 
     } 
    } 

    if(CGRectIntersectsRect(ball.frame, leftPaddle.frame)) { 
     if(ball.frame.origin.x > leftPaddle.frame.origin.x) { 
      ballVelocity.x =- ballVelocity.x; 
     } 
    } 

    if(CGRectIntersectsRect(ball.frame, rightPaddle.frame)) { 
     if(ball.frame.origin.x +15 > rightPaddle.frame.origin.x) { 
      ballVelocity.x =- ballVelocity.x; 
     } 
    } 

    if(ball.frame.origin.x <= self.frame.size.width/2) { 
     if(ball.frame.origin.y < leftPaddle.frame.origin.y + 75 && leftPaddle.frame.origin.y > 0) { 
      [leftPaddle setFrameOrigin:CGPointMake(leftPaddle.frame.origin.x, leftPaddle.frame.origin.y - CompMoveSpeed)]; 
     } 
     if(ball.frame.origin.y > leftPaddle.frame.origin.y +75 && leftPaddle.frame.origin.y < 700 - leftPaddle.frame.size.height) { 
      [leftPaddle setFrameOrigin:CGPointMake(leftPaddle.frame.origin.x, leftPaddle.frame.origin.y + CompMoveSpeed)]; 
     } 
    } 

    if(ball.frame.origin.x <= 0) { 
     player2Score++; 
     [self reset:(player2Score >= ScoreToWin)]; 
    } 
    if(ball.frame.origin.x + 15 > self.frame.size.width) { 
     player1Score++; 
     [self reset:(player1Score >= ScoreToWin)]; 
    } 
} 

- (void)reset:(BOOL)newGame { 
    gameState = GameStatePause; 
    [ball setFrameOrigin:CGPointMake((self.frame.size.width + 7.5)/2, (self.frame.size.height + 7.5)/2)]; 
    if(newGame) { 
     if(player1Score > player2Score) { 
      NSLog(@"Player 1 Wins!"); 
     } 
     else { 
      NSLog(@"Player 2 Wins!"); 
     } 

     player1Score = 0; 
     player2Score = 0; 
    } 
    else { 
     NSLog(@"Press key to serve"); 
    } 

    NSLog(@"Player 1: %d",player1Score); 
    NSLog(@"Player 2: %d",player2Score); 
} 

- (void)moveRightPaddleUp { 
    if(rightPaddle.frame.origin.y < 700 - rightPaddle.frame.size.height) { 
     [rightPaddle setFrameOrigin:CGPointMake(rightPaddle.frame.origin.x, rightPaddle.frame.origin.y + 20)]; 
    } 
} 

- (void)moveRightPaddleDown { 
    if(rightPaddle.frame.origin.y > 0) { 
     [rightPaddle setFrameOrigin:CGPointMake(rightPaddle.frame.origin.x, rightPaddle.frame.origin.y - 20)]; 
    } 
} 

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

- (void)keyDown:(NSEvent *)theEvent { 

    if ([theEvent modifierFlags] & NSNumericPadKeyMask) { 
     NSString *theArrow = [theEvent charactersIgnoringModifiers]; 
     unichar keyChar = 0; 
     if ([theArrow length] == 0) { 
      return;   // reject dead keys 
     } 

     if ([theArrow length] == 1) { 
      keyChar = [theArrow characterAtIndex:0]; 

      if (keyChar == NSLeftArrowFunctionKey) { 
       gameState = GameStateRunning; 
      } 

      if (keyChar == NSRightArrowFunctionKey) { 

      } 

      if (keyChar == NSUpArrowFunctionKey) { 
       [self moveRightPaddleUp]; 
      } 

      if (keyChar == NSDownArrowFunctionKey) { 
       [self moveRightPaddleDown]; 
      } 

      [super keyDown:theEvent];  
     } 
    } 
    else { 
     [super keyDown:theEvent]; 
    } 
} 


- (void)drawRect:(NSRect)dirtyRect { 

} 



- (void)dealloc { 
    [ball release]; 
    [rightPaddle release]; 
    [leftPaddle release]; 
    [super dealloc]; 
} 

@end 
+0

Je vais avoir le même problème ici. Avez-vous déjà trouvé une solution? –

Répondre

12

Si vous "consommer" l'événement, ne passent pas le long de super.

Questions connexes