【问题标题】:What causes a sprite to be distorted, when no scales are applied当没有应用比例时,是什么导致精灵扭曲
【发布时间】:2011-10-30 02:37:43
【问题描述】:

一张图片胜过一千个字。这是我的:

上面描绘了两个精灵, 中间右边的是玩家,中间左边的是AI玩家。 它们的两个初始化都使用相同的超类。我们应该会看到类似质量的精灵。

但是,如您所见,正确的精灵在某种程度上被扭曲了。我还注意到来自同一 spriteSheet 的其他精灵的斑点出现在某些动画帧的上方和下方。 从未对玩家精灵进行任何转换。除了在 ai sprites 上执行的动作之外,没有任何动作被运行过。

有没有其他人遇到过这种情况?我什至不知道如何表达这个问题;) 还有问题吗?请问!

详情: 我正在使用 Cocos2d 1.0.0.. Xcode 4.1 在 Lion 上运行。

代码示例: 此代码在初始化包含 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 的指针。我确信它们指向同一个批处理节点,因为只有一个。

如您所见,该对象通过批处理节点将自己的动画添加到图层。

我将发布发生移动的方法:

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精灵的外观。

* -------- * 编辑::

我修好了。

发生了什么:

我有两个浮动来保存精灵将要移动到屏幕上的位置。 我的世界中的所有其他精灵都来自玩家的参考。

在我的引用过程中,浮点数被格式化为一个 int,因此游戏中的每个其他精灵都收到了该位置的 int 版本。

这让我相信,在我的代码的某个地方,一定有一些东西将这两个浮点数细分。

感谢@jtbandes 提供“半像素值”提示。我仍然不知道这个位置是如何变成一个整数的:(

无论如何,将浮点数更改为整数可以解决所有问题。

谢谢!

【问题讨论】:

  • 你能展示你的初始化代码吗?也许可以将精灵添加到场景中以用于这两个精灵的精灵?我知道你说它们是一样的,但有些不同。
  • 它看起来可能没有与像素对齐,但我无法确定。
  • @jtbandes “与像素对齐”。什么意思?
  • 我认为精灵的位置可能在半像素值上,例如 150.5 像素。这可能会导致它看起来像那样。
  • @jtbandes 你应该让你的 cmets 成为一个答案,这样 OP 才能接受它。

标签: objective-c cocos2d-iphone ccsprite ccaction


【解决方案1】:

也许精灵的位置对齐到半像素值,例如 150.5 像素。这可能会导致视觉失真/模糊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多