开发者

iOS "View Controller"

开发者 https://www.devze.com 2023-02-16 14:11 出处:网络
I try to make a game but I have a \"warning\" that says: \"IVBrickerViewController may not respond to -processCollision.

I try to make a game but I have a "warning" that says: "IVBrickerViewController may not respond to -processCollision. This is the code:

#import "IVBrickerViewController.h"

@implementation IVBrickerViewController

@synthesize scoreLabel;
@synthesize ball;
@synthesize paddle;
@synthesize livesLabel;
@synthesize messageLabel;



/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/



// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

-(void) accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)accel
{
    float newX = paddle.center.x + (accel.x *12);
    if(newX > 30 && newX <290)
        paddle.center = CGPointMake(newX, paddle.center.y);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (isPlaying) {
    UITouch *touch = [[event allTouches] anyObject];
    touchOffset = paddle.center.x -
    [touch locationInView:touch.view].x;
    } else {
        [self startPlaying];
    }
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (isPlaying) {
    UITouch *touch = [[event allTouches] anyObject]; 
    float distanceMoved =
        ([touch locationInView:touch.view].x + touchOffset) -
    paddle.center.x;
    float newX = paddle.center.x + distanceMoved; 
    if (newX > 30 && newX < 290)
        paddle.center = CGPointMake( newX, paddle.center.y );
    if (newX > 290)
        paddle.center = CGPointMake( 290, paddle.center.y );
    if (newX < 30)
        paddle.center = CGPointMake( 30, paddle.center.y );
    }
}




- (void)viewDidLoad {
    [super viewDidLoad];
    [self initializeBricks];
    [self startPlaying];
}
- (void)initializeBricks
{
    brickTypes[0] = @"bricktype1.png";
    brickTypes[1] = @"bricktype2.png";
    brickTypes[2] = @"bricktype3.png"; 
    brickTypes[3] = @"bricktype4.png";
    int count = 0;
    for (int y = 0; y < BRICKS_HEIGHT; y++) 
{
    for开发者_Go百科 (int x = 0; x < BRICKS_WIDTH; x++)
    {
UIImage *image = [UIImage imageNamed:
                  brickTypes[count++ % 4]];
bricks[x][y] = [[[UIImageView alloc] initWithImage:image]
                autorelease];
CGRect newFrame = bricks[x][y].frame;
        newFrame.origin = CGPointMake(x * 64, (y * 40) + 100);
        bricks[x][y].frame = newFrame; 
        [self.view addSubview:bricks[x][y]];
    }
  }
}

-(void)startPlaying {
    if (!lives) {
        lives = 3;
        score = 0;
    }

    UIAccelerometer *theAccel = [UIAccelerometer sharedAccelerometer];
    theAccel.updateInterval = 1.0f / 30.0f;
    theAccel.delegate = self;

    ballMovement = CGPointMake(4, 4);
    [self initializeTimer];

    scoreLabel.text = [NSString stringWithFormat:@"%05d", score];
    livesLabel.text = [NSString stringWithFormat:@"%d", lives];

    ball.center = CGPointMake(159, 239);
    ballMovement = CGPointMake(4, 4);
    // choose whether the ball moves left to right or right or right to left
    if (arc4random() % 100 < 50)
        ballMovement.x = -ballMovement.x;
    messageLabel.hidden = YES;
    isPlaying = YES;

    [self initializeTimer];
}

-(void)pauseGame {
    [theTimer invalidate];
    theTimer = nil;
}

