Картинка стоит тысячи слов.Вот мое:
Выше изображены два спрайта, один в центре справа - игрок, а другой в центре - игрок ИИ.Обе их инициализации используют один и тот же суперкласс.Мы должны видеть спрайты подобного качества.
Однако, как видите, правый спрайт как-то искажен.Я также заметил множество других спрайтов из того же 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 за подсказку "половинное значение пикселя".Я до сих пор не знаю, как позиция стала чем-то иным, как целое число: (
В любом случае, изменение числа с плавающей точкой на целые все исправило.
Спасибо!