パラパラアニメを実行する「FrameByFrameAnimation」クラス改訂版

Objective-Cでコマ送りアニメーションを実行する「FrameByFrameAnimation」クラスの改訂版です。

主に以下のパラメータを渡して使用します。

  1. アニメーションの種類(終了時のメソッド処理分岐用)
  2. アニメーションのフレーム数
  3. アニメーション画像ファイル名の接頭詞
  4. アニメーションのリピート回数

デリケードメソッドを指定する事もでき、アニメーション終了後に任意のメソッドを呼ぶことができます。

下記よりサンプルのダウンロードが行えます。

サンプルダウンロード

使用方法

1
2
3
4
5
6
7
8
9
10
11
//クラス初期化
FrameByFrameAnimation *fbfAnimation = [[FrameByFrameAnimation alloc] init];

//アニメーション定義
[fbfAnimation setAnimating:animationType //アニメーション名
                          :animationFrames //アニメーションの総フレーム数
                          :animationPrefix //画像ファイル名の接頭詞
                          :animationRepeatNum]; //リピート回数 (0で無限リピート)

//ステージに追加
[self.view addSubview:[fbfAnimation animationImageView]];

サンプルソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//アニメーション開始
- (void)startAnimation
{
    //クラス初期化
    FrameByFrameAnimation *fbfAnimation = [[FrameByFrameAnimation alloc] init];

    //fps変更 (指定がない場合は 24fpsになります)
    [fbfAnimation setFps:24.0f];

    //アニメーション画像のレクタングル指定 (指定がない場合は W320*H480pxになります)
    [fbfAnimation setRectangle:CGRectMake(self.view.center.x - (IMAGE_WIDTH / 2),
                                          self.view.center.y - (IMAGE_HEIGHT / 2),
                                          IMAGE_WIDTH,
                                          IMAGE_HEIGHT)];

    //クラス側のデリゲートに渡す
    fbfAnimation.fa_delegate = (id)self;

    //アニメーションのタイプ (アニメーション終了時の処理を分岐させる時に指定します)
    NSString *animationType = @"sample";

    //アニメーションの総フレーム数
    NSInteger animationFrames = 14;

    //アニメーションファイルの接頭詞
    NSString *animationPrefix = @"frame";

    //アニメーションのリピート回数 (0の場合は無限ループします)
    NSInteger animationRepeatNum = 0;

    //アニメーション開始
    [fbfAnimation setAnimating:animationType
                              :animationFrames
                              :animationPrefix
                              :animationRepeatNum];

    //タグを指定 (省いても問題ありません)
    [fbfAnimation animationImageView].tag = 0;

    //ステージに追加
    [self.view addSubview:[fbfAnimation animationImageView]];
}

ソースコード

FrameByFrameAnimation.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#import <UIKit/UIKit.h>

#define ANIM_FPS                24.0f
#define ANIM_IMAGE_X            0
#define ANIM_IMAGE_Y            0
#define ANIM_IMAGE_WIDTH        320
#define ANIM_IMAGE_HEIGHT       480
#define ANIM_IMAGE_HEIGHT_4INCH 568
#define ANIM_IMAGE_EXT          @"png"

@protocol FrameByFrameAnimationDelegate;

@interface FrameByFrameAnimation : UIImageView {
    id<FrameByFrameAnimationDelegate> _fa_delegate;
}

@property (nonatomic, assign) id<FrameByFrameAnimationDelegate> fa_delegate;
@property (nonatomic, retain) UIImageView *animationImageView;

- (id)init;
- (void)setAnimating:(NSString *)animationType :(NSInteger)animationImageNum :(NSString *)animationImagePrefix :(NSInteger)animationRepeatNum;
- (void)setFps:(float)fps;
- (void)resetFps;
- (void)setRectangle:(CGRect)rect;
- (void)resetRectangle;

@end

#pragma mark delegate prottype
@protocol FrameByFrameAnimationDelegate<NSObject>
@optional

@end

FrameByFrameAnimation.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#import "FrameByFrameAnimation.h"

@implementation FrameByFrameAnimation

@synthesize fa_delegate;
@synthesize animationImageView  = _animationImageView;

