Objective-Cでコマ送りアニメーションを実行するクラス

Objective-Cでコマ送りアニメーションを実行するためのクラスを作成しました。

「アニメーションの総フレーム数」、「画像ファイル名の接頭詞」、「アニメーション秒数」、「アニメーションリピート回数」、「アニメーション画像の座標・寸法」の順にパラメータを渡して使用します。

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

サンプルダウンロード

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
//クラス初期化
FrameByFrameAnimation *fbfAnimation = [[FrameByFrameAnimation alloc] init];
//アニメーション開始
[fbfAnimation setAnimating:animationFrames
                          :animationPrefix
                          :animationDuration
                          :animationRepeatNum
                          :animationImageX
                          :animationImageY
                          :animationImageWidth
                          :animationImageHeight];
//ステージに追加
[self.view addSubview:[fbfAnimation animationImageView]];

ソースコード

ViewController.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
#import "ViewController.h"
#import "FrameByFrameAnimation.h"

@interface ViewController ()

@end

@implementation ViewController

//アニメーションのフレームレート
float const _animationFps = 24.0f;
//アニメーションのリピート回数を無限に指定
NSInteger _animationRepeatNum = 0;
//アニメーションの座標・寸法指定
NSInteger _animationImageX;
NSInteger _animationImageY;
NSInteger const _animationImageWidth = 85;
NSInteger const _animationImageHeight = 120;

- (void)viewDidLoad
{
  [super viewDidLoad];
  //アニメーション開始
  [self startAnimationImage];
}

- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
}

//アニメーション開始
- (void)startAnimationImage
{
  //クラス初期化
  FrameByFrameAnimation *fbfAnimation = [[FrameByFrameAnimation alloc] init];
  //アニメーションの総フレーム数
  NSInteger animationFrames = 14;
  //アニメーションファイルの接頭詞
  NSString *animationPrefix = @"frame";
  //アニメーションをセンターに配置
  NSInteger _animationImageX = (self.view.frame.size.width / 2) - (_animationImageWidth / 2);
  NSInteger _animationImageY = (self.view.frame.size.height / 2) - (_animationImageHeight / 2);
  //アニメーション開始
  [fbfAnimation setAnimating:animationFrames
                            :animationPrefix
                            :[self animationSeconds:animationFrames]
                            :_animationRepeatNum
                            :_animationImageX
                            :_animationImageY
                            :_animationImageWidth
                            :_animationImageHeight];
  //ステージに追加
  [self.view addSubview:[fbfAnimation animationImageView]];
}

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

@end

FrameByFrameAnimation.h

1
2
3
4
5
6
7
8
9
10
11
#import <UIKit/UIKit.h>

@interface FrameByFrameAnimation : UIImageView

@property (nonatomic, retain) UIImageView *animationImageView;

- (void)setAnimating:(int)animationImageNum :(NSString *)animationImageSuffix :(float)animationDuration :(int)animationRepeatCount :(NSInteger)animationImageX :(NSInteger)animationImageY :(NSInteger)animationImageWidth :(NSInteger)animationImageHeight;
- (NSArray *)animationImages:(NSMutableArray *)animationImageNameList;
+ (UIImage *)getUIImageFromResources:(NSString*)fileName ext:(NSString*)ext;

@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
#import "FrameByFrameAnimation.h"

@implementation FrameByFrameAnimation

@synthesize animationImageView = _animationImageView;

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
  }
  return self;
}

//アニメーション設定
- (void)setAnimating:(int)animationImageNum :(NSString *)animationImageSuffix :(float)animationDuration :(int)animationRepeatCount :(NSInteger)animationImageX :(NSInteger)animationImageY :(NSInteger)animationImageWidth :(NSInteger)animationImageHeight
{
  //UIImageView初期化
  _animationImageView = [[UIImageView alloc]
                         initWithFrame:CGRectMake(animationImageX,
                                                  animationImageY,
                                                  animationImageWidth,
                                                  animationImageHeight)];
  //アニメーションフレームを配列に入れる
  NSMutableArray *animationImageArray = [NSMutableArray array];
  for (int i = 1; i <= animationImageNum; i++) {
    [animationImageArray addObject:[NSString stringWithFormat:@"%@%@", animationImageSuffix, [NSString stringWithFormat:@"%d", i]]];
  }
  _animationImageView.animationImages = [self animationImages:animationImageArray];
  //アニメーションの秒数を設定
  _animationImageView.animationDuration = animationDuration;
  //アニメーションのリピート回数を設定
  _animationImageView.animationRepeatCount = animationRepeatCount;
  //アニメーション開始
  [_animationImageView startAnimating];
  //アニメーション終了時のメソッド定義
  [self performSelector:@selector(animationDidFinish:) withObject:nil
             afterDelay:_animationImageView.animationDuration];
}

//アニメーション終了時のメソッド
- (void)animationDidFinish:(SEL)selector
{
  NSLog(@"Animation is complete");
}

//画像ファイル名を配列で取得する
- (NSArray *)animationImages:(NSMutableArray *)animationImageNameList
{
  //画像の配列を作成
  NSMutableArray *imageArray = [NSMutableArray array];
  for (int i = 0; i < animationImageNameList.count; i++) {
    NSString *imageTitle = [animationImageNameList objectAtIndex:i];
    //画像の配列に画像ファイルを追加
    [imageArray addObject:[FrameByFrameAnimation getUIImageFromResources:imageTitle ext:@"png"]];
  }
  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でゲームを開発したいという方に必携の1冊です。実際にゲームを作りながら学習して行く内容で、とても身に付き易い構成になっています。プログラミング経験はあるけれどゲーム開発は未経験という方にお薦めの内容となっております。

About

Masaki Hirokawa (@dolice_apps)

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

iPhone apps

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