とりあえずブログ

プログラミングとiPhoneアプリの作り方を勉強中です。

試行錯誤 8 (アニメーション:蝶の動き)

「春の縁側」の昼間の画面では、動きを加えるために蝶がひらひら飛んでくるようにしようと思いました。ʚïɞ.•*¨*•.¸¸
以下はアプリを開いた時の画像です。


本物の蝶の動きを横から見ると、まっすぐ進んでいるわけではなく、上下に不規則にふらふら揺れながら飛んでいるように見えます。
また、羽根も規則正しく開いたり閉じたりしていません。
あまり昆虫のことには詳しくありませんが、パッと見だけでも実際の動きに近づけるために少し工夫しました。

下記の例では、白い蝶と黄色い蝶の2種類どちらかがランダムに現れ、画面の右から左へふわふわと飛んでいくようにしています。
今回はNSTimerを使って蝶を移動させるメソッドを呼び、その中に不規則な上下の動きと羽根の開閉を組み込んでみました。
画像は、白い蝶と黄色い蝶の2種類を用意しておき、名前をwhiteButterfly1と2、yellowButterfly1と2としました。
1は羽根が開いている画像、2は閉じている画像です。

f:id:onetoonewao:20151117025439p:plainf:id:onetoonewao:20151117025742p:plain
f:id:onetoonewao:20151117025246p:plainf:id:onetoonewao:20151117025255p:plain

viewDidLoadで乱数colorを発生させ、どちらの蝶が出てくるかを決めるようにしました。
また、不規則な動きを出すためにメソッド内でも乱数statusを発生させ、羽根の開閉及び蝶の上下の移動方向を決めています。

//
//  ViewController.swift
//  TimerTest
//
//  Created by sakodahiroko on 2015/11/17.
//  Copyright © 2015年 sakodahiroko. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //蝶の色を決める変数
        let color = Int(arc4random_uniform(2))
        
        //蝶のimageView
        let butterfly = UIImageView(frame: CGRectMake(300,260,30,30))
        self.view.addSubview(butterfly)
        
        // タイマーを作る
        NSTimer.scheduledTimerWithTimeInterval(0.07, target: NSBlockOperation(block: {
            
            self.fly(butterfly, color:color)
        
        }), selector: "main", userInfo: nil, repeats: true)
    }

/**
蝶を動かすメソッド

- parameter butterfly: 蝶のimageView
- parameter color: 蝶の色を決める変数
*/
    func fly(butterfly:UIImageView, color:Int){
        
        //羽根の開閉、及び上下の移動方向を決める変数
        let status = Int(arc4random_uniform(2)+1)
        
        //color=0なら白い蝶、1なら黄色い蝶
        butterfly.image = (color == 0) ? UIImage(named: "whiteButterfly\(status).png") : UIImage(named: "yellowButterfly\(status).png")
        
        //蝶のimageViewの中心座標
        var point:CGPoint = butterfly.center
        
        //左に向かって動かす
        point.x -= 2
        
        //乱数statusにより、不規則に上下にふらふらと動かす
        point.y += (status == 1) ? 5 : -3
        
        butterfly.center = point
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


実際のアプリでは、蝶とてんとう虫がランダムに現れ、真ん中あたりのお花のところに止まるようにしています。

また、今後このブログを書くにあたっては、過去のコードをSwiftで書き直しながらアップしていこうと思います。
復習も兼ねられて、一石二鳥です(・ω・)b

*参考にさせていただきました
NSTimerのコールバックをblocksで実装する » rt:anote