简体   繁体   中英

iOS “View Controller”

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 (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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM