2009-05-23 4 views
0

Каков минимальный код шаблона, необходимый для настройки вида OpenGL (с необходимыми проекциями, ракурсами и т. Д.) Для рисования 2D-игры?Каков минимальный код шаблона для OpenGL 2D View?

Например, необходимо как минимум сделать Quartz 2D рисунок в настраиваемое представление (и, скажем, загрузить фоновое изображение) выглядит следующим образом:

#import <Cocoa/Cocoa.h> 

@interface MyView : NSView { 
} 

@end 

= = =

#import "MyView.h" 

@implementation MyView 

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    return self; 
} 

- (void)drawRect:(NSRect)rect { 
    CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort]; 
    CGRect frame = CGRectMake(bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height); 
    CFBundleRef mainBundle = CFBundleGetMainBundle(); 
    CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("background"), CFSTR("png"), NULL); 
    CGDataProviderRef provider = CGDataProviderCreateWithURL (url); 
    CGImageRef image = CGImageCreateWithPNGDataProvider (provider, NULL, true, kCGRenderingIntentDefault); 
    CGDataProviderRelease (provider); 
    CGContextDrawImage (myContext, frame, image); 
    CGImageRelease (image); 

    //rest of drawing code here... 
} 

@end 

Будет ли что-либо в шаблоне шаблона отличаться для Open GS ES на iPhone в отличие от использования Open GL на Mac?

+0

О, и, пожалуйста, рекомендации для игровых библиотек, cocos2D et al. Я хочу получить ответ на основе OpenGL. – Hejazzman

ответ

1

Самый простой способ настроить приложение OpenGL на iPhone - создать «приложение OpenGL ES» через Xcode. Он генерирует исходный код шаблона, который вам нужно будет начать.

Вот источник шаблонный я использую для игры OpenGL iPhone:

@implementation EAGLView 

@synthesize context; 

// You must implement this method 
+ (Class)layerClass { 
    return [CAEAGLLayer class]; 
} 

//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: 
- (id)initWithCoder:(NSCoder*)coder { 

    if ((self = [super initWithCoder:coder])) { 
     // Get the layer 
     CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; 

     eaglLayer.opaque = YES; 
     eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; 

     context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; 

     if (!context || ![EAGLContext setCurrentContext:context]) { 
     [self release]; 
     return nil; 
     } 
    } 
    return self; 
} 

- (void)drawView 
{ 
    [EAGLContext setCurrentContext:context]; 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, ScreenWidth, ScreenHeight); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // Setup the coordinate system to use 0,0 as the lower left corner 
    // and 320,480 as the upper right corner of the screen (in portrait mode). 
    glOrthof(0.0f, ScreenWidth, 0.0f, ScreenHeight, -1.0f, 1.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Here is where you draw everything in your world. 
    DrawWorld(); 

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 


- (void)layoutSubviews { 
    [EAGLContext setCurrentContext:context]; 
    [self destroyFramebuffer]; 
    [self createFramebuffer]; 
    [self drawView]; 
} 


- (BOOL)createFramebuffer { 

    glGenFramebuffersOES(1, &viewFramebuffer); 
    glGenRenderbuffersOES(1, &viewRenderbuffer); 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &ScreenWidth); 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &ScreenHeight); 

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { 
     NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
     return NO; 
    } 

    return YES; 
} 


- (void)destroyFramebuffer { 

    glDeleteFramebuffersOES(1, &viewFramebuffer); 
    viewFramebuffer = 0; 
    glDeleteRenderbuffersOES(1, &viewRenderbuffer); 
    viewRenderbuffer = 0; 
} 

- (void)dealloc { 

    if ([EAGLContext currentContext] == context) { 
     [EAGLContext setCurrentContext:nil]; 
    } 

    [context release]; 
    [super dealloc]; 
} 

@end 

В качестве альтернативы this article обеспечивает хорошее прохождение в создании приложения OpenGL ES на iPhone.

0

Будет ли что-нибудь в шаблоне шаблона отличаться для [OpenGL] ES на iPhone, в отличие от использования Open GL на Mac?

Да. На Mac вы должны использовать NSOpenGLView, который является частью набора приложений. У iPhone нет AppKit.

Я не могу сказать более точно, потому что я не разработчик iPhone, но я бы предположил, что вы используете EAGL на iPhone.

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

  • Нет связанных вопросов^_^