2014-06-11 15 views
9

Tôi đang làm việc trên trò chơi sprite-kit nơi các nút xuất hiện bên dưới điểm thấp nhất trên màn hình và lực hấp dẫn được đặt để chúng trôi nổi lên đầu màn hình. Tất cả mọi thứ hoạt động hoàn hảo, nhưng nó nhanh chóng bắt đầu làm chậm FPS, và cuối cùng chậm và ổn định trở nên rất chậm. Tôi nghĩ cách để giải quyết này có thể đã được loại bỏ các nút từ phụ huynh sau khi họ muốn qua một điểm, đây là đoạn code tôi sử dụng trong bản cập nhật:Làm thế nào để loại bỏ đúng nút khi ra khỏi giới hạn màn hình?

-(void)update:(CFTimeInterval)currentTime { 

    if (_bubble1.position.y > CGRectGetMaxX(self.frame)+40) { 
     [self removeFromParent]; 
    } 

} 

Và trong trường hợp nó là cần thiết, điều này là làm thế nào tôi sinh ra cho biết bong bóng dưới initWithSize phương pháp:

-(void)didMoveToView:(SKView *)view { 

    [self performSelector:@selector(spawnBubbles) withObject:nil afterDelay:1.0]; 
    [self performSelector:@selector(spawnBubbles1) withObject:nil afterDelay:1.5]; 

} 

-(void)spawnBubbles { 
    randomPosition = arc4random() %260*DoubleIfIpad; 
    randomPosition = randomPosition + 20*DoubleIfIpad; 

    randomNumber = arc4random() %7; 
    randomNumber = randomNumber + 1; 

    myColorArray = [[NSArray alloc] initWithObjects:colorCombo1, colorCombo2, colorCombo3, colorCombo4, colorCombo5, colorCombo6, colorCombo7, colorCombo8, nil]; 
    myRandomColor = [myColorArray objectAtIndex:randomNumber]; 

    _bubble1 = [SKShapeNode node]; 
    [_bubble1 setPath:CGPathCreateWithEllipseInRect(CGRectMake(-25*DoubleIfIpad, -25*DoubleIfIpad, 50*DoubleIfIpad, 50*DoubleIfIpad), nil)]; 
    _bubble1.strokeColor = _bubble1.fillColor = myRandomColor; 
    _bubble1.position = CGPointMake(randomPosition, CGRectGetMinY(self.frame)-60); 
    _bubble1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:20]; 
    _bubble1.physicsBody.categoryBitMask = CollisionBubble; 

    [self addChild:_bubble1]; 

    [self runAction:[SKAction sequence:@[ 
             [SKAction waitForDuration:1.0], 
             [SKAction performSelector:@selector(spawnBubbles) onTarget:self], 
             ]]]; 

} 

làm thế nào tôi có thể làm cho nó để các nút được xử lý đúng cách khi họ rời khỏi màn hình? Và làm thế nào tôi có thể giữ FPS với tốc độ không đổi 60 FPS?

Cảm ơn trước !!

+1

"FPS" chỉ lỏng lẻo liên quan đến số nút. các yếu tố khác sẽ đóng góp cho điều này nhiều hơn. –

+0

Thực sự ?! giống như những gì @BradAllred – user3576196

+0

Bạn chỉ có một bong bóng ivar, bạn sẽ cần phải sử dụng một mảng để truy cập tất cả chúng sau này. Với mã cập nhật của bạn, bạn chỉ có thể xóa bong bóng đã được tạo cuối cùng. Dễ dàng hơn bạn có thể có mỗi bong bóng chạy một hành động tùy chỉnh thường xuyên kiểm tra vị trí của nó và gọi removeFromParent khi cần thiết. – LearnCocos2D

Trả lời

12

Tôi khuyên bạn nên sử dụng tính năng phát hiện liên hệ được tích hợp trong spritekit. Tạo một skspritenode bắt chước một mái nhà có một cơ thể vật lý thiết lập để phát hiện liên lạc với bong bóng. Tạo sự kiện khi tiếp xúc giữa nút mái và nút bong bóng sẽ chỉ xóa bong bóng. Điều này sẽ đảm bảo rằng bong bóng được loại bỏ và bạn duy trì một FPS liên tục.

