0

1) SKScene ヘッダーにデリゲート プロトコルを設定します。

@interface WorldScene : SKScene <SKPhysicsContactDelegate>

2) デリゲートを物理世界に設定します。

- (id) init
{
    self = [super init];
    if (self)
    {
        self.physicsWorld.gravity = CGVectorMake(0,0);
        self.physicsWorld.contactDelegate = self;
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    }
    return self;
}

3) ビットマスクを設定します。

static const uint32_t playerCategory  =  0x1 << 0;
static const uint32_t wallsCategory  =  0x1 << 1;
static const uint32_t endCategory  =  0x1 << 2;

4) 私は自分のプレーヤーを作ります:

    SKSpriteNode *player = [[SKSpriteNode alloc] initWithColor:[SKColor blueColor] size:CGSizeMake(PLAYERSIZE, PLAYERSIZE)];
player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size];
player.name = @"player";
player.physicsBody.dynamic = YES;
player.physicsBody.categoryBitMask = playerCategory;
player.physicsBody.collisionBitMask = wallsCategory;
player.physicsBody.contactTestBitMask = endCategory;

5) エンド タイルを作成します。

SKSpriteNode *tile = [[SKSpriteNode alloc] initWithColor: [SKColor whiteColor] size:CGSizeMake(TILESIZE,TILESIZE)];

if ([cell isEnd]){
    tile.color = [SKColor greenColor];
    tile.name = @"endTile";
    tile.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: tile.size];
    NSLog(@"END TILE OF SIZE %f x %f", tile.size.width, tile.size.height);
    tile.physicsBody.dynamic = YES;
    tile.physicsBody.affectedByGravity = NO;
    tile.physicsBody.categoryBitMask = endCategory;
    tile.physicsBody.collisionBitMask = 0;
    tile.physicsBody.contactTestBitMask = playerCategory;

}

6) しかし、これは決して呼び出されません! :(

- (void)didBeginContact:(SKPhysicsContact *)contact
{

    NSLog(@"Touched!");
    [self removeAllChildren];
}

迷路ゲームを作っています。プレイヤーは現在、すべての壁に問題なく衝突していますが、最後のタイルに到達したときにゲームを終了させたいです。現在、連絡先イベントは呼び出されていません。何が問題なのかよくわかりません。デバッガーの出力をすべての出力を表示するように設定しています (とにかくイベントに到達した場合は、すべての子を削除する必要があります)。

どうして

4

1 に答える 1

0

SOLVED -- turns out init was never being called, so the delegate was not actually being set. Moved all the init code to - (void) didMoveToView:(SKView *)view and it began working just fine.

于 2014-01-11T04:30:12.797 に答える