0

私は Objective-C と iPhone のプログラミングに非常に慣れていません (ただし、C# のバックグラウンドはもう少しあります)。

私は現在、ミニ プラットフォーム ゲームを作成しようとしています。各プラットフォームを個別にチェックして、プレーヤーが交差するかどうかを確認する代わりに、それを処理する配列と for ステートメントを作成したいと考えています。(私が間違っている場合は修正してください。ただし、C#NSMutableArrayの機能によく似ているようです)List

うまくいくと思うものを入力しましたが、うまくいきませんでした。なぜですか?私@interfaceは持っています:

@interface ViewController : UIViewController
{
    NSMutableArray *platforms;
    UIImageView *platform1;
    UIImageView *platform2;
    UIImageView *platform3;
    UIImageView *platform4;
    UIImageView *platform5;
    UIImageView *player;
}

@property (nonatomic) NSInteger GameState;
@property IBOutlet UIImageView *player;
@property IBOutlet UIImageView *platform1;
@property IBOutlet UIImageView *platform2;
@property IBOutlet UIImageView *platform3;
@property IBOutlet UIImageView *platform4;
@property IBOutlet UIImageView *platform5;

そして、私の @implementation には次のものがあります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1.0/60 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];
    gravity = CGPointMake(0,0.195);
    [platforms addObject:platform1];
    [platforms addObject:platform2];
    [platforms addObject:platform3];
    [platforms addObject:platform4];
    [platforms addObject:platform5];
}

- (void)gameLoop
{
    playerVelocity = CGPointMake(playerVelocity.x,playerVelocity.y + gravity.y);
    player.center = CGPointMake(player.center.x + playerVelocity.x,player.center.y + playerVelocity.y);
    for(UIImageView *platform in platforms)
    {
        if(CGRectIntersectsRect(platform.frame,player.frame))
        {
           BOOL check = YES; //break point here to check if it reaches this point
        }
    }    
}

また、単に入力すると:

if(CGRectIntersectsRect(platform1.frame,player.frame))
{
    BOOL doubleCHECK = YES;
}

できます。

4

2 に答える 2

2

プラットフォーム配列の割り当てに失敗しました。Objective-C のすべてのオブジェクトはポインタであるため、おそらくviewDidLoadメソッドには次のようなコード行が必要です。

platforms = [[NSMutableArray alloc] init];
于 2013-07-11T19:52:19.373 に答える
0

ループの前に確認platformsすると、 であることがわかると思いますnil。使用する前に作成する必要があります (viewDidLoadビューが読み込まれる前に必要でない限り、おそらく最適な場所です)。また、一部の言語とは異なり、null オブジェクトを操作すると、例外がスローされるのではなく、暗黙のうちに 0 が返されます。

于 2013-07-11T19:52:33.257 に答える