Ví dụ về sự kiện kêu gọi xúc:

- (void)bubble:(SKSpritenode*)bubble didCollideWithRoof:(SKSpriteNode*)roof{ 
[bubble removeFromParent];} 

dụ phát hiện Liên hệ:

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
SKPhysicsBody *firstBody, *secondBody; 
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    firstBody = contact.bodyA; 
    secondBody = contact.bodyB; 
} 
else 
{ 
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA; 
} 

if (firstBody.categoryBitMask==bubbleCategory && secondBody.categoryBitMask == roofCategory) 
{ 
    [self bubble:(SKSpriteNode*)firstBody.node didCollideWithRoof:(SKSpriteNode*)secondBody.node]; 
}} 

Bubble cần:

_bubble.physicsBody.contactTestBitMask = roofCategory; 

Roof:

SKSpriteNode *roof = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(self.scene.size.width, 1)]; 
roof.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(self.scene.size.width, 1)]; 

    roof.position = CGPointMake(self.scene.size.width/2,self.scene.size.height) 
    roof.physicsBody.dynamic = NO; 
    roof.physicsBody.categoryBitMask = floorCategory; 
    roof.physicsBody.contactTestBitMask = bubbleCategory; 
    [self addChild:roof]; 
4

1/init tài sản physicsBody của cảnh của bạn với đoạn mã sau:

physicsBody = SKPhysicsBody(edgeLoopFromRect: frame) // or CGRectInset(frame, -10, -10) if you need insets 

2/Tạo mặt nạ loại cho cảnh của bạn và các nút sprite của bạn:

let boundaryCategoryMask: UInt32 = 0x1 << 1 
let someNodeCategoryMask: UInt32 = 0x1 << 2 

3/Đặt đúng categoryBitMask, collisionBitMaskcontactTestBitMask cho cảnh và các nút sprite của bạn physicsBody thuộc tính:

// Scene 
physicsBody!.categoryBitMask = boundaryCategoryMask 

// Sprite node 
/* ... */ 
someNode.physicsBody!.categoryBitMask = someNodeCategoryMask 
someNode.physicsBody!.contactTestBitMask = boundaryCategoryMask 
.210

Như một ví dụ, việc thực hiện Swift SKScene sau cho bạn thấy làm thế nào để loại bỏ tất cả các nút sprite mà vượt khung của cảnh của bạn:

class GameScene: SKScene, SKPhysicsContactDelegate { 

    let boundaryCategoryMask: UInt32 = 0x1 << 1 
    let squareCategoryMask: UInt32 = 0x1 << 2 


    override func didMoveToView(view: SKView) { 
     // Scene 
     backgroundColor = SKColor.whiteColor() 
     physicsWorld.contactDelegate = self 
     physicsBody = SKPhysicsBody(edgeLoopFromRect: frame) 
     physicsBody!.categoryBitMask = boundaryCategoryMask 

     // Square 
     let square = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 80, height: 80)) 
     square.zPosition = 0.1 
     square.position = CGPoint(x: size.width/2.0 - square.size.width/2, y: size.height - square.size.height) 
     square.physicsBody = SKPhysicsBody(rectangleOfSize: square.frame.size) 
     square.physicsBody!.dynamic = true 
     square.physicsBody!.affectedByGravity = true 
     square.physicsBody!.categoryBitMask = squareCategoryMask 
     // square.physicsBody!.collisionBitMask = 0 // don't set collisions (you don't want any collision) 
     square.physicsBody!.contactTestBitMask = boundaryCategoryMask // this will trigger -didBeginContact: and -didEndContact: 
     addChild(square) 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     // Check if the array containing the scene’s children is empty 
     println("children: \(children)") 
    } 

    func didBeginContact(contact: SKPhysicsContact) { 
     if contact.bodyA.categoryBitMask == squareCategoryMask { 
      contact.bodyA.node?.removeFromParent() 
      println("square removed") 
     } 

     if contact.bodyB.categoryBitMask == squareCategoryMask { 
      contact.bodyB.node?.removeFromParent() 
      println("square removed") 
     } 
    } 

    func didEndContact(contact: SKPhysicsContact) { 
     /* ... */ 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
    } 

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