2013-12-13 26 views
12

Tôi đang cố gắng tạo ra một trò chơi đơn giản với bộ công cụ ma. Ý tưởng cơ bản là có một người chơi có thể nhảy để tránh các khối. Nhưng tôi có một vấn đề tôi không biết làm thế nào để làm cho nó khi người chơi chạm vào khối người chơi biến mất và hoạt hình máu bắt đầu. Trước hết tôi không hiểu mã này mà tôi tìm thấy trên trang web táo.Phát hiện va chạm trong bộ kit giả

static const uint32_t blockCategory = 0x1 <<0; 
static const uint32_t playerCategory = 0x1 <<1; 

Tôi đang gọi hàm didBeginContact và đặt NSLOG ("đã gọi hàm") vào đó. Nhưng tôi không bao giờ nhận được đầu ra trong trình gỡ lỗi của mình.

Đây là _player và _block mã của tôi: - (SKSpriteNode *) nhân vật {

_player = [SKSpriteNode spriteNodeWithImageNamed:@"soldier_run1"]; 
_player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_player.size.width /2 -5]; 
_player.physicsBody.dynamic = YES; 
_player.physicsBody.usesPreciseCollisionDetection = YES; 
_player.physicsBody.friction = 0; 
_player.physicsBody.categoryBitMask = playerCategory; 
_player.physicsBody.collisionBitMask = blokCategory; 
_player.name = @"player"; 
SKAction *animAction = [SKAction animateWithTextures:playerTextures timePerFrame:0.1  resize:YES restore:YES]; 

đang _player của tôi:

[_player runAction:[SKAction repeatActionForever:animAction]]; 

return _player; 
} 
-(SKSpriteNode *)block { 
_blok = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor] size:CGSizeMake(15, 40)]; 

//physics 
_blok.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_blok.size]; 
_blok.physicsBody.dynamic = NO; 
_blok.name = @"block"; 
_blok.physicsBody.categoryBitMask = blokCategory; 
_blok.physicsBody.collisionBitMask = playerCategory; 
SKAction *moveBlock = [SKAction sequence:@[ 
              [SKAction moveToX:-20 duration:2] ]]; 
[_blok runAction:moveBlock ]; 
return _blok; 
} 

Ngoài ra tôi không thực sự hiểu những gì categoryBitMask và collisionBitMask làm. Sau khi tôi làm việc đó, tôi muốn làm cho nhân vật biến mất khỏi màn hình và hoạt hình máu bắt đầu, nhưng tôi không biết làm thế nào để điều đó xảy ra. Tôi nghĩ bạn phải làm điều gì đó như: nếu (_player & & _block didcollide) { } Nhưng tôi không biết cách thực hiện chính xác.

+0

Xem câu trả lời này http://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

Trả lời

18

CategoryBitMask đặt danh mục mà sprite thuộc về, trong khi collisionBitMask đặt danh mục mà sprite có thể va chạm và không truyền qua chúng.

Để phát hiện va chạm, bạn cần đặt contactTestBitMask. Ở đây, bạn thiết lập các loại sprites mà bạn muốn các đại biểu liên lạc được gọi khi tiếp xúc.

Điều bạn đã làm là chính xác. Dưới đây là một vài bổ sung bạn cần làm:

_player.physicsBody.contactTestBitMask = blockCategory; 
_blok.physicsBody.contactTestBitMask = playerCategory; 

Sau đó, thực hiện các đại biểu tiếp xúc như sau:

-(void)didBeginContact:(SKPhysicsContact *)contact` 
{ 
NSLog(@"contact detected"); 

SKPhysicsBody *firstBody; 
SKPhysicsBody *secondBody; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    firstBody = contact.bodyA; 
    secondBody = contact.bodyB; 
} 
else 
{ 
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA; 
} 

//Your first body is the block, secondbody is the player. 
//Implement relevant code here. 

} 

Đối với một lời giải thích tốt về thực hiện phát hiện va chạm, nhìn vào this hướng dẫn.

4

Xử lý xung đột là một chút lộn xộn. :) Có một số cách tiếp cận, nhưng một nơi bạn nên bắt đầu là this ví dụ khá đơn giản từ Apple. Readme cung cấp một giới thiệu tốt, và sau đó bạn có thể bắt đầu poking xung quanh với mã.

Một cách tiếp cận khác (mà Apple đề cập trong hướng dẫn của họ) là sử dụng công văn đôi (xem wikipedia cho một desc dài). Tôi sẽ không bắt đầu bằng cách cố gắng mò mẫm cách tiếp cận đó ngay lập tức. Đó là một cách tiếp cận khá tiên tiến, tùy thuộc vào các bộ chọn động và các kỹ thuật tương tự để cho phép phép thuật diễn ra. Tuy nhiên, ngay cả với báo trước đó, bạn có thể tìm thấy một ví dụ đơn giản mà ai đó cùng nhau tập hợp về cách thực hiện, cùng với rất nhiều mô tả hỗ trợ here.

Các vấn đề liên quan