Мне нужна стратегия для разработки графики для проекта Cocos2d-iPhone - PullRequest
3 голосов
/ 18 июля 2010

Мой маленький игровой проект представляет собой физическую платформу, созданную с помощью Chipmunk (через SpaceManager) в Cocos2d.

Я хотел что-то немного отличающееся от типичного дизайна уровней, отображаемых плиткой, поэтому я создаю уровни в виде файлов SVG в Illustrator, которые затем разбираю для создания ландшафта, платформ, точек появления и т. Д. И т. Д. ну, и я чувствую, что могу быть настолько креативным, насколько захочу, с дизайном уровней таким образом.

Однако, этот подход до сих пор только создает тела и формы бурундука. Это не помогает мне, когда дело доходит до создания графики для таких вещей, как пейзаж.

Итак, чтобы проиллюстрировать, о чем я говорю, базовый уровень будет выглядеть примерно так (уменьшен) альтернативный текст http://www.tomelders.com/bin/leveleg.jpg

Серые области будут представлять ландшафт.

Моей первой мыслью было проследить эти уровни в Photoshop и нарезать их на 512x512 pngs, которые затем можно было бы положить поверх физического слоя. Но это инстинктивно звучит как очень неэффективный путь.

ребята, стоящие за Rolando, выбрали очень простой подход, который хорошо им подходит

альтернативный текст http://www.handcircus.com/wp-content/uploads/2008/06/rolando_screen_b.jpg

Но мне бы хотелось немного больше деталей в моих уровнях, почти так же, как в MX Mayhem. alt text

На что я больше смотрю, тем больше я убежден, что они используют первый упомянутый мной подход - наложение больших изображений поверх всего.

Итак, мой вопрос: есть ли у кого-нибудь какие-либо советы или понимание того, какие вещи я должен изучать или читать, чтобы выполнить такие вещи. До сих пор мой единственный опыт создания графики уровня в Cocos2d был с TMXTileMaps. Я все еще новичок в разработке игр, так что, возможно, есть какой-то жаргон и терминология, чтобы описать то, к чему я стремлюсь, я просто пока не знаю.

Любая помощь или совет с благодарностью.

PS: я знаю, что вопросы в вопросах - это дурной тон, но здесь есть смысл: в чем смысл использования памяти? Есть ли формула, которую я могу использовать, чтобы выяснить использование памяти моей графикой заранее.

1 Ответ

2 голосов
/ 19 июля 2010

Как насчет чего-то промежуточного? В Cocos2d вы можете создавать свои спрайты, используя текстуру, которую вы можете создать, рисуя в буфере изображений. Это дало бы вам лучшее из обоих миров. Вы можете использовать данные уровня для рисования больших кусков изображения 512x512, которые вы упомянули, с большими векторными фигурами для областей местности, но затем использовать меньшую графику, чтобы украсить их по своему усмотрению, либо на основе данных, которые вы включили в карту, либо процедурно , Это позволит вам создать что-то наподобие того, что есть у MX Mayhem, не отправляя в ваше приложение множество гигантских графических файлов. (На самом деле, меня не удивит, если именно так поступит MX Mayhem.)

Вот код, который я сейчас использую для выполнения чего-то похожего:

- (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...