2010-03-14 91 views
4

我刚刚得到我的keydown方法工作。但是,每当我按键时,系统都会发出嘟嘟声。我不知道什么是错的。谷歌搜索几个小时,所有人都说,如果你有你的keyDown方法,你也应该实现accepFirstResponder。做到了这一点,它仍然无法正常工作。keyDown工作,但我得到蜂鸣声

#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

我在这里有完全相同的问题。你有没有找到解决方案? – 2013-01-10 09:05:17

回答

12

如果 “消费” 的情况下,不把它传递给超。