2016-10-25 9 views
8

नोड्स को SKWarpGeometry को लागू करने के लिए मैंने SKSpritenodes पर SKWarpGeometry को लागू करने के लिए कुछ ट्यूटोरियल खोजने के लिए इंटरनेट की गहराई की खोज नहीं की है।स्प्राइटकिट | स्विफ्ट 3 |

मेरे पास एक ट्रैम्पोलिन एसकेएसप्रिटेनोड और एक गेंद एसकेएसप्रिटिनोड है।

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) 

जब गेंद नोड ट्रैम्पोलिन को हिट करता है। मैं trampoline नोड के शीर्ष के अंदर मोड़ना चाहता हूँ। हालांकि निम्नलिखित कोड चलाकर, ट्रैम्पोलिन छवि गायब हो जाती है।

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)    
    } 

मैं ग्रिड नोड्स को गलत स्थापित कर सकता हूं लेकिन मुझे कोई संकेत नहीं है क्योंकि मुझे मार्गदर्शन करने के लिए कोई ट्यूटोरियल नहीं है। क्या किसी ने अभी तक एसकेजीमेट्री का उपयोग किया है?

+2

दुर्भाग्य से मुझे लगता है कि "किसी ने इसका अभी तक उपयोग किया है" का जवाब शायद प्रश्न है, "नहीं"। यह उन सुविधाओं में से एक था कि कोई भी नहीं (15 उपयोगकर्ताओं में से स्प्राइट किट में से) आ रहा है। और इसका उद्देश्य इसकी विशेषताओं से सीमित लगता है। उदाहरण के लिए, युद्ध के राज्यों के बीच कोई आसान समय नहीं है। ऐसा लगता है कि आधा बेक्ड विचार है, आधे बेक्ड कार्यान्वयन के साथ, घास और पेड़ों को बनाने के सरल उद्देश्य के लिए। जब मैंने पहली बार अपनी प्रस्तुति की बात सुनी तो मैं इसके साथ मुलायम निकायों के बारे में उत्साहित था। लेकिन कुछ शोध के बाद, यह निश्चित रूप से इसके लिए सुसज्जित नहीं है। – Confused

+0

क्या स्प्राइटकिट व्यापक रूप से उपयोग नहीं किया जाता है? वाह। बस एक साधारण उदाहरण की आवश्यकता है जैसा कि मैं करना चाहता हूं सिद्धांत में बहुत सरल है। जहां तक ​​मुझे पता है, – user3482617

+2

, शून्य उदाहरण हैं। मैंने इसे थोड़ा सा उपयोग करने के लिए देखा, जैसा कि आप, किसी का भी इसका उपयोग नहीं कर सका। लेकिन मैंने यह भी पाया कि मुझे नहीं लगता कि यह मेरे वांछित उपयोग के लिए है। ऐप्पल सामान के साथ जो मैंने पाया है वह यह है कि यदि यह किसी चीज़ के लिए स्पष्ट रूप से डिज़ाइन नहीं किया गया है, तो इसे अपने सनकी में जोड़ने की कोशिश करना केवल निराशा और क्रोध है। आप इसे इरादे के रूप में इस्तेमाल कर रहे हैं। लेकिन जानना मुश्किल है, क्योंकि ऐप्पल केवल प्रति वर्ष एक बार डेमो बनाने के लिए परेशान होता है। – Confused

उत्तर

8

इसे हल किया गया। उम्मीद है कि यह अन्य लोगों की मदद करता है !!!

//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)) 
}