SKTexture 返回错误的大小?
Posted
技术标签:
【中文标题】SKTexture 返回错误的大小?【英文标题】:SKTexture returns wrong size? 【发布时间】:2013-10-09 10:36:11 【问题描述】:我有一个图像图集,它们是 80 x 80。但是 SKTexture 说有些帧是 33x80,尽管它们显然是 80x80。怎么了?我的动画在运行时看起来很不对劲。
代码如下:
SKTextureAtlas *myAtlas = [SKTextureAtlas atlasNamed:@"my"];
NSInteger numberOfImages = [run.textureNames count];
NSLog(@"atlas: %@", myAtlas);
for (int i = 0; i < numberOfImages; i++)
NSString *textureName = [NSString stringWithFormat:@"walk%.2d", i];
SKTexture *temp = [myAtlas textureNamed:textureName];
[self.runningFrames addObject:temp];
日志记录返回:
<SKTextureAtlas> 'my' 16 textures:
(
"<SKTexture> 'walk00.png' (33 x 80)",
"<SKTexture> 'walk01.png' (80 x 80)",
"<SKTexture> 'walk02.png' (33 x 80)",
... omitted
)
这是为什么呢?我的动画完全失控,它从一边移动到另一边,等等。
【问题讨论】:
walk one 是否有很多透明空间 (alpha) 区域?请参阅此视频,了解我为什么问youtube.com/watch?v=TDwSR3e6nN0 @Smick 是的,它有很多 alpha。所以我应该为我的所有图像添加 1% 的 alpha 作为背景以避免这种情况?这似乎是一个 hack 是的,是个黑客,所以我会做视频中那个人所做的事情。 我不喜欢视频的链接,例如 Youtube 现在没有加载。你能说一下他是做什么的吗? 我观看了视频以寻求有关同一问题的帮助,但视频中的人所做的正是 Dvole 提出的 hack。 【参考方案1】:我找到了解决问题的方法。我正在使用方法制作动画
[self.player runAction:[SKAction repeatActionForever:[SKAction animateWithTextures:self.runningFrames timePerFrame:0.05 resize:NO restore:YES]] withKey:@"playerRunning"];
将 resize 更改为 YES 解决了我的所有问题。
【讨论】:
干得好!我在 SKTextureAtlas 中寻找东西,没想到在 SKAction 中寻找。必须用这种方法做一些测试。 太棒了!!!这也解决了我的问题,谢谢!但仍然不明白为什么..我只是做 animateWithTextures:timePerFrame: ,一开始一切正常,但一段时间后开始出现问题..【参考方案2】:尽管这个问题相当老,但在我的跑步者中仍然存在碰撞检测问题。之前我曾经使用过这样的方法:
- (CGRect)collisionBoundingBox
return self.frame;
但是,尽管“调整大小”标志(ios 7.1),SKAction 或其他东西似乎改变了我的精灵的框架。一旦我将实现更改为:
- (CGRect)collisionBoundingBox
CGFloat x = self.position.x;
CGFloat y = self.position.y;
CGFloat w = self.texture.size.width;
CGFloat h = self.texture.size.height;
return CGRectMake(x - w / 2, y - h / 2, w, h);
它工作得很好,因为 texture.size 是恒定的!无论如何,我认为这是一个小故障 - 我不希望某些引擎改变我的精灵的框架!
【讨论】:
以上是关于SKTexture 返回错误的大小?的主要内容,如果未能解决你的问题,请参考以下文章
我的 SKTexture 尺寸不适合我的 SKSpriteNode
如何在没有 SKTexture 的情况下更改 didBeginContact 中的 SKSpriteNode 大小和颜色?
SpriteKit SKTexture.preloadTextures 高内存使用 Swift