1

写真は千の言葉の価値があります。これが私のものです:

良いスプライトの隣にあるスプライトを台無しにした

上の図は2つのスプライトを示しています。右中央のスプライトはプレーヤーで、左中央のスプライトはAIプレーヤーです。それらの初期化は両方とも同じsuperClassを使用します。同様の品質のスプライトが表示されるはずです。

ただし、ご覧のとおり、右側のスプライトはどういうわけか歪んでいます。また、一部のアニメーションフレームで、同じスプライトシートの他のスプライトの斑点が上下に表示されていることにも気づきました。プレイヤーのスプライトで変換が行われることはありません。aiスプライトでも実行されるアクション以外のアクションは実行されません。

他の誰かがこれに遭遇しましたか?この問題の言い方すらわかりません;)他に質問はありますか?問い合わせてください!

詳細:Lionで実行されているCocos2d 1.0.0 ..Xcode4.1を使用しています。

コードサンプル:このコードは、CCFiniteTimeActionsを含むNSObjectとCCSpriteの初期化後に実行されます

 NSMutableArray *ww1 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww1 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_left%d.png", string, i]]];
}
CCAnimation* aa1 = [CCAnimation animationWithFrames:ww1 delay:0.1f];
walkLeft = [CCRepeatForever actionWithAction:
            [CCAnimate actionWithAnimation:aa1 restoreOriginalFrame:NO]];

//RIGHT
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [walkAnimFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_right%d.png", string, i]]];
}
CCAnimation *aa2 = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f];
walkRight = [CCRepeatForever actionWithAction:
             [CCAnimate actionWithAnimation:aa2 restoreOriginalFrame:NO]];

//UP

NSMutableArray* ww2 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww2 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_up%d.png", string, i]]];
}
CCAnimation* aa3 = [CCAnimation animationWithFrames:ww2 delay:0.1f];
walkUp = [CCRepeatForever actionWithAction:
          [CCAnimate actionWithAnimation:aa3 restoreOriginalFrame:NO]];

//DOWN
//walkAnimFrames = nil;
//walkAnimation = nil;
NSMutableArray* ww3 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww3 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_down%d.png", string, i]]];
}
CCAnimation* aa4 = [CCAnimation animationWithFrames:ww3 delay:0.1f];
walkDown = [CCRepeatForever actionWithAction:
            [CCAnimate actionWithAnimation:aa4 restoreOriginalFrame:NO]];


//ATTACK ANIMATIONS
animation = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"%@_down0.png", string] ]; 



NSMutableArray* ww4 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww4 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_left_attack%d.png", string, i]]];
}
CCAnimation *qq0 = [CCAnimation animationWithFrames:ww4 delay:0.1f];
meleeLeft = 
[CCAnimate actionWithDuration:0.4 animation:qq0 restoreOriginalFrame:NO];



//RIGHT
NSMutableArray* ww5 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww5 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_right_attack%d.png", string, i]]];
}
CCAnimation *qq1 = [CCAnimation animationWithFrames:ww5 delay:0.1f];
meleeRight = 
[CCAnimate actionWithDuration:0.4 animation:qq1 restoreOriginalFrame:NO];

//UP
NSMutableArray* ww6 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww6 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_up_attack%d.png", string, i]]];
}
CCAnimation *qq2 = [CCAnimation animationWithFrames:ww6 delay:0.1f];
meleeUp = 
[CCAnimate actionWithDuration:0.4 animation:qq2 restoreOriginalFrame:NO];

