代码之家  ›  专栏  ›  技术社区  ›  gargantuan

我需要一个为Cocos2d iPhone项目开发图形的策略

  •  3
  • gargantuan  · 技术社区  · 16 年前

    我的小游戏项目是一个物理平台Jobbie,由Chipmunk(通过SpaceManager)在Cocos2d中创建。

    我想要一些不同于A-典型的瓷砖映射水平设计的东西,所以我在Illustrator中创建了SVG文件的水平,然后我解析它来创建景观、平台、繁殖点等。它工作得很好,我觉得我可以用这种方式来创造我想要的水平设计。

    然而,这种方法目前只创建花栗鼠的身体和形状。在为风景之类的东西创建图形时,它对我没有帮助。

    所以为了说明我所说的,一个基本的层次看起来有点像这样(按比例缩小) alt文本http://www.tomelders.com/bin/levelg.jpg

    灰色区域代表风景。

    我的第一个想法是在photoshop中跟踪这些级别,然后将它们切成512x512 PNG,然后将其放置在物理层的顶部。但这听起来是一种非常低效的方式。

    罗兰多背后的人采取了一种非常简单的方法,对他们来说效果很好。

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

    但我希望在我的水平上有更多的细节,几乎类似于他们在MX混乱中所取得的成就。

    我看得越多,我就越相信他们使用了我提到的第一种方法,即在所有东西的顶部放置大型图像。

    所以,我的问题是,是否有人对我应该探索或阅读什么样的东西来完成这类事情有任何建议或洞察?到目前为止,我在cocos2d中创建级别图形的唯一经验是使用tmxtilemaps。我对游戏开发还是个新手,所以也许有一些术语和术语来描述我的目标,我只是还不知道。

    非常感谢您的帮助或建议。

    附言:我知道问题中的问题形式不好,但这里讲得通:内存使用背后的数学原理是什么?有没有一个公式可以用来计算我的图形的内存使用。

    我想要一些不同于A-典型的瓷砖映射水平设计的东西,所以我在Illustrator中创建了SVG文件的水平,然后我解析它来创建景观、平台、繁殖点等。它工作得很好,我觉得我可以用这种方式来创造我想要的水平设计。

    然而,这种方法目前只创建花栗鼠的身体和形状。在为风景之类的东西创建图形时,它对我没有帮助。

    所以为了说明我所说的,一个基本的层次看起来有点像这样(按比例缩小) alt text http://www.tomelders.com/bin/leveleg.jpg

    灰色区域代表风景。

    我的第一个想法是在photoshop中跟踪这些级别,然后将它们切成512x512 PNG,然后将其放置在物理层的顶部。但这听起来是一种非常低效的方式。

    罗兰多背后的人采取了一种非常简单的方法,对他们来说效果很好。

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

    但我希望在我的水平上有更多的细节,几乎类似于他们在MX混乱中所取得的成就。 alt text

    我看得越多,我就越相信他们使用了我提到的第一种方法,即在所有东西的顶部放置大型图像。

    所以,我的问题是,是否有人对我应该探索或阅读什么样的东西来完成这类事情有任何提示或洞察?到目前为止,我在cocos2d中创建级别图形的唯一经验是使用tmxtilemaps。我对游戏开发还是个新手,所以也许有一些术语和术语来描述我的目标,我只是还不知道。

    非常感谢您的帮助或建议。

    附言:我知道问题中的问题形式不好,但这里讲得通:内存使用背后的数学原理是什么?有没有一个公式我可以用来计算内存使用我的图形在前面。

    1 回复  |  直到 15 年前
        1
  •  2
  •   cc.    16 年前

    中间有什么吗?在cocos2d中,可以使用纹理创建精灵,可以通过绘制到图像缓冲区中来生成纹理。这会让你两全其美。您可以使用级别数据为地形区域绘制您提到的带有大矢量形状的大512x512图像块,然后使用较小的图形将其装饰到您的心脏内容,这可以基于您的地图中包含的数据,也可以按程序进行。这将允许您创建类似MX Mayem的东西,而无需随您的应用程序发送大量巨大的图像文件。(事实上,如果这就是MX Mayem的做法,我也不会感到惊讶。)

    下面是我目前正在使用的一些代码来完成类似的工作:

    - (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;
    }
    
    推荐文章