ゲームオーバー画面重複アニメ問題解決コードのリファクタリング

リファクタリングとはWikipediaに依れば以下の如く説明されています。

リファクタリング (refactoring) とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである。

さて ゲームオーバー画面で表示されるアニメが重複描画される問題 を解決する為のコードは 目論見を達成するだけの為に動けば宜しいと言う些か力技の過ぎるコードでした。 此れにリファクタリングを施し度実践したのが今回の記事となります。

ゲームオーバーで目を回すウパンダ
スポンサーリンク
日付:2014年4月9日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.2
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:uPanda Breaks Out Fruits

先ずはif文で分岐しているにも関わらず 両ブロックに記されて明らかに冗長の態を為している以下を ブロック外に出して共通処理とします。

  • アニメーション用イメージビューの用意
  • アニメーション用画像をセット
  • アニメーションのリピート回数
  • アニメーションのスタート

然すれば実装コードは以下となりました。

-(void)willRemoveSubview:(UIView *)subview {
  /* ハイスコア・フラグ:アニメーション */
  BOAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  highScoreFlag = [appDelegate.toyBox objectForKey:@"hs_flag"];
  // アニメーション用イメージビューの用意
  CGRect upandaAnimeRect = CGRectMake(110, 330, 105, 120);
  // アニメーション用画像を配列にセット
  NSMutableArray *upandaAnimeImageList = [NSMutableArray array];
  if ([highScoreFlag isEqualToString:@"1"]) {
    /* ハイスコアボードを掲げてハイスコアダンスを踊るウパンダアニメ */
    upandaAnime = [[UIImageView alloc]initWithFrame:upandaAnimeRect];
    upandaAnime.image = [UIImage imageNamed:@"hiscore_dance-1.png"];
    // upandaAnime.tag = 5;
    upandaAnime = (UIImageView *)[self viewWithTag:5];
    // アニメーション用画像を配列にセット
    for (NSInteger i = 1; i <= 6; i++) {
      NSString *highScoreUpandaImagePath = [NSString stringWithFormat:@"hiscore_dance-%d.png", i];
      UIImage *highScoreUpandaImg = [UIImage imageNamed:highScoreUpandaImagePath];
      [upandaAnimeImageList addObject:highScoreUpandaImg];
    }
    // アニメーションの速度
    upandaAnime.animationDuration = 1.5;
  } else {
    /* 目の回ったウパンダアニメ */
    upandaAnime = [[UIImageView alloc]initWithFrame:upandaAnimeRect];
    upandaAnime.image = [UIImage imageNamed:@"dizzy-1.png"];
    // upandaAnime.tag = 5;
    upandaAnime = (UIImageView *)[self viewWithTag:5];
    // アニメーション用画像を配列にセット
    for (NSInteger i = 1; i <= 8; i++) {
      NSString *dizzyUpandaImagePath = [NSString stringWithFormat:@"dizzy-%d.png", i];
      UIImage *dizzyUpandaImg = [UIImage imageNamed:dizzyUpandaImagePath];
      [upandaAnimeImageList addObject:dizzyUpandaImg];
    }
    // アニメーションの速度
    upandaAnime.animationDuration = 2.0;
  }
  // アニメーション用画像をセット
  upandaAnime.animationImages = upandaAnimeImageList;
  // アニメーションのリピート回数
  upandaAnime.animationRepeatCount = 0;
  // アニメーションのスタート
  [upandaAnime startAnimating];
}

又冗長なのは一度だけ処理される -(void)didMoveToSuperview メソッドに於いてはアニメーション用イメージビューの用意をして 差し替えられる元だけ用意する処理に変更すれば更にコードは洗練されるでしょう。

-(void)didMoveToSuperview {
  // アニメーション用イメージビューの用意
  CGRect upandaAnimeRect = CGRectMake(110, 330, 105, 120);
  upandaAnime = [[UIImageView alloc]initWithFrame:upandaAnimeRect];
  upandaAnime.image = [UIImage imageNamed:@"dizzy-1.png"];
  upandaAnime.tag = 5;
  [self addSubview:upandaAnime];

以上を以て大分コードのステップ数が減りました。 タグ指定に依るUIImageView差し替えの参考にしたのはサイト Learn iPhone, iOS, Objective-c, Swift, cocos2dx and ….? の2013年2月7日の記事 Objective-C - UIImageViewの画像を変更する - です。

又Tagを以てUIViewを識別する手法の導入に役立った参考サイトを以下に列挙しましょう。 viewWithTag メソッドは入れ子になったビューにもアクセス可能となるようです。

uPanda Breaks Out Fruits
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 4.12
リリース: 2014年9月15日
更新: 2022年4月20日
サイズ : 10.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。

1件のコメント

コメントは受け付けていません。