【问题标题】:xcode and sprite sheet, how to crop an image when multi images exist in one sheetxcode和精灵表,当一张表中存在多张图像时如何裁剪图像
【发布时间】:2012-02-27 19:16:57
【问题描述】:

我知道这是通过网络编程完成的,是否也可以通过 xcode 和 obj-c 完成?我有一个带有两个按钮实例(正常和单击)的精灵表。我知道我可以在 obj-c 中使用 click 功能,但我可以导入一张精灵表并裁剪一部分精灵表(如网站)以在一张精灵表中裁剪图像的所需部分吗?如果是这样,需要哪些功能?你有什么例子可以指点我吗?

【问题讨论】:

  • 你打算如何展示你的精灵?你是把它们放在UIImageView、CALayer 还是别的什么地方?
  • UIImageView,但如果可能是更好的解决方案,请接受其他想法

标签: objective-c cocoa sprite


【解决方案1】:

您可以为此使用CALayer:它比UIImageView 更轻量级,并且使用起来非常简单。这个想法是基于来自this post 的示例,并且是从一个工作项目中提取出来的。

    // "sprites.png" is a 192x128 picture containing two rows of three 64x64 sprites each
    NSString *path = [[NSBundle mainBundle] pathForResource:@"sprites.png" ofType:nil];
    CGImageRef img = [UIImage imageWithContentsOfFile:path].CGImage;
    imgLayer = [CALayer layer];
    imgLayer.contents = (__bridge id)img;
    // Frame defines the position of your sprite inside your view
    imgLayer.frame = CGRectMake(horOffset, verOffset, 64, 64);
    imgLayer.bounds = CGRectMake(0, 0, 64, 64); // The size of an individual sprite
    // Pick the sprite from the top row, left column
    imgLayer.contentsRect = CGRectMake(0, 0, 1.0/3.0, 1.0/2.0);
    // Top row, middle column
    // imgLayer.contentsRect = CGRectMake(1.0/3, 0, 1.0/3.0, 1.0/2.0);
    // Top row, right column
    // imgLayer.contentsRect = CGRectMake(2.0/3, 0, 1.0/3.0, 1.0/2.0);
    // Bottom row, left column
    // imgLayer.contentsRect = CGRectMake(0, 1.0/2, 1.0/3.0, 1.0/2.0);
    // Bottom row, middle column
    // imgLayer.contentsRect = CGRectMake(1.0/3, 1.0/2, 1.0/3.0, 1.0/2.0);
    // Bottom row, right column
    // imgLayer.contentsRect = CGRectMake(2.0/3, 1.0/2, 1.0/3.0, 1.0/2.0);
    [self.layer addSublayer:imgLayer];

【讨论】:

  • 你先生用这段代码给我带来了很多痛苦。 imgLayer.contentsRect 不应该是 64,64 它应该是 1,1.. 您的示例链接中的代码经过仔细检查工作。
  • @LéMuffinManm 非常感谢您的精彩评论!经过仔细检查,我意识到我复制/粘贴了两次contentsRect - 一次代替bounds,一次在正确的位置。现在已修复。谢谢!
  • 谢谢,我搞定了,但我必须说,哇!这肯定让我难以理解。
  • 在我看来,像我们一样在bounds 中指定精灵大小并让contentsRect 采用CGSize 这将是x,y 位置会更自然。它当前的工作方式是在宽度和高度属性中输入一个值,该值与点或像素的比例为 0 - 1。
  • 这有助于解释为什么contentsRect 采用 0 - 1 范围。 stackoverflow.com/questions/10117755/…
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 2018-12-11
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2017-01-11
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多