0

単純なゲームを作成中ですが、コードの問題が発生しました。ゲームの仕組みは、ボールが 2 つあるというものです。1 つは敵で、もう 1 つはプレイヤーです。5 秒ごとにゲームの難易度が次のレベルに上がります。私の現在のコードはhereで、以下に複製されています。

//
//  ViewController.m
//  BakerBattle
//
//  Created by Cole Bergmann on 2/6/13.
//  Copyright (c) 2013 Cole Bergmann. All rights reserved.
//

#import "ViewController.h"
#import "SecondView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //(X speed, Y speed) vvv
    pos = CGPointMake(6,5);
    [three setHidden:YES];
    [two setHidden:YES];
    [one setHidden:YES];
    [go setHidden:YES];
    [level1 setHidden:YES];
    [level2 setHidden:YES];
    [level3 setHidden:YES];
}

-(IBAction)start {
    [startbutton setHidden:YES];
    [logo setHidden:YES];
    [instructions setHidden:YES];
    [self performSelector:@selector(three) withObject:nil afterDelay:0.5];

}

-(void)three {
    [three setHidden:NO];
    [self performSelector:@selector(two) withObject:nil afterDelay:0.5];
}

-(void)two {
    [two setHidden:NO];
    [self performSelector:@selector(one) withObject:nil afterDelay:0.5];
}

-(void)one {
    [one setHidden:NO];
    [self performSelector:@selector(go) withObject:nil afterDelay:0.5];
}

-(void)go {
    [go setHidden:NO];
    [self performSelector:@selector(gamestart) withObject:nil afterDelay:0.5];
}

-(void)gamestart {
    [level1 setHidden:NO];
    [three setHidden:YES];
    [two setHidden:YES];
    [one setHidden:YES];
    [go setHidden:YES];
    [logo setHidden:YES];
    pos = CGPointMake(6,5);
    randomMain = [NSTimer scheduledTimerWithTimeInterval:(0.03) target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
    [self performSelector:@selector(difficulty2) withObject:nil afterDelay:5.0];
}

-(void)onTimer {
    [self checkCollision];

    enemy.center = CGPointMake(enemy.center.x+pos.x,enemy.center.y+pos.y);
    if (enemy.center.x > 320 || enemy.center.x < 0)
        pos.x = -pos.x;
    if (enemy.center.y > 480 || enemy.center.y < 0)
        pos.y = -pos.y;
}

-(void)checkCollision {
    if( CGRectIntersectsRect(player.frame,enemy.frame))
    {
        [randomMain invalidate];
        [startbutton setHidden:NO];
        [logo setHidden:NO];
        [three setHidden:YES];
        [two setHidden:YES];
        [one setHidden:YES];
        [go setHidden:YES];
        [level1 setHidden:YES];
        [level2 setHidden:YES];
        [level3 setHidden:YES];
        [instructions setHidden:NO];

        CGRect frame = [player frame];
        frame.origin.x = 137.0f;
        frame.origin.y = 326.0;
        [player setFrame:frame];

        CGRect frame2 = [enemy frame];
        frame2.origin.x = 137.0f;
        frame2.origin.y = 20.0;
        [enemy setFrame:frame2];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"You Lost!" message:[NSString stringWithFormat:@"Baker Cat stole your dough!"] delegate:nil cancelButtonTitle:@"I want a rematch!" otherButtonTitles:nil];
        [alert show];
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *myTouch = [[event allTouches] anyObject];
    player.center = [myTouch locationInView:self.view];
}

//##################################-[DIFFICULTY LEVELS]-##############################################\\

-(void)difficulty2 {
    [level1 setHidden:YES];
    pos = CGPointMake(10,8);
    [self performSelector:@selector(difficulty3) withObject:nil afterDelay:5.0];
    [level2 setHidden:NO];

}

-(void)difficulty3 {
    [level2 setHidden:YES];
    pos = CGPointMake(14,10);
    [self performSelector:@selector(win) withObject:nil afterDelay:5.0];
    [level3 setHidden:NO];

}

-(void)win {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"You Won!" message:[NSString stringWithFormat:@"You defeated Baker Cat!"] delegate:nil cancelButtonTitle:@"Play Again" otherButtonTitles:nil];
    [alert show];
    [randomMain invalidate];
    [startbutton setHidden:NO];
    [logo setHidden:NO];
    [instructions setHidden:NO];
    [three setHidden:YES];
    [two setHidden:YES];
    [one setHidden:YES];
    [go setHidden:YES];
    [level1 setHidden:YES];
    [level2 setHidden:YES];
    [level3 setHidden:YES];

    CGRect frame = [player frame];
    frame.origin.x = 137.0f;
    frame.origin.y = 326.0;
    [player setFrame:frame];

    CGRect frame2 = [enemy frame];
    frame2.origin.x = 137.0f;
    frame2.origin.y = 20.0;
    [enemy setFrame:frame2];
}

@end

レベルを定義する別の方法を誰かが知っているかどうか疑問に思っていました。基本的に、異なるレベルで行う必要があるのは、ゲームが進行中のレベルpos = CGPointMake(10,8);に変更することだけです。levelText

私が現在使用しているものの問題は、プレイヤーが負けた場合、レベルがリセットされないことです。たとえば、誰かがレベル 2 で死ぬと、死亡メッセージが表示されてタイトル画面に移動しますが、その直後に画面上部に「レベル 3」と表示され、プレーヤーが勝ったというメッセージが送信されます。どんな助けでも大歓迎です。

4

1 に答える 1

0

遅延後にセレクターを実行しますが、それらのセレクターをキャンセルしないでください。多くの異なるメソッド名があるため、セレクターによるキャンセルは実行できない可能性があるため、より迅速な解決策 (より多くの副作用がある可能性があります) は、ゲームの状態を終了する (そしておそらく新しいレベル):

[NSObject cancelPreviousPerformRequestsWithTarget:self];

セレクターでキャンセルする必要がある場合は、 を調べて+cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument]ください。

于 2013-02-08T02:09:13.937 に答える