keyDown工作但我发出哔哔声

时间:2010-03-14 19:53:35

标签: objective-c cocoa first-responder

我只是让我的keydown方法工作。但每按一次键,我都会发出哔哔声。我不知道什么是错的。用Google搜索了几个小时,所有人都说如果你有keyDown方法,你也应该实现acceptFirstResponder。这样做了,它仍然无效。

#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

2 个答案:

答案 0 :(得分:12)

如果您“消费”该事件,请不要将其传递给super。

答案 1 :(得分:-1)

抓住事件并防止违约,如:

e.preventDefault();

我从这里选择了这个:Avoid Beep sound when enter keypress in a textbox