2010-07-18 61 views
3

我的小游戏项目是一个基于物理学的平台jobbie,由Chipmunk(通过SpaceManager)在Cocos2d中创建。我需要为Cocos2d-iPhone项目开发图形的策略

我想要一个与典型的瓷砖​​映射关卡设计有点不同的东西,所以我在Illustrator中创建关卡作为SVG文件,然后解析它以创建景观,平台,产卵点等等。非常好,我觉得我可以用这种方式像关卡设计一样有创意。

但是,这种方法只创造了迄今为止的花栗鼠身体和形状。它不能帮助我为景观创建图形。

因此,要说明一下我说的,一个基本的水平看起来有点像这样(按比例缩小) alt text http://www.tomelders.com/bin/leveleg.jpg

的灰色区域将代表景观。

我的第一个想法是在Photoshop中追踪这些级别,并将它们分成512x512 pngs,然后可以将它们放置在物理层之上。但这本能地听起来像是一种非常低效的方式。

背后罗兰多的人已经采取了超级简单的方法,这对他们

alt text http://www.handcircus.com/wp-content/uploads/2008/06/rolando_screen_b.jpg

效果很好,但我想稍微详细地在我的水平,几乎与他们在MX取得的成就Mayhem alt text

我看的越多,我越相信他们正在使用我提到的在所有东西中放置大图像的第一种方法。

所以,我的问题是,有没有人有任何提示或洞察什么样的东西,我应该探索或阅读完成这种东西。到目前为止,我在Cocos2d中创建关卡图形的唯一经验是使用TMXTileMaps。我仍然对游戏开发并不熟悉,所以也许有一些术语和术语来描述我目前的目标,那就是我还不知道。

任何帮助或建议,非常感谢。

PS:我知道问题中的问题是不好的形式,但这里有意义:内存使用背后的数学是什么?有没有一个公式可以用来预测我的图形的内存使用情况。

+0

你能可能共享使用插图SVG文件进行关卡设计的代码?我正在尝试做同样的事情,并且有一个出发点是非常有帮助的。 在此先感谢, – Salman 2011-03-11 13:42:50

+0

很长时间没有看着这个。这可能是非常糟糕的,但是在这里,你去http://pastebin.com/HiGZDWTk – gargantuan 2011-03-10 15:18:56

回答

2

如何介于两者之间?在Cocos2d中,您可以使用纹理来创建您的精灵,您可以通过绘制到图像缓冲区中生成纹理。那会给你两全其美的。您可以使用关卡数据绘制您提到的大型矢量图形的大型512x512图像块,然后使用较小的图形将它们装饰到您心脏的内容中,无论是基于地图中包含的数据还是程序上。这将允许您创建类似MX Mayhem的内容,而无需在您的应用中运输大量的巨型图像文件。 (事实上​​,它不会,如果这是MX混乱是怎么做的让我感到惊讶。)

下面是一些代码,我使用的时刻来完成类似的东西:

- (CGContextRef) createBitmapContextOfSize:(CGSize) size { 
    CGContextRef context = NULL; 
    CGColorSpaceRef colorSpace; 
    void *   bitmapData; 
    int    bitmapByteCount; 
    int    bitmapBytesPerRow; 

    bitmapBytesPerRow = (size.width * 4); 
    bitmapByteCount  = (bitmapBytesPerRow * size.height); 

    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    bitmapData = malloc(bitmapByteCount); 
    if (bitmapData == NULL) { 
     fprintf (stderr, "Memory not allocated!"); 
     return NULL; 
    } 
    context = CGBitmapContextCreate (bitmapData, 
            size.width, 
            size.height, 
            8,  // bits per component 
            bitmapBytesPerRow, 
            colorSpace, 
            kCGImageAlphaPremultipliedLast); 
    CGContextSetAllowsAntialiasing (context,NO); 
    if (context== NULL) { 
     free (bitmapData); 
     fprintf (stderr, "Context not created!"); 
     return NULL; 
    } 
    CGColorSpaceRelease(colorSpace); 
    return context; 
} 

- (UIImage *)drawLevelImage { 

    UIImage *gfx = [UIImage imageNamed:@"gfx.png"]; 
    CGContextRef myBitmapContext = [self createBitmapContextOfSize: CGSizeMake(1024,1024)]; 
    // Preserve alpha 
    CGContextClearRect (myBitmapContext, CGRectMake(0,0,1024,1024)); 

    // Step through your shapes here, and whenever you need to draw something out of your gfx: 
    CGImageRef _imageRef = CGImageCreateWithImageInRect(gfx.CGImage, sourceImageRect); 
    CGContextDrawImage(myBitmapContext, destinationImageRect, _imageRef); 
    CGImageRelease(_imageRef); 
    // The above could be sped up by caching the image refs if you use them more than once. 

    UIImage *result = [UIImage imageWithCGImage: CGBitmapContextCreateImage(myBitmapContext)]; 
    CGContextRelease(myBitmapContext); 
    return result; 
} 
+0

这需要我花一段时间来消化所有这些,但从我可以告诉,这似乎是一个成功的想法。干杯。 – gargantuan 2010-07-19 14:49:05

+0

很高兴帮助。听到关于你如何相处的后续行动会很有趣。 – 2010-07-22 19:28:50