我有一个使用纹理填充的多边形和glDrawArray(使用本教程中描述的方法:http://www.raywenderlich.com/32954/how-to-create-a-game-like-tiny-wings-with-cocos2d-2-x-part-1)。
我希望能够使用在游戏过程中随机生成的纯色填充多边形。要使用本教程中的技术完成此操作,我需要动态创建一个纯色的纹理(例如,我可能想要生成1x1红色正方形并使用它来填充我的多边形)。
有没有办法在cocos2d中更改纹理的颜色,类似于使用[mySprite changeColor:ccRed]
更改精灵颜色的方式?所以,如果我有我的初始纹理,比如1x1白色方块,有没有办法可以将纹理更改为1x1红色方块?
我已经尝试过使用CCRenderTexture(如本教程中所述:http://www.raywenderlich.com/33266/how-to-create-dynamic-textures-with-ccrendertexture-in-cocos2d-2-x)但是,由于我将填充多个多边形,因此这种方法非常慢。
我也尝试使用以下代码创建纹理:
// fill with solid red
GLubyte buffer[3] = {255, 0, 0};
CCTexture2D *texture = [[CCTexture2D alloc] initWithData:buffer pixelFormat:kCCTexture2DPixelFormat_RGB888 pixelsWide:1 pixelsHigh:1 contentSize:m];
虽然上面的工作相当不错,但它仍然比从CCSprite中获取纹理要慢。基本上,我正在寻找一种尽可能有效地生成动态纹理的方法。
以下是我用来填充多边形的代码:
GLubyte buffer[3] = {arc4random()%256,arc4random()%256,arc4random()%256};
CGSize size;
size.width = 2; size.height = 2;
CCTexture2D *texture = [[CCTexture2D alloc] initWithData:buffer pixelFormat:kCCTexture2DPixelFormat_RGB888 pixelsWide:1 pixelsHigh:1 contentSize:size];
ccTexParams params = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
[texture setTexParameters:¶ms];
ccGLBindTexture2D([texture name]);
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, array); //where array is an array of points defining a polygon
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, array);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)4);
[texture dealloc];
感谢任何帮助。
答案 0 :(得分:1)
也许您正在寻找的是一种可变的纹理?
这是一篇很棒的博客文章,它使用了CCMutableTextures http://www.cocos2d-iphone.org/pixel-based-destructible-ground-with-cocos2d/
这是我的开源项目https://github.com/crebstar/PWNDestructibleTerrain
这是一个开源项目,我在夏天一直致力于创建可破坏的地形环境。我刚刚发布的repo没有物理(很快就会出现),但提供了一个包含sprite可变纹理的界面。它在一个月前开始研究时相当原始,但它演示了如何使用CCMutableTexture类。
大约两年前,Lam Hoang Pham将CCMutableTexture类作为开源发布。我建立在他的图书馆周围,以提供更多绘图实用程序和各种其他小功能。使用CCMutableTexture类的一个警告是你不能使用PVR并且必须使用UIImage来提供纹理。我没有注意到这种方法有很多性能问题。主要问题是你不能使用spritesheet。
无论如何,这里有一些如何使用的例子:
// FROM THE GAME LAYER
[destTerrainSystem drawCircle:ccp(300,100) withRadius:30.0f withColor:ccc4(0, 0, 0, 0)];
[destTerrainSystem drawSquare:ccp(500,100) withRadius:30.0f withColor:ccc4(0, 0, 0, 0)];
// IN DESTTERRAIN
-(void) drawCircle:(CGPoint)circleOrigin withRadius:(float)radius withColor:(ccColor4B)color {
int localXOrigin = circleOrigin.x - self.position.x;
int localYOrigin = self.contentSize.height - (circleOrigin.y - self.position.y);
CCMutableTexture2D * terrainTexture = (CCMutableTexture2D *) [self texture];
[terrainTexture drawCircle:ccp(localXOrigin, localYOrigin) withRadius:radius withColor:color];
if ([delegate shouldApplyAfterEachDraw] || self.applyAfterDraw) [terrainTexture apply];
} // end drawCircle
-(void) drawSquare:(CGPoint)squareOrigin withRadius:(float)radius withColor:(ccColor4B)color {
int localXOrigin = squareOrigin.x - self.position.x;
int localYOrigin = self.contentSize.height - (squareOrigin.y - self.position.y);
CCMutableTexture2D * terrainTexture = (CCMutableTexture2D *) [self texture];
[terrainTexture drawSquare:ccp(localXOrigin, localYOrigin) withRadius:radius withColor:color];
if ([delegate shouldApplyAfterEachDraw] || self.applyAfterDraw)
[terrainTexture apply];
} // end drawSquare
// IN CCMUTABLETEXTURE
-(void) drawCircle:(CGPoint)circleOrigin withRadius:(float)radius withColor:(ccColor4B)color {
/*
Draws a circle. There is some overlap here but it is fairly efficient
*/
int x = radius;
int y = 0;
int radiusError = 1 - x;
while (x >= y) {
// Bottom half
[self drawHorizontalLine:(x + circleOrigin.x) :(circleOrigin.x - x) :(y + circleOrigin.y) withColor:color];
// Top half
[self drawHorizontalLine:(x + circleOrigin.x) :(circleOrigin.x - x) :(circleOrigin.y - y) withColor:color];
// left side
[self drawVerticalLine:(x + circleOrigin.y) endY:(circleOrigin.y - x) atX:(-y + circleOrigin.x) withColor:color];
// right side
[self drawVerticalLine:(x + circleOrigin.y) endY:(circleOrigin.y - x) atX:(y + circleOrigin.x) withColor:color];
y++;
if (radiusError < 0) {
radiusError = radiusError + ((2 * y) +1);
} else {
x--; // Comment this out to draw a square
radiusError = radiusError + (2 * (y - x + 1));
} // end if
} // end while
// Cache the altered col values
for (int col = circleOrigin.x - radius; col <= circleOrigin.x + radius; col++) {
if (col < 0 || col >= size_.width) continue;
[alteredColumns addObject:[NSNumber numberWithInt:col]];
} // end for
} // end draw circle
CCMutableTexture在像素数组(行主存储器)中维护纹理模型。然后,您可以访问,更改和轮询每个像素的属性。修改完阵列后,可以通过调用apply来应用更改。这允许一些灵活性和性能调整,因为适用可能是一个昂贵的电话。
你可以做更多的事情......但这应该是一个很好的起点。两个链接都有关于如何使用CCMutableTexture的示例代码。
希望这有帮助