【问题标题】:How to get RGBA color of a specific pixel in CCSprite如何在 CCSprite 中获取特定像素的 RGBA 颜色
【发布时间】:2012-07-27 09:57:38
【问题描述】:

我正在使用 cocos2d for iPhone v1.0.1 库为 iPhone 编写游戏。为了让我的游戏正常工作,当我知道坐标时,我需要检查 CCSprite 中特定像素的颜色。我一直在寻找解决方案两天,但我没有找到任何工作。也许有人以前做过这个并且知道怎么做?

如果这更容易的话,对我来说另一种可能性是从 CCSprite 创建一个 UIImage...

你好, jarektb

【问题讨论】:

  • 您找到解决问题的方法了吗?
  • 很难说。 Yannick L. 的 aswer 表单并不是我想要的(alpha 问题),当 McDevon 提出我正在做其他事情并且没有时间检查解决方案时。

标签: iphone objective-c cocos2d-iphone ccsprite


【解决方案1】:

显然不能直接访问包含精灵的颜色缓冲区。但是,您可以将精灵绘制到 CCRenderTexture 并从那里读取像素。

location = ccp(x * CC_CONTENT_SCALE_FACTOR(), y * CC_CONTENT_SCALE_FACTOR());

UInt8 data[4];

CCRenderTexture* renderTexture = [[CCRenderTexture alloc] initWithWidth:sprite.boundingBox.size.width * CC_CONTENT_SCALE_FACTOR() 
                                                                 height:sprite.boundingBox.size.height * CC_CONTENT_SCALE_FACTOR() 
                                                            pixelFormat:kCCTexture2DPixelFormat_RGBA8888];

[renderTexture begin];
[sprite draw];

glReadPixels((GLint)location.x,(GLint)location.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);

[renderTexture end];
[renderTexture release];

NSLog(@"R: %d, G: %d, B: %d, A: %d", data[0], data[1], data[2], data[3]);

如果您使用的是 Retina 显示器,则必须考虑内容比例因子。

该解决方案也可以轻松转换为 CCSprite 类别或子类。

这似乎是一个老话题,但我在这里发布了答案,因为这是我刚刚遇到同样困境时谷歌上的第一次点击。

【讨论】:

  • 我怎样才能得到精灵的平均颜色
【解决方案2】:

如果您的精灵在屏幕上可见,您可以使用glReadPixels 函数。它应该看起来像这样(其中第二行的xy 是坐标):

ccColor4B *buffer = malloc(sizeof(ccColor4B));
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
ccColor4B color = buffer[0];

【讨论】:

  • 感谢您的回答。您的解决方案有效,但不完全符合我的需要。因为你从屏幕上读取了一个像素的颜色。当 CCSprite 包含一些透明度时,我得到了背景颜色。我需要能够仅从 CCSprite 获取 RGBA 像素颜色。所以当背景颜色是 RGBA(255,255,255,255) 并且 CCSprite 有 RGBA(255,0,0,127) 我应该得到 RGBA(255,0,0,127) 而你的解决方案给了我 RGBA(255,128,128,255);
  • 嗯,好的。您可以在这里查看CCMutableTexture2Dgithub.com/manucorporat/AWTextureFilter/blob/master/…。它有一个方法名称pixelAt:,它允许您检索代表给定位置像素的ccColor4B
  • 不幸的是,它仍然没有解决我的问题,因为我有一些 CCSprite,我可以从它们那里得到一个 CCTexture2D,但我看不到任何方法可以将它转换为 CCMutableTexture2D。 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2020-07-06
  • 2020-03-26
相关资源
最近更新 更多