-(void)initializeTimer {
    if (theTimer == nil) {
    float theInterval = 1.0f/30.0f;
        //I've renamed animateBall: to gamelogic
    theTimer = [NSTimer scheduledTimerWithTimeInterval:theInterval target:self
                                   selector:@selector(gameLogic) userInfo:nil repeats:YES];
    }
}
-(void)gameLogic {
    ball.center = CGPointMake(ball.center.x+ballMovement.x,
                              ball.center.y+ballMovement.y);

    BOOL paddleCollision = ball.center.y >= paddle.center.y - 16 && 
        ball.center.y <= paddle.center.y + 16 && 
        ball.center.x > paddle.center.x - 32 &&
        ball.center.x < paddle.center.x + 32;

    if(paddleCollision) { 
        ballMovement.y = -ballMovement.y;

        BOOL there_are_solid_bricks = NO;

        for (int y = 0; y < BRICKS_HEIGHT; y++)
        {
            for (int x = 0; x < BRICKS_WIDTH; x++)
            {
                if (1.0 == bricks[x][y].alpha)
                {
                    there_are_solid_bricks = YES; 
                    if ( CGRectIntersectsRect(ball.frame, bricks[x][y].frame) )
                    {
                        [***self processCollision:bricks[x][y]];***
                    }
    }
    else
    {
    if (bricks[x][y].alpha > 0) 
        bricks[x][y].alpha -= 0.1;
        }
    }
}
        if (!there_are_solid_bricks) {
        [theTimer invalidate]; 
        isPlaying = NO;
        lives = 0;

        messageLabel.text = @"You Win!"; 
        messageLabel.hidden = NO;
    }       


    if (ball.center.y >= paddle.center.y - 16 && ballMovement.y < 0) { 
        ball.center = CGPointMake(ball.center.x, paddle.center.y - 16);
    } else if (ball.center.y <= paddle.center.y + 16 && ballMovement.y > 0) {
        ball.center = CGPointMake(ball.center.x, paddle.center.y + 16);
    } else if (ball.center.x >= paddle.center.x - 32 && ballMovement.x < 0) {
        ball.center = CGPointMake(paddle.center.x - 32, ball.center.y);
    } else if (ball.center.x <= paddle.center.x + 32 && ballMovement.x > 0) {
        ball.center = CGPointMake(paddle.center.x + 32, ball.center.y);
    }
 }

    if(ball.center.x > 300 || ball.center.x < 20)
        ballMovement.x = -ballMovement.x;

    if (ball.center.y < 32)

        ballMovement.y = -ballMovement.y;

    if (ball.center.y > 444) {
        [self pauseGame];
        isPlaying = NO;
        lives--;
        livesLabel.text = [NSString stringWithFormat:@"%d", lives];

        if (!lives) {
            messageLabel.text = @"Game Over";
        } else {
            messageLabel.text = @"Ball Out of Bounds";
        }
        messageLabel.hidden = NO;
    }
    if(ball.center.y > 444 || ball.center.y < 40)
        ballMovement.y = -ballMovement.y;

}
- (void)processCollision:(UIImageView *)brick 
{
    score += 10; 
    scoreLabel.text = [NSString stringWithFormat:@"%d", score];

    if (ballMovement.x > 0 && brick.frame.origin.x - ball.center.x <= 4) 
        ballMovement.x = -ballMovement.x;
    else if (ballMovement.x < 0 && ball.center.x - (brick.frame.origin.x + 
brick.frame.size.width) <= 4)
        ballMovement.x = -ballMovement.x;

    if (ballMovement.y > 0 && brick.frame.origin.y - ball.center.y <= 4) 
        ballMovement.y = -ballMovement.y;
    else if (ballMovement.y < 0 && ball.center.y - (brick.frame.origin.y + 
                                                    brick.frame.size.height) <= 4)
        ballMovement.y = -ballMovement.y;
    brick.alpha -= 0.1;
}



/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)DidReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [scoreLabel release];

    [ball release];

    [paddle release];

    [livesLabel release];
    [messageLabel release];

    [super dealloc];
}

@end

I HAVE TWO WARNINGS HERE AT THE @END:

  1. {Incomplete implementation of class 'IVBrickerViewController'}.
  2. {Method definition for'-animateBall:'not found}.

I had changed the .h file from: "-(void)animateBall:(NSTimer *)theTimer;" to: "-(void)gameLogic:(NSTimer *)theTimer;" but i get the same warning: "Method definition for'-gameLogic:' not found"

I would like to thank those who have tried to help me.


Make sure that you have

- (void)processCollision:(UIImageView *)brick;

in your IVBrickerViewController.h file.


Problem is in your header file (.h). There is no correct declaration of processCollision method. Add it to header file.

0

精彩评论

暂无评论...
验证码 换一张
取 消