いまさらFlappyBirdを作ってみる①

FlappySwiftをios8で実装しているコードを見つけました。

僕がiosを始めてすぐの頃にSwiftでFrappyBirdが作られて、当時簡単と言われていたFrappyBirdですが全然理解できず投げ出しました。

あの頃と比べるとだいぶ成長した気がするので挑戦してみることにしました!

一度に全部まとめるとすごい長さになりそうなので記事を3分割くらいにしようとおもっています。

鳥のクラスを作る

本家はSceneの中に全部書いていましたが、僕は頭がこんがらがって理解できなくなるのでコンポーネントごとに分けていきます。

現状特にむずかしいことはやっておらず、initで重力とアニメーションなどを設定しているのと、fly()メソッドで鳥を上に飛ばすだけです。

class BirdSprite: SKSpriteNode {
    
    init(texture:[SKTexture], animateDuration: Double, position: CGPoint){
        super.init(texture: texture[0], color: .clear, size: texture[0].size())
        physicsBody = SKPhysicsBody(rectangleOf: frame.size)
        setScale(2.0)
        let anim = SKAction.animate(with: texture, timePerFrame: animateDuration)
        let flap = SKAction.repeatForever(anim)
        run(flap)
    }

    required init?(coder aDecoder: NSCoder) {
        //NOP
        fatalError("init(coder:) has not been implemented")
    }
    
    func fly(){
        //速度の更新,これがないとジャンプが一定ではなくなる
        physicsBody?.velocity = CGVector(dx: 0, dy: 0)
        //質量を無視して力を加える
        physicsBody?.applyImpulse(CGVector(dx: 0, dy: 30))
    }
}

ビルドすると、重力が設定されているので↓に鳥が落下していきます。タップすると↑に飛びます

class GameScene: SKScene {
    lazy var bird: BirdSprite = {
        let position = CGPoint(x: self.frame.midX, y: self.frame.midY)
        var birdTexture = [SKTexture(imageNamed: "bird-1"),
                           SKTexture(imageNamed: "bird-2"),
                           SKTexture(imageNamed: "bird-3"),
                           SKTexture(imageNamed: "bird-4")]
        
        
        birdTexture = birdTexture.map{
            //スケールの拡大を行った時にレンダリングで綺麗に補完する
            $0.filteringMode = .nearest
            return $0
        }
        return BirdSprite(texture: birdTexture, animateDuration: 0.2, position: position)
    }()
    
    override func didMove(to view: SKView) {
     //重力の設定
        self.physicsWorld.gravity = CGVector( dx: 0.0, dy: -5.0 )
        self.physicsWorld.contactDelegate = self

        self.addChild(bird)
    }
    
    override func update(_ currentTime: TimeInterval) {}
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        bird.fly()
    }
}

extension GameScene: SKPhysicsContactDelegate {}

タップ時の挙動

その2に続く: いまさらFlappyBirdを作ってみる②

参考文献

fullstackio/FlappySwift

filteringMode