[iOS 8] SpriteKit でミニゲームをつくる #9 トグルボタンみたいなスプライト

トグルボタンみたいなスプライト

ボタンみたいなスプライトを作ったので、ついでにトグルボタンみたいなスプライトも作ってみました。
ゲームアプリを作っているので、サウンドON/OFFボタンなどで使えそうかな、と思います。

で、作ったクラスがこちら。

import SpriteKit

class SpriteToggleButton: SpriteButton {
    
    var onUpTexture:SKTexture!
    var onDownTexture:SKTexture!
    var offUpTexture:SKTexture!
    var offDownTexture:SKTexture!
    
    var on:Bool = true {
        didSet {
            changeUpTexture()
        }
    }
    
    init(button:SKSpriteNode!, atlas:SKTextureAtlas!,
        onUpTexture:String!, onDownTexture:String!,
        offUpTexture:String!, offDownTexture:String!,
        block: dispatch_block_t!)
    {
        super.init(button: button,
            atlas: atlas,
            upTexture: onUpTexture,
            downTexture: onDownTexture,
            block)
        
        self.onUpTexture = self.upTexture
        self.onDownTexture = self.downTexture
        self.offUpTexture = atlas.textureNamed(offUpTexture)
        self.offDownTexture = atlas.textureNamed(offDownTexture)
        
        button.texture = self.onUpTexture
    }
    
    deinit {
        onUpTexture = nil
        onDownTexture = nil
        offUpTexture = nil
        offDownTexture = nil
    }
    
    override func buttonDidTouch(p: CGPoint) {
        if button.containsPoint(p) {
            on = !on
            if (buttonDidTouchBlock != nil) {
                buttonDidTouchBlock()
            }
        }
        changeUpTexture()
    }
    
    override func changeUpTexture() {
        if (on){
            button.texture = onUpTexture
        } else {
            button.texture = offUpTexture
        }
    }
    
    override func changeDownTexture() {
        if (on){
            button.texture = onDownTexture
        } else {
            button.texture = offDownTexture
        }
    }
    
}

前回作った「SpriteButton」クラスを継承して、テクスチャーを変更するところで、ON/OFF分岐させてるだけです。


使い方はこんな感じ。

import SpriteKit

class GameScene: SKScene {
    
    var soundSpriteToggleButton:SpriteToggleButton!
    
    override func didMoveToView(view: SKView) {
        
        // レイヤーを取得する。
        let consoleLayer = childNodeWithName("consoleLayer")
        
        // テクスチャアトラスを取得する。
        let assetsAtlas = SKTextureAtlas(named: "assets")
        
        // スプライトを取得する。
        let soundButton = consoleLayer?.childNodeWithName("giveUpButton") as SKSpriteNode!
        
        // ボタンを生成する。
        soundSpriteToggleButton = SpriteToggleButton(
            button: soundButton,
            atlas: assetsAtlas,
            onUpTexture: "btn_sound_on_up",
            onDownTexture: "btn_sound_on_down",
            offUpTexture: "btn_sound_off_up",
            offDownTexture: "btn_sound_off_down",
            block: soundButtonDidTouch
        )
    }
    
    func soundButtonDidTouch() {
        println("on:\(soundSpriteToggleButton.on)")
    }
    
    override func willMoveFromView(view: SKView) {
        super.willMoveFromView(view)
        
        soundSpriteToggleButton = nil
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        soundSpriteToggleButton.touchesBegan(touches.anyObject() as UITouch)
    }
    
    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        soundSpriteToggleButton.touchesMoved(touches.anyObject() as UITouch)
    }
    
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        soundSpriteToggleButton.touchesEnded(touches.anyObject() as UITouch)
    }
    
    override func touchesCancelled(touches: NSSet, withEvent event: UIEvent) {
        soundSpriteToggleButton.touchesCancelled(touches.anyObject() as UITouch)
    }
}

次回へつづく。ではでは。

完成品はこちら。つみペンギン
つみペンギン stack_penguin_qrcode

姉妹品はこちら。ペンギン陸上-スプリント-
ペンギン陸上-スプリント- athlete_penguin_sprint_qrcode