2016-10-25 20 views
8

Przeszukałem internet, aby znaleźć kilka samouczków dotyczących implementacji SKWarpGeometry na SKSpritenodes bezskutecznie.Spritekit | Swift3 | Zastosowanie SKWarpGeometry do węzłów

Mam trampolinę SKSpritenode i piłkę SKSpritenode.

ballNode = childNode(withName: "ballNode") as? SKSpriteNode 
    ballNode?.physicsBody = SKPhysicsBody(circleOfRadius: (ballNode?.frame.size.width)!/2) 
    ballNode?.physicsBody?.isDynamic = true 
    ballNode?.physicsBody?.usesPreciseCollisionDetection = true 
    ballNode?.zPosition = 3 
    ballNode?.physicsBody!.categoryBitMask = PhysicsCategory.ballCategory 
    ballNode?.physicsBody!.contactTestBitMask = PhysicsCategory.trampolineCategory 
    ballNode?.physicsBody!.collisionBitMask = PhysicsCategory.platformCategory 
    ballNode?.physicsBody?.velocity = CGVector(dx: 0.0, dy: 0.0) 
    ballNode?.move(toParent: _gameNode) 

enumerateChildNodes(withName: "trampoline") {trampolineNode,_ in 
    trampoline = trampolineNode as? SKSpriteNode 
    trampolineNode.physicsBody = SKPhysicsBody.init(rectangleOf: CGSize(width: (trampoline?.size.width)!, height: (trampoline?.size.height)!)) 
    trampolineNode.physicsBody?.categoryBitMask = PhysicsCategory.trampolineCategory 
    trampolineNode.physicsBody?.contactTestBitMask = PhysicsCategory.ballCategory 
    trampolineNode.physicsBody?.collisionBitMask = PhysicsCategory.ballCategory 
    trampolineNode.physicsBody?.affectedByGravity = false 
    trampolineNode.physicsBody?.isDynamic = false 
    trampolineNode.physicsBody?.usesPreciseCollisionDetection = true 
    trampolineNode.physicsBody?.restitution = 1 
    trampolineNode.move(toParent: _gameNode) 

Gdy kula uderzy w trampolinę. Chcę, aby górna część węzła trampolinowego zgięła się do środka. Jednak po uruchomieniu następującego kodu obraz trampoliny znika.

if collision == PhysicsCategory.ballCategory | PhysicsCategory.trampolineCategory { 
     let src = [float2(0.0), float2(1.0), float2(2.0), 
        float2(3.0), float2(4.0), float2(5.0), 
        float2(6.0), float2(7.0), float2(8.0)] 

     let dst = [float2(0.0), float2(0.0), float2(2.0), 
        float2(3.0), float2(1.0), float2(5.0), 
        float2(6.0), float2(7.0), float2(8.0)] 

     warpGrid = SKWarpGeometryGrid(columns: 2, rows: 2, 
             sourcePositions: src, 
             destinationPositions: dst) 
     // 
     trampoline?.warpGeometry = warpGrid  <---This line removes the trampoline image, so I could only assume its the way I set up the source and destination points. 

     let transform = SKAction.warp(to: warpGrid!, duration: 1) 
     let transformAction = SKAction.repeat(transform!, count: 1) 
     trampoline?.run(transformAction)    
    } 

mogę być ustawienie siatki węzłów źle, ale nie mam pojęcia, jak nie ma tutoriale do mnie poprowadzi. Czy ktoś jeszcze użył SKGeometry?

+2

Niestety, myślę, że odpowiedź na pytanie "ktoś jeszcze użył tego jeszcze" jest prawdopodobnie "nie". To była jedna z tych funkcji, których nikt (z 15 użytkowników Sprite Kit) nie widział. Jego cel wydaje się ograniczony. Na przykład między stanami osnowy nie ma okresów luzowania. Wydaje się, że jest to pomysł na pół upieczony, z mniej niż na pół upieczoną implementacją, z prostego celu, jakim jest tworzenie kołyszących się traw i drzew. Kiedy po raz pierwszy wysłuchałem ich prezentacji, byłem podekscytowany robieniem miękkich ciał. Ale po pewnych badaniach z pewnością nie jest na to wyposażony. – Confused

+0

Czy spritekit nie jest tak szeroko stosowany? łał. Wystarczy prosty przykład, ponieważ to, co chcę zrobić, jest w teorii proste. – user3482617

+2

o ile mi wiadomo, jest zero przykładów. Spróbowałem go użyć na trochę, tak samo jak ty, nie mogłem znaleźć nikogo, kto by go używał. Ale odkryłem również, że nie sądzę, że jest to przeznaczone do mojego pożądanego użycia. To, co znalazłem w przypadku Apple, to to, że jeśli nie jest to specjalnie zaprojektowane do czegoś, próba połączenia go z twoimi kaprysami to tylko frustracja i wściekłość. Możesz używać go zgodnie z przeznaczeniem. Ale trudno o tym wiedzieć, ponieważ Apple raz na jakiś czas stara się zrobić demo raz do roku. – Confused

Odpowiedz

8

Rozwiązał problem. Mam nadzieję, że to pomaga innym ludziom !!!

//Create your SKSpritenodes 
ballNode = childNode(withName: "ballNode") as? SKSpriteNode 
ballNode?.physicsBody = SKPhysicsBody(circleOfRadius: (ballNode?.frame.size.width)!/2) 
ballNode?.physicsBody?.isDynamic = true 
ballNode?.physicsBody?.usesPreciseCollisionDetection = true 
ballNode?.zPosition = 3 
ballNode?.physicsBody!.categoryBitMask = PhysicsCategory.ballCategory 
ballNode?.physicsBody!.contactTestBitMask = PhysicsCategory.trampolineCategory 
ballNode?.physicsBody!.collisionBitMask = PhysicsCategory.platformCategory 
ballNode?.physicsBody?.velocity = CGVector(dx: 0.0, dy: 0.0) 
ballNode?.move(toParent: _gameNode) 

enumerateChildNodes(withName: "trampoline") {trampolineNode,_ in 
trampoline = trampolineNode as? SKSpriteNode 
trampolineNode.physicsBody = SKPhysicsBody.init(rectangleOf: CGSize(width: (trampoline?.size.width)!, height: (trampoline?.size.height)!)) 
trampolineNode.physicsBody?.categoryBitMask = PhysicsCategory.trampolineCategory 
trampolineNode.physicsBody?.contactTestBitMask = PhysicsCategory.ballCategory 
trampolineNode.physicsBody?.collisionBitMask = PhysicsCategory.ballCategory 
trampolineNode.physicsBody?.affectedByGravity = false 
trampolineNode.physicsBody?.isDynamic = false 
trampolineNode.physicsBody?.usesPreciseCollisionDetection = true 
trampolineNode.physicsBody?.restitution = 1 
trampolineNode.move(toParent: _gameNode) 

    // Declare the following SKWarpGeometryGrids 
    var trampolineWarpGrid: SKWarpGeometryGrid? 
    var trampolineNoWarpGrid: SKWarpGeometryGrid? 

    // For 2x2 grid - State the source positions 
    let sourcePositions: [vector_float2] = [ 
     vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), 
     vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), 
     vector_float2(0, 1), vector_float2(0.5, 1), vector_float2(1, 1) 
    ] 

    // For 2x2 grid - State the destination positions 
    // To make the dent, I changed row 3 column 2 value from (0.5, 1) to (0.5, 0.8) 
    let destinationPositions: [vector_float2] = [ 
     vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), 
     vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), 
     vector_float2(0, 1), vector_float2(0.5, 0.8), vector_float2(1, 1) 
    ] 

    //Create the 2x2 warp grid based on the source and destination positions 
    trampolineWarpGrid = SKWarpGeometryGrid(columns: 2, rows: 2, 
            sourcePositions: sourcePositions, 
            destinationPositions: destinationPositions) 

    //Create and assign a Grid to the SKSpritenode that has no warp effects 
    //Will be used to convert the trampoline back to original view 
    trampolineNoWarpGrid = SKWarpGeometryGrid(columns: 2, rows: 2) 
    trampoline?.warpGeometry = trampolineNoWarpGrid 

func didBegin(_ contact: SKPhysicsContact) { 
    let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    if collision == PhysicsCategory.ballCategory | PhysicsCategory.trampolineCategory { 
    //Transform the trampoline grid to show dent 
    let transform = SKAction.warp(to: trampolineWarpGrid!, duration: 0.3) 
    //Warp the trampoline gird back to normal 
    let transformBack = SKAction.warp(to: trampolineNoWarpGrid!, duration: 0.3) 
    //Run Action 
    let transformAction = SKAction.sequence([transform!, transformBack!]) 
    trampoline?.run(SKAction.repeat(transformAction, count: 1)) 
}