2016-05-27 7 views
0

をsublassing、私は次のコードでSpriteKitベースからSKSpriteNodeクラスをサブクラス化しよう:IOS - スウィフト2.2 - SpriteKitベース - iOSのパズルゲームプロジェクトについてSKSpriteNodeクラス

class SKPuzzle: SKSpriteNode { 
var name2:String = ""; 
} 

私はSKSpriteNode内の他の変数を追加する必要がありますこの場合、別の名前(name2)のようになります。ここで私はクラス型SKSceneにクラスで作られた使用である:

class GameScene: SKScene { 

let background = SKSpriteNode(imageNamed: "BW") 
var selectedNode = SKPuzzle() 

override init(size: CGSize) { 
super.init(size: size) 

let imageNames = [sheet.Puzzle13() , sheet.Puzzle19(),sheet.Puzzle30(), 
sheet.Puzzle11(), sheet.Puzzle29(), sheet.Puzzle35() ] 

for i in 0..<imageNames.count { 
let imageName = imageNames[i] 

let sprite = SKPuzzle(texture: imageName) 

sprite.name = kAnimalNodeName 
sprite.name2 = "\(i)" 

let offsetFraction = (CGFloat(i) + 1.0)/(CGFloat(imageNames.count) + 1.0) 

sprite.position = CGPoint(x: size.width * offsetFraction, y: size.height/2) 
sprite.zPosition = 1 

background.addChild(sprite) 

} 

} 

私はサブクラスSKPuzzleのウィッヒからスプライトオブジェクトは新しい変数名2が含まれています。プログラムの後半で使用

sprite.name2 = "\(i)" 

私が持っている問題は(で作成した)変数selectedNodeのある

var selectedNode = SKPuzzle() 

常にデータ名とname2のnilの値が含まれています。私はゲームのジグソーパズルの部分をクリックすると、私は次のエラーを取得する:

致命的なエラー:次の関数で任意の値をアンラップながらunexpectly nilが見つかりました

func panForTranslation(translation : CGPoint) { 

let position = selectedNode.position 

if selectedNode.name! == kAnimalNodeName { 
selectedNode.position = CGPoint(x: position.x + translation.x * 2, y: position.y + translation.y * 2) 


} 
} 

selectedNodeのが唯一のゼロ値を含むと思われます。私がSKSpriteNodeを使用しているのにSKPuzzleクラスで失敗したとき、コードは正常に動作しています。ここで

は、プログラムの全体のコードです:あなたの助けを事前による

import SpriteKit 
import UIKit 

private let kAnimalNodeName = "puzzle" 
private let kdancing = "dancing" 

class SKPuzzle: SKSpriteNode { 
var name2:String = ""; 
} 

class GameScene: SKScene { 



let background = SKSpriteNode(imageNamed: "BW") 
var selectedNode = SKPuzzle() 
var selectedVideo = SKVideoNode() 



override init(size: CGSize) { 
super.init(size: size) 

// 1 
self.background.name = kdancing 
self.background.anchorPoint = CGPointZero 
background.zPosition = 0 
self.addChild(background) 
//background.play() 

// 2 
let sheet = Statiques() 

let sprite_dancing1 = SKSpriteNode(texture: sheet.Dancing1()) 
let sprite_dancing2 = SKSpriteNode(texture: sheet.Dancing2()) 
sprite_dancing1.name = kdancing 
sprite_dancing2.name = kdancing 


sprite_dancing1.position = CGPoint(x: 837, y: 752) 
sprite_dancing1.zPosition = 1 
sprite_dancing2.position = CGPoint(x: 1241, y: 752) 
sprite_dancing2.zPosition = 1 

background.addChild(sprite_dancing1) 

background.addChild(sprite_dancing2) 



let imageNames = [sheet.Puzzle13() , sheet.Puzzle19(), sheet.Puzzle30(), sheet.Puzzle11(), sheet.Puzzle29(), sheet.Puzzle35() ] 

for i in 0..<imageNames.count { 
let imageName = imageNames[i] 

let sprite = SKPuzzle(texture: imageName) 

sprite.name = kAnimalNodeName 
sprite.name2 = "\(i)" 

let offsetFraction = (CGFloat(i) + 1.0)/(CGFloat(imageNames.count) + 1.0) 

sprite.position = CGPoint(x: size.width * offsetFraction, y: size.height/2) 
sprite.zPosition = 1 

background.addChild(sprite) 

} 

} 

required init?(coder aDecoder: NSCoder) { 
fatalError("init(coder:) has not been implemented") 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    for touch: AnyObject in touches { 
    let positionInScene = touch.locationInNode(self) 
     selectNodeForTouch(positionInScene) 
     } 
} 


override func didMoveToView(view: SKView) { 

    let gestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePanFrom:")) 
    self.view!.addGestureRecognizer(gestureRecognizer) 
} 

func handlePanFrom(recognizer : UIPanGestureRecognizer) { 

    if recognizer.state == .Began { 
     var touchLocation = recognizer.locationInView(recognizer.view) 
     touchLocation = self.convertPointFromView(touchLocation) 

     self.selectNodeForTouch(touchLocation) 
    } else if recognizer.state == .Changed { 
     var translation = recognizer.translationInView(recognizer.view!) 
     translation = CGPoint(x: translation.x, y: -translation.y) 

     self.panForTranslation(translation) 

     recognizer.setTranslation(CGPointZero, inView: recognizer.view) 
    } else if recognizer.state == .Ended { 

    } 
} 

func degToRad(degree: Double) -> CGFloat { 
    return CGFloat(degree/180.0 * M_PI) 
} 

func selectNodeForTouch(touchLocation : CGPoint) { 
    // 1 
    let touchedNode = self.nodeAtPoint(touchLocation) 

    if touchedNode is SKPuzzle { 
     // 2 
     if !selectedNode.isEqual(touchedNode) { 
      selectedNode.removeAllActions() 
      selectedNode.runAction(SKAction.rotateToAngle(0.0, duration: 0.1)) 

      //selectedNode = touchedNode as! SKSpriteNode 

      // 3 
      if touchedNode.name! == kAnimalNodeName { 
       let sequence = SKAction.sequence([SKAction.rotateByAngle(degToRad(-4.0), duration: 0.1), 
        SKAction.rotateByAngle(0.0, duration: 0.1), 
        SKAction.rotateByAngle(degToRad(4.0), duration: 0.1)]) 
       selectedNode.runAction(SKAction.repeatActionForever(sequence)) 
      } 
     } 
    } 
} 



func panForTranslation(translation : CGPoint) { 
    let position = selectedNode.position 

    if selectedNode.name! == kAnimalNodeName { 
     selectedNode.position = CGPoint(x: position.x + translation.x * 2, y: position.y + translation.y * 2) 


    } 
} 

} 

おかげで、私は、iOS上でスウィフトでコーディングし始めています。

答えて

0

SKPuzzle()によってselectedNodeが作成された場合、nameはゼロです。

selectedNode.nameには、initの方法で値を設定する必要があります。

関連する問題