2

ゲームアプリケーションを実装しました.シェイク効果で画像の一部の領域をアニメーション化したい.どのように私にアドバイスをお願いします.

編集:私の正確なクエリは次のとおりです:私のゲームアプリケーションには1つの画像があります.今、私は画像のいくつかの領域フレームを選択しています.今、私はiPhoneを振っています.フレーム画像の選択された領域のみがアニメーション化されている必要があります.

4

2 に答える 2

2

ここにスケルトンがあります...その後、提案されたドキュメントで詳細を得ることができます. これは本当に単純ですが、ランダム化があり、独自のイメージでインスタンス化できます。イメージ コンテナーを UIViewController として作成し、メイン (AppDelegate または RootViewController のいずれか) で、viewDidLoad にインスタンスを作成します。AppDelegate でオーバーロードする必要があるメソッド (コードは投稿の最後にあります) で、シェイクを受け取るには、次のようにします。

  • viewWillAppear
  • viewDidAppear
  • viewWillDisappear
  • viewDidDisappear
  • canBecomeFirstResponder
  • なるFirstResponder
  • 次の応答者

viewWillAppear でレスポンダーになり、モーション メソッドが呼び出されるように、デバイス通知を有効にする必要があります (文書化されたバグがあることが確認されています)。

  • motionBegan:withEvent
  • motionEnded:withEvent

私は NSLog(@"%s", FUNCTION );を置くのが好きです。初めて記述したすべてのメソッドでステートメントを使用すると、イベントを取得するために何かが欠けているかどうか、適切に初期化されているかどうかなどをすばやく判断できます。それが私のスタイルです。

AnimatedImage.h isA ViewController

    @interface AnimatedImage : UIViewController {

    UIImageView     *image;
    UILabel         *label;

    float cx;
    float cy;
    float duration;
    float repeat;


}

@property (nonatomic, retain) UIImageView *image;
@property (nonatomic, retain) UILabel *label;

-(id) initWithImageName: (NSString*) imageName;

-(IBAction) shake;

AnimatedImage.m

    #include <stdlib.h>
#define random() (arc4random() % ((unsigned)RAND_MAX + 1))

#import "AnimatedImage.h"


@implementation AnimatedImage

@synthesize image;
@synthesize label;


-(id) initWithImageName: (NSString*) imageName {
    NSLog(@"%s", __FUNCTION__);

    image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];

    return self;             
}


-(IBAction) shake {

    cx = 0.90 + (random() % 10) / 100; // cx = 0.95;
    cy = 0.90 + (random() % 10) / 100; // cy = 0.95;
    duration = ( 5.0 + random() % 10) / 1000.0;
    repeat   = (65.0 + random() % 20); 

    image.transform = CGAffineTransformScale(CGAffineTransformIdentity, cx, cy);

    [UIView beginAnimations: @"identifier" context: @"shake"];
    [UIView setAnimationDelegate:image.superclass];
    [UIView setAnimationDuration: duration]; // 0.008];
    [UIView setAnimationRepeatCount: repeat]; // 85.0];
    [UIView setAnimationRepeatAutoreverses: YES];

    image.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);

    [UIView commitAnimations];
}


-(IBAction) bounce {

    image.transform = CGAffineTransformTranslate(image.transform, -20, -6);

    [UIView beginAnimations: @"identifier" context: @"bounce"];
    [UIView setAnimationDelegate:image.superclass];
    [UIView setAnimationDuration: duration];
    [UIView setAnimationRepeatCount: repeat];
    [UIView setAnimationRepeatAutoreverses: YES];

    image.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);

    [UIView commitAnimations];
}


@end

この「ルートまたはメイン」デリゲートは UIViewController です。単純さを示すために詳細は省略しましたが、初めてのデバッグに不可欠な「トレース」コードはまだ残しています。また、余談ですが、motionEnded イベントだけが必要な場合でも、motionBeganをオーバーロードする必要があると思います。私のアプリが機能しなかったことを思い出してから、motionBegan を追加すると、motionEnded の呼び出しが開始されました。そのようになるのはちょっと理にかなっていますが、それを裏付けるドキュメントはありません。動作を確認した後の簡単な実験で、私のコメントを確認または拒否できます。

- (void)viewDidLoad {
    [super viewDidLoad];
    [super becomeFirstResponder];
    .
    .
    .
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%s: I %s first responder! (%@)", __FUNCTION__, [self isFirstResponder] ? "am" : "am not", self);
    .
    .<created image in this ViewController's NIB using IB>
    .
    someImage   = (UIImageView *) [self.view viewWithTag:TAG_SOMEIMAGE];
    aniImage = [[AnimatedImage alloc] init];
    aniImage.image = someImage;
}


-(void) viewWillAppear: (BOOL) animated{
    NSLog(@"%s", __FUNCTION__);
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver: self 
                                             selector: @selector(receivedRotate:) 
                                                 name: UIDeviceOrientationDidChangeNotification 
                                               object: nil];
}



- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"%s", __FUNCTION__);
    [super becomeFirstResponder];
    assert( [self canPerformAction:@selector(motionEnded:withEvent:) withSender:self] ); 
}


- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s", __FUNCTION__);
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver: self];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"%s", __FUNCTION__);

    [super resignFirstResponder];
}


- (BOOL)canBecomeFirstResponder {
    NSLog(@"%s", __FUNCTION__);
    return YES;
}

- (BOOL)becomeFirstResponder {
    NSLog(@"%s", __FUNCTION__);
    return YES;
}

- (UIResponder *)nextResponder {
    NSLog(@"%s", __FUNCTION__);

    return [self.view superview];
}

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"%s", __FUNCTION__); 
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"%s", __FUNCTION__);

    if( [self isFirstResponder] ) {
        [aniImage shake];
    }
}

このコードは機能しますが、詳細を省略しすぎた場合は、お問い合わせください。役立つ情報を追加します。これは私にとって本当にやりがいのある仕事であり、同じ経験で助けを求めている誰かと共有できることに興奮しています.

于 2009-12-19T05:14:03.857 に答える
0

SDK の最初のサンプルの 1 つである LocateMe サンプル コードを見て、バウンス バックをセンター コードに変更します。

于 2009-12-17T22:11:35.773 に答える