测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可 | MIT |
发布时间上次发布 | 2014年12月 |
由 未知所有者 维护。
依赖 | |
cocos2d | ~> 2.1 |
DTCoreText | ~> 1.6 |
CZGTextureCreator 是一个基于 cocos2d 的类,允许您绘制多个图像或 Core Text 帧。然后,它将它们打包成一个 CCTexture2D,以便在批节点中使用。
CZGTextureCreator 有两个主要用途。
首先,它允许使用 Core Graphics 绘制纹理帧。CZGTextureCreator 将绘制的一批帧打包成单个纹理,可在精灵中使用。
其次,它使用 Core Text(通过 DTCoreText pod)创建正确排版的文本精灵。CCLabelTTF 更新速度太慢,并且仅限于单字体标签。CCLabelBMFont 或 CCLabelAtlas 更快,但不能正确排版文本。它们将文本作为图像块处理,而不是文本块。不要窃取绵羊!
唯一不希望使用 CZGTextureCreator 与文本的情况是您在快速更改文本,例如在快速变化的计分器中。在其他任何时候,这都应该比标准的 Cocos2d 标签更快速,更有效地使用资源,并且对设计者的眼睛更友好。
感谢 @blackpawn 提供的 包装矩形的伪代码。我在自己的纹理矩形打包算法中使用了它的变体。
CZGTextureCreator 被打包成 cocoapod。最简单的方法是将它添加为项目中的一个 pod。CZGTextureCreator 依赖于已作为 pod 安装的 cocos2d。如果您还没有这样做,我建议在现有项目中添加 cocos2d 作为 pod,然后删除您在设置项目时添加的 cocos2d 文件。
CZGTextureCreator *textureCreator = [[CZGTextureCreator alloc] init];
// Core Graphics drawing example
[textureCreator addFrameWithName: @"redRectangle"
size: CGSizeMake(100,50)
drawingBlock: ^(CGRect rect, CGContextRef ctx) {
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect: CGRectInset(rect, 2.0, 2.0)
cornerRadius: 10.0];
path.lineWidth = 2.0;
CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
[path fill];
[path stroke];
}];
// Simple text drawing
[textureCreator addFrameWithName: @"howdy"
size: CGSizeMake(100,20)
drawingBlock: ^(CGRect rect, CGContextRef ctx) {
CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
[@"howdy" drawInRect: rect withFont: [UIFont boldSystemFontOfSize: 15.0]];
}];
// CZGTextureCreator uses DTCoreText to provide an HTML convenience method.
// Here's an example of creating a single label frame that has formatted HTML text
textureCreator.defaultTextOptions = @{ DTDefaultFontFamily : @"Futura",
DTDefaultTextColor : @"white"};
NSString *htmlText = @"<span style=\"font-size: 16;\">Unladen swallow ground speed: <b>32</b> <i>mph</i></span>";
[textureCreator addFrameWithName: @"html"
size: CGSizeMake(320,200)
htmlText: htmlText];
// Texture creator will then pack the above frames and call the draw blocks for each one.
// It will also add the frame names to the texture frame cache.
CCTexture2D *texture = [textureCreator createTexture];
// Create a batch node so that all sprites drawn from the texture are batched into one draw call
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithTexture: texture];
CCSprite *howdy = [CCSprite spriteWithSpriteFrameName: @"howdy"];
howdy.position = ccp(50,50);
[batchNode addChild: howdy]; // don't forget to add the sprites to the batch node, not self
CCSprite *redRectangle = [CCSprite spriteWithSpriteFrameName: @"redRectangle"];
redRectangle.position = ccp(300,100);
[batchNode addChild: redRectangle];
CCSprite *html = [CCSprite spriteWithSpriteFrameName: @"html"];
html.anchorPoint = ccp(1.0, 0.5);
html.position = ccp(320.0, 200.0);
[batchNode addChild: html];
// Add the completed frame in the top left to see what it looks like:
CCSprite *full = [CCSprite spriteWithTexture: texture
rect: CGRectMake(0,0, texture.pixelsWide, texture.pixelsHigh)];
full.anchorPoint = ccp(0, 1.0);
full.position = ccp(0,300);
full.scale = 0.5;
[batchNode addChild: full];
[self addChild: batchNode];