SpriteKit 3 시도, 충돌 시도.

8320 단어 SwiftSpriteKit

4저번 화구가 부딪혔을 때 화염을 뿌려 사라지도록 한다.
GameScene.swift

//SKPhysicsContactDelegateを追加
class GameScene: SKScene, SKPhysicsContactDelegate {

  override func didMoveToView(view: SKView) {
        //衝突イベントの為必ず必要
        self.physicsWorld.contactDelegate = self
        /* 無重力にする */
        self.physicsWorld.gravity = CGVectorMake(0,0);

        /* Setup your scene here */
        let myLabel = SKLabelNode(fontNamed:"Chalkduster")
        myLabel.text = "Hello, World!";
        myLabel.fontSize = 65;
        myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
        self.addChild(myLabel)

        let sprite = SKSpriteNode(color: UIColor.orangeColor(), size: CGSizeMake(300, 300))
        sprite.position = CGPoint(x:700, y:CGRectGetMidY(self.frame))
        sprite.lightingBitMask = 1
        //衝突イベントには必須
        sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
        sprite.physicsBody?.categoryBitMask = 0x1 << 0
        sprite.physicsBody?.contactTestBitMask = 0x1 << 1
        sprite.physicsBody?.dynamic = false

        self.addChild(sprite)
    }

벽화 블록을 설정하다.physics Body 설정해 드릴게요.
처음엔 physics Body에 사이즈를 맞추는 걸 깜빡했더니 오랜만에 만져서 고민이에요.사이즈 설정이 왜 필요해요?좀 편한 것도 있는 것 같아요.
   override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */

        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)

            let firePath = NSBundle.mainBundle().pathForResource("MyParticle", ofType: "sks")

            var fire = SKEmitterNode()
            fire = NSKeyedUnarchiver.unarchiveObjectWithFile(firePath!) as SKEmitterNode

            fire.particleSize = CGSize(width: 70, height: 70)
            fire.position = location
            //衝突イベントに必須
            fire.physicsBody = SKPhysicsBody(rectangleOfSize: fire.particleSize)
            fire.physicsBody?.contactTestBitMask = 0x1 << 0
            fire.physicsBody?.categoryBitMask = 0x1 << 1

            var line = CGPathCreateMutable()
            CGPathMoveToPoint(line, nil, location.x, location.y)
            CGPathAddLineToPoint(line, nil, location.x + 1000, location.y)

            let follow = SKAction.moveByX(-1000, y: -350, duration: 3.5)
            let follow2 = SKAction.moveByX(1500, y: 0, duration: 3.5)

            fire.particleAction = follow
            fire.runAction(follow2)

            self.addChild(fire)

        }

화염의 렌즈는 벽 캐릭터와 마찬가지로 physics Body를 설정한다.
   //衝突時のイベント
    func didBeginContact(contact: SKPhysicsContact) {

        let firePath = NSBundle.mainBundle().pathForResource("Spark", ofType: "sks")

        var fire = SKEmitterNode()
        fire = NSKeyedUnarchiver.unarchiveObjectWithFile(firePath!) as SKEmitterNode
        fire.position.x = contact.contactPoint.x
        fire.position.y = contact.contactPoint.y + 30
        fire.numParticlesToEmit = 80
        self.addChild(fire)

        //このメソッドを上書きすると衝突したイベントの衝突後の処理を書かねばならない
        if(contact.bodyA.categoryBitMask > contact.bodyB.categoryBitMask){
            contact.bodyA.node?.removeFromParent()
        } else {
            contact.bodyB.node?.removeFromParent()
        }
    }

충돌할 때 불꽃이 튀는 공연이 있다.이를 수행하고자 SKPhysics Contact Delegate 프로토콜을 구현했습니다.부딪힌 후에는 화염을 꺼야 한다.
그나저나 벽 캐릭터의 네모난 설정
sprite.physicsBody?.dynamic = false
라는 부분을 리뷰한 뒤 벽이 렌즈와 부딪히는 기세로 움직인다.
이참에 불에 무게를 더하면 타격 기세를 뽐낼 수 있다.
fire.physicsBody?.mass = 20         

좋은 웹페이지 즐겨찾기