我剛剛得到我的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
我在這裏有完全相同的問題。你有沒有找到解決方案? – 2013-01-10 09:05:17