2010-07-18 57 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

相關問題