2010-07-18 3 views
3

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

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

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

Так, чтобы проиллюстрировать то, что я говорю о том, базовый уровень будет выглядеть немного что-то вроде этого (уменьшенную) 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 Mayhem alt text

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

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

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

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

+0

Можете ли вы, возможно, поделиться код для использования иллюстратора SVG-файлов для проектирования уровня?Я пытаюсь сделать то же самое, и было бы очень полезно иметь отправную точку. Заранее спасибо, – Salman

+0

Не смотрел на это в течение длительного времени. Это, наверное, очень плохо, но здесь вы ходите http://pastebin.com/HiGZDWTk – gargantuan

ответ

2

Как насчет чего-то промежуточного? В 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; 
} 
+0

, мне потребуется некоторое время, чтобы переварить все это, но из того, что я могу сказать, это похоже на выигрышную идею. веселит. – gargantuan

+0

Рад помочь. Было бы интересно услышать последующую информацию о том, как вы ладите. –

Смежные вопросы