0

(UIImages の) アニメーションを使用するゲームを作成しようとしていますが、(私にとって) 非常に珍しいバグがあります: 2 つの CGRect 間の交差が発生したときに画像をアニメーション化しようとしました。検出は素晴らしいのですが、アニメーションの動作がおかしいです。コードは次のとおりです。

Coin.h : (UIView クラス)

@property (retain) NSArray * imagesCoinEclate;

いくつかのチュートリアルで、エラーが変数の非保持ステータスに起因する可能性があることを読んだので、保持に入れました

Coin.m :

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

CGImageRef imageToSplitEclate = [UIImage imageNamed:@"Coin_Anim2_Spritesheet4x4_110x100.png"].CGImage;

    int x2 = 300;
    int y2 = 0;
    CGImageRef partOfImgEclate1 = CGImageCreateWithImageInRect(imageToSplitEclate, CGRectMake(x2, y2, 100, 110));
    UIImage *imgEclate1 = [UIImage imageWithCGImage:partOfImgEclate1];
    CGImageRelease(partOfImgEclate1);

    ...

    x2 = 0;
    y2 = 330;
    CGImageRef partOfImgEclate16 = CGImageCreateWithImageInRect(imageToSplitEclate, CGRectMake(x2, y2, 100, 110));
    UIImage *imgEclate16 = [UIImage imageWithCGImage:partOfImgEclate16];
    CGImageRelease(partOfImgEclate16);

    _imagesCoinEclate = [NSArray arrayWithObjects:imgEclate1,imgEclate2,imgEclate3,imgEclate4,imgEclate5,imgEclate6,imgEclate7,imgEclate8,imgEclate9,imgEclate10,imgEclate11,imgEclate12,imgEclate13,imgEclate14,imgEclate15,imgEclate16, nil];

 }
    return self;
}

そして、この配列はメソッドで呼び出されます:

-(void)AnimationCoinExplose:(UIImageView *)imageViewCoin withCurrentX:(float)current
{
    [imageViewCoin stopAnimating];
    CGPoint centerCoin;
    centerCoin.x = currentX;
    centerCoin.y = imageViewCoin.center.y - ((imageViewCoin.frame.size.height)/2);
    UIImageView * Explode = [[UIImageView alloc] initWithFrame:CGRectMake(currentX + imageViewCoin.center.x, centerCoin.y, imageViewCoin.frame.size.width + 10, imageViewCoin.frame.size.height + 10)];
     //NSLog(@"CurrentX : %f\nX : %f\nY : %f\nX size : %f\nY size : %f", currentX, currentX + imageViewCoin.center.x, centerCoin.y, imageViewCoin.frame.size.width + 10, imageViewCoin.frame.size.height + 10);
    imageViewCoin.alpha = 0.0f;
    [Explode setAnimationImages:_imagesCoinEclate];
    [Explode setAnimationRepeatCount:1];
    [Explode setAnimationDuration:(1/24)];
    [Explode startAnimating];
    [self addSubview:Explode];
    [Explode release];
    _IntersectionCheck = -1;
}

このメソッドは UIViewController で呼び出され、次のように初期化されます。

View = [[Coin alloc] init];
[self.view addSubview:View];

そして、このような加速度計で使用します:

if (View.IntersectionCheck == -1)
    {
        if (Test.alpha == 1.0f)
        {
            [View CoinIntersection:Test becausePigX:current.x andPigY:current.y];
        }
        if (Test2.alpha == 1.0f)
        {
            [View CoinIntersection:Test2 becausePigX:current.x andPigY:current.y];
        }
    }
    else if (View.IntersectionCheck == 0)
    {

}

Coin.m のすべてのコードをメソッドに入れると、

-(void)AnimationCoinExplose:(UIImageView *)imageViewCoin withCurrentX:(float)current

それは完全に機能しますが、初期化中は機能しません。エラーは「EXC_BAD_ACCESS (コード 1)」であり、デバッグ コンソールでは「Nsarray 概要を利用できません」

ご協力いただきありがとうございます !

4

1 に答える 1

0

いくつかのチュートリアルで、エラーが変数の非保持ステータスに起因する可能性があることを読んだので、保持に入れました

そうです、それはあなたが割り当てを正しく行っていないだけです。

_imagesCoinEclate = [NSArray arrayWithObjects:imgEclate1, ..., nil];

これはインスタンス変数に直接割り当てられ、setter メソッドを回避するため、作成した自動解放されたインスタンスは保持されず (setter がそれを行います)、時期尚早に割り当てが解除されます。代わりにプロパティ セッターを使用し、そうでない場合は魔法を期待しないでください。

self.imagesCoinEclate = [NSArray arrayWithObjects:imgEclate1, ..., nil];

または、ivar を直接使用する場合は、割り当てられた初期化オブジェクトをそれに割り当て、自動解放を回避します。

_imagesCointEclate = [[NSArray alloc] initWithObjects:imgEclate1, ..., nil];

ところで、これら 16 個のオブジェクトの作成をリファクタリングする必要があります。恐ろしいです。

于 2013-03-15T16:51:40.743 に答える