Что вызывает искажение спрайта, когда шкалы не применяются - PullRequest
1 голос
/ 18 августа 2011

Картинка стоит тысячи слов.Вот мое:

Messed up sprite next to good sprite

Выше изображены два спрайта, один в центре справа - игрок, а другой в центре - игрок ИИ.Обе их инициализации используют один и тот же суперкласс.Мы должны видеть спрайты подобного качества.

Однако, как видите, правый спрайт как-то искажен.Я также заметил множество других спрайтов из того же spriteSheet, которые появляются выше и ниже в некоторых кадрах анимации.Никаких трансформаций на спрайте игрока не происходит.Никакие действия, кроме тех, которые также выполняются над ai-спрайтами, никогда не выполняются.

Кто-нибудь еще сталкивался с этим?Я даже не уверен, как сформулировать эту проблему;) Есть еще вопросы?Пожалуйста, спросите!

Подробности: я использую Cocos2d 1.0.0 .. Xcode 4.1, работающий на Lion.

Примеры кода: Этот код запускается после инициализации объекта NSObject, содержащего CCFiniteTimeActions, и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.Я уверен, что они указывают на один и тот же пакетный узел, поскольку существует только один.

Как вы можете видеть, этот объект добавляет свою собственную анимацию к слою через пакетный узел.

Я будуопубликуйте метод, где происходит движение:

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];

Это избавило игрока от спрайта от размытия, но растянулоизображение слегка широкое.Вероятно, стоит упомянуть, что каждый из этих кадров спрайтов имеет размер 32x32 пикселя и не заполняет весь кадр.
Кроме того, приведенная выше строка кода не влияет на внешний вид спрайтов ai.

* ------- * Редактировать ::

Я исправил это.

Что случилось:

У меня есть два поплавка, которые содержат местоположениеспрайт собирается перейти на экран.Все остальные спрайты в моем мире взяты из справочника игрока.

Во время моей ссылки, float был отформатирован как int, поэтому каждый другой спрайт в игре получил версию позиции int.

Это заставляет меня поверить, что где-то в моем коде должно быть что-то, что дробит эти два числа с плавающей точкой.

Спасибо @jtbandes за подсказку "половинное значение пикселя".Я до сих пор не знаю, как позиция стала чем-то иным, как целое число: (

В любом случае, изменение числа с плавающей точкой на целые все исправило.

Спасибо!

1 Ответ

1 голос
/ 19 августа 2011

Возможно, положение спрайта выровнено до значения в полпикселя, например 150,5 пикселей.Это может вызвать визуальное искажение / размытие.

...