NSInteger _animationImageX      = ANIM_IMAGE_X;
NSInteger _animationImageY      = ANIM_IMAGE_Y;
NSInteger _animationImageWidth  = ANIM_IMAGE_WIDTH;
NSInteger _animationImageHeight = ANIM_IMAGE_HEIGHT;
CGFloat   _animationFps         = ANIM_FPS;
NSString *_animationImageExt    = ANIM_IMAGE_EXT;
NSString *_animationType;

//初期化
- (id)init
{
    if(self == [super init]) {
        [self resetFps];
        [self resetRectangle];
    }
    return self;
}

//アニメーション設定
- (void)setAnimating:(NSString *)animationType
                    :(NSInteger)animationImageNum
                    :(NSString *)animationImagePrefix
                    :(NSInteger)animationRepeatNum
{
    //アニメーションの種類を保持
    _animationType = animationType;

    //イメージビュー初期化
    _animationImageView = [[UIImageView alloc] initWithFrame:CGRectMake(_animationImageX,
                                                                        _animationImageY,
                                                                        _animationImageWidth,
                                                                        _animationImageHeight)];

    //最後の画像が消えないようにする
    _animationImageView.image = [self getUIImageFromResources:[self animationImageName:animationImagePrefix:animationImageNum]
                                                          ext:_animationImageExt];

    //画像をタップ可能にする
    _animationImageView.userInteractionEnabled = YES;

    //アニメーションフレームを配列に入れる
    NSMutableArray *animationImageArray = [NSMutableArray array];
    for (int i = 1; i <= animationImageNum; i++) {
        [animationImageArray addObject:[self animationImageName:animationImagePrefix:i]];
    }
    _animationImageView.animationImages = [self animationImages:animationImageArray];

    //アニメーションの秒数を設定
    _animationImageView.animationDuration = [self animationSeconds:animationImageNum];

    //アニメーションのリピート回数を設定
    _animationImageView.animationRepeatCount = animationRepeatNum;

    //アニメーション開始
    [_animationImageView startAnimating];

    //アニメーション終了時のメソッド定義
    [self performSelector:@selector(animationDidFinish:)
               withObject:nil
               afterDelay:_animationImageView.animationDuration];
}

//アニメーション終了時のメソッド
- (void)animationDidFinish:(id)selector
{
    if ([_animationType isEqualToString:@"sample"]) {
        //ここでデリゲートメソッドを呼ぶことができます

    }
}

//fps指定
- (void)setFps:(CGFloat)fps
{
    _animationFps = fps;
}

//fpsリセット
- (void)resetFps
{
    _animationFps = ANIM_FPS;
}

//レクタングル指定
- (void)setRectangle:(CGRect)rect
{
    _animationImageX = rect.origin.x;
    _animationImageY = rect.origin.y;
    _animationImageWidth = rect.size.width;
    _animationImageHeight = rect.size.height;
}

//レクタングルリセット
- (void)resetRectangle
{
    [self setRectangle:CGRectMake(ANIM_IMAGE_X,
                                  ANIM_IMAGE_Y,
                                  ANIM_IMAGE_WIDTH,
                                  ANIM_IMAGE_HEIGHT)];
}

//アニメーション秒数を取得
- (CGFloat)animationSeconds:(NSInteger)animationImageNum
{
    return (animationImageNum / _animationFps);
}

//アニメーション画像を取得
- (NSString *)animationImageName:(NSString *)animationImageSuffix
                                :(int)animationFrame
{
    return ([NSString stringWithFormat:@"%@%@", animationImageSuffix, [NSString stringWithFormat:@"%d", animationFrame]]);
}

//画像ファイル名を配列で取得する
- (NSArray *)animationImages:(NSMutableArray *)animationImageNameList
{
    //画像の配列を作成
    NSMutableArray *imageArray = [NSMutableArray array];
    for (int i = 0; i < animationImageNameList.count; i++) {
        NSString *imageTitle = [animationImageNameList objectAtIndex:i];

        //画像の配列に画像ファイルを追加
        [imageArray addObject:[self getUIImageFromResources:imageTitle
                                                        ext:_animationImageExt]];
    }
    return (imageArray);
}