//DOWN
NSMutableArray* ww7 = [NSMutableArray array];
for(int i = 0; i <= 3; ++i) {
    [ww7 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_down_attack%d.png", string, i]]];
}
CCAnimation *qq3 = [CCAnimation animationWithFrames:ww7 delay:0.1f];
meleeDown = 
[CCAnimate actionWithDuration:0.4 animation:qq3 restoreOriginalFrame:NO];


//****DEATH ANIMATIONS


NSMutableArray* ww8 = [NSMutableArray array];
for(int i = 0; i <= 7; ++i) {
    [ww8 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_left_die%d.png", string, i]]];
}

CCAnimation *qq4  = [CCAnimation animationWithFrames:ww8 delay:0.05f];
deathLeft = 
[CCAnimate actionWithDuration:0.4 animation:qq4 restoreOriginalFrame:NO];



//RIGHT
NSMutableArray* ww9 = [NSMutableArray array];
for(int i = 0; i <= 7; ++i) {
    [ww9 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_right_die%d.png", string, i]]];
}

CCAnimation *qq5 = [CCAnimation animationWithFrames:ww9 delay:0.05f];
deathRight = 
[CCAnimate actionWithDuration:0.4 animation:qq5 restoreOriginalFrame:NO];

//UP
NSMutableArray* ww10 = [NSMutableArray array];
for(int i = 0; i <= 7; ++i) {
    [ww10 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_up_die%d.png", string, i]]];
}

CCAnimation *qq6 = [CCAnimation animationWithFrames:ww10 delay:0.05f];
deathUp = 
[CCAnimate actionWithDuration:0.4 animation:qq6 restoreOriginalFrame:NO];

//DOWN
NSMutableArray* ww11 = [NSMutableArray array];
for(int i = 0; i <= 7; ++i) {
    [ww11 addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"%@_down_die%d.png", string, i]]];
}

CCAnimation *qq7 = [CCAnimation animationWithFrames:ww11 delay:0.05f];
deathDown = 
[CCAnimate actionWithDuration:0.4 animation:qq7 restoreOriginalFrame:NO];


[sprites addChild:animation];

[walkRight retain];
[walkLeft retain];
[walkUp retain];
[walkDown retain];
[meleeDown retain];
[meleeUp retain];
[meleeLeft retain];
[meleeRight retain];
[deathUp retain];
[deathRight retain];
[deathDown retain];
[deathLeft retain];

[self setDir:newFacing];

変数「sprites」はCCSpriteBatchNodeへのポインターです。バッチノードは1つしかないため、同じバッチノードを指していると確信しています。

ご覧のとおり、このオブジェクトはバッチノードを介して独自のアニメーションをレイヤーに追加します。

動きが発生する方法を投稿します:

moveAction = [CCMoveTo actionWithDuration:0.3 position:ccp(thisDoodad.newX, thisDoodad.newY)];
    if (thisDoodad.animation.visible == NO) {

        id beingVisible = [CCCallFunc actionWithTarget:thisDoodad
                                              selector:@selector(makeVisible)];
        id seq = [CCSequence actions: moveAction, beingVisible, nil];
        [thisDoodad.animation runAction:seq];
    } else {
        [thisDoodad.animation runAction:moveAction];
    }

尋ねた時から、私は次の行を追加しようとしました:

[[animation texture] setAliasTexParameters];

プレーヤーのスプライトからぼかしを取り除きましたが、画像を少し広く伸ばしました。これらのスプライトフレームはそれぞれ32x32pixであり、フレーム全体を埋めるわけではないことは、おそらく言及する価値があります。
さらに、上記のコード行はaiのスプライトの外観に影響を与えませんでした。

*-------* 編集::

それを私が直した。

どうしたの:

スプライトが画面上で移動しようとしている場所を保持する2つのフロートがあります。私の世界の他のすべてのスプライトは、プレイヤーの参照から描画されます。

私の参照中に、floatはintにフォーマットされたため、ゲーム内の他のすべてのスプライトは、位置のintバージョンを受け取りました。

これは私を信じさせます、私のコードのどこかにこれらの2つのフロートを細分化する何かがあるに違いありません。

「半分のピクセル値」のヒントを@jtbandesに感謝します。位置がどのようにして整数以外になったのかはまだわかりませんが:(

とにかく、floatをintに変更すると、すべてが修正されました。

ありがとう!

4

1 に答える 1

0

おそらく、スプライトの位置は150.5ピクセルなどの1/2ピクセル値に揃えられます。これにより、視覚的な歪み/ぼやけが発生する可能性があります。

于 2011-08-19T02:28:48.690 に答える