- (UIImage *)getUIImageFromResources:(NSString*)fileName ext:(NSString*)ext
{
  NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:ext];
  UIImage *img = [[UIImage alloc] initWithContentsOfFile:path];
  return (img);
}

@end

お薦めの参考書

Cocos2d-xスマートフォン2Dゲーム開発講座 Cocos2d-x 3対応
Cocos2d-xを利用したスマートフォン向け3Dゲーム開発の手法を、サンプルを基に作りながら学ぶ事ができます。実際に遊べるゲームサンプルが4種収録されており、iOS / Android両対応のゲームを開発したい方には必見の一冊になっています。

   このエントリーをはてなブックマークに追加

About

Masaki Hirokawa (@dolice_apps)

デザインエンジニア 廣川政樹の開発ブログ。Objective-Cや Javaなど iPhone/Androidアプリ開発に関する技術情報を掲載しています。

iPhone apps

  • リラックス・ヒーリング(無料)
  • 望みが叶う!引き寄せの法則アプリ(無料)
  • ミステリー - 怖い話や不思議な体験、都市伝説まとめ
  • 浮世絵壁紙 - 美しい日本画ギャラリー(無料)
  • 綺麗な壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)
  • クールな壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)

Android apps

  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な高画質壁紙

Objective-C Classes

Tag Cloud

ActionScript(9) ActionScript3(7) Ad(4) Adfurikun(2) AdMob(9) Android(10) Animation(17) AppDelegate(3) ARC(1) ArrayList(1) AVAudioPlayer(4) AVAudioSession(1) AVFoundation(3) Banner(2) Bitmap(1) Camera(4) CGAffineTransform(4) CGBlendMode(2) CGContextRef(1) CGImageRef(1) Classes(44) CLLocationManager(1) ConnectivityManager(1) ContentResolver(1) CoreLocation(2) Delegate(3) Device(7) Display(1) DisplayMetrics(1) Download(101) Facebook(6) Foundation(72) Framework(2) Google Analytics(1) Handler(1) iAd(6) ImageView(1) In-AppPurchase(1) iOS(12) iOS 7(15) iOS 7.1(3) iOS 8(1) iPad(7) iPhone(21) iPhone 6(4) Java(7) JavaScript(2) LINE(4) Localize(1) Magazine(1) MediaStore(1) MFComposeViewController(1) Nend(1) NetworkInfo(1) NSArray(23) NSCalendar(3) NSData(2) NSDate(7) NSDateComponents(2) NSDateFormatter(2) NSDictionary(12) NSEnumerator(1) NSIndexSet(1) NSInteger(6) NSMutableArray(17) NSMutableDictionary(5) NSMutableOrderedSet(7) NSMutableString(4) NSMutableURLRequest(1) NSNotificationCenter(1) NSNumber(1) NSObject(1) NSOrderedSet(7) NSRange(2) NSSelectorFromString(1) NSSet(6) NSString(19) NSTimer(4) NSTimeZone(1) NSURL(7) NSURLConnection(1) NSURLRequest(2) NSUserDefaults(7) NSXMLParser(2) Objective-C(222) PHP(1) Products(14) QuartzCore(3) RSS(2) Runnable(1) Sample(51) Screensaver(9) SDK(2) ShareCompat(1) Social(10) StoreKit(1) Twitter(6) UIAccelerometer(3) UIActionSheet(1) UIActivityIndicator(1) UIActivityIndicatorView(3) UIActivityViewController(1) UIAlertView(5) UIApplication(7) UIButton(4) UIColor(3) UIDatePicker(5) UIDevice(6) UIDeviceOrientation(1) UIEvent(6) UIImage(15) UIImagePickerController(4) UIImageView(12) UIKit(58) UILabel(7) UINavigationBar(4) UINavigationItem(1) UIPasteboard(4) UIScreen(1) UIScrollBar(1) UIScrollView(1) UISlider(3) UIStoryboardSegue(3) UISwitch(1) UITabBar(3) UITableView(4) UITextField(2) UIView(11) UIViewAnimationTransition(1) UIViewController(4) UIWebView(5) WindowManager(1) Xcode(48) Xcode 5(8) Xcode 5.1(2)