【问题标题】:NSOpenGLView Cocoa (again)NSOpenGLView Cocoa(再次)
【发布时间】:2011-03-22 12:02:35
【问题描述】:

我是整个 Cocoa/Objective-C 的新手(但在 *nix 上有多年的 C/C++ 经验)。

我正在尝试创建一个充满 NSOpenGLView 的基本 Cocoa 应用程序。我有:

chink.mm

#import <OpenGL/gl.h>
#import "chink.h"

@implementation chinkView

@synthesize window;

- (void) applicationDidFinishLaunching : (NSNotification *)aNotification {
    NSLog(@"Danger, Will Robinson! Danger!");
}

- (void) dealloc
{
    [window release];
    [super dealloc];
}

@end

和 chink.h

@interface chinkView : NSOpenGLView {

    NSWindow *window;

}


@property (assign) NSWindow *window;


@end

我有一个像这样的 .xib 设置

https://skitch.com/cront/ri625/chinkxib

“chink View”设置为窗口和文件所有者的委托。

我收到“invalid drawable”错误(甚至在应用程序完成启动之前),据我了解,这意味着它试图在窗口之前实例化 opengl 视图(尽管我可能错了)。

我想要的是创建窗口并在其中设置opengl视图的问题的解决方案。完成此操作后,我编写 OGL 绝对没有问题(就像我说的,我知道 C++),但是所有这些 NS 调用 gunk 对我来说都是陌生的。

我不是在寻找“你为什么不在 SDL/GLUT 中这样做”的答案。只是让它正确创建窗口的代码。

【问题讨论】:

    标签: cocoa opengl xcode4 nsopenglview


    【解决方案1】:

    好的,所以我放弃了这种方法。

    走了很长一段路,改成这样:

    chink.mm

    #import <Cocoa/Cocoa.h>
    #import <OpenGL/OpenGL.h>
    #import <OpenGL/gl.h>
    #import <OpenGL/glu.h>
    
    #import "chink.h"
    
    
    @implementation chinkNS
    
    - (id)initWithFrame:(NSRect)frameRect
    {
        NSOpenGLPixelFormat * pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:(NSOpenGLPixelFormatAttribute[]) {
            NSOpenGLPFAWindow,
            NSOpenGLPFADoubleBuffer,
            NSOpenGLPFADepthSize, 32,
            nil
        }];
        if(pixelFormat == NULL)
            NSLog(@"pixelFormat == NULL");
        [pixelFormat autorelease];
    
        self = [super initWithFrame:frameRect pixelFormat:pixelFormat];
        if(self == NULL) {
            NSLog(@"Could not initialise self");
            return NULL;
        }
    
        [[self openGLContext] makeCurrentContext];
        [self initGL];
    
        return self;
    }
    
    - (void)awakeFromNib
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillMiniaturize:) name:NSWindowWillMiniaturizeNotification object:[self window]];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:[self window]];
    
        animationTimer = [NSTimer scheduledTimerWithTimeInterval:1/60.0 target:self selector:@selector(timerFired) userInfo:NULL repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:animationTimer forMode:NSEventTrackingRunLoopMode];
        [[NSRunLoop currentRunLoop] addTimer:animationTimer forMode:NSModalPanelRunLoopMode];
        lastTime = [[NSDate date] timeIntervalSince1970];
    }
    
    - (void)drawRect:(NSRect)frame
    {
    
        NSLog(@"Chink is up and running. Let's do this thing!");
    
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0, 1.0, 1.0);
        glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
        glFlush();
    
        [self drawGL];
        [[self openGLContext] flushBuffer];
    
    
    
    }
    
    #pragma mark OpenGL
    
    - (void)initGL { }
    
    - (void)reshapeGL { }
    
    - (void)drawGL { }
    
    - (void)animate:(float)dt { }
    
    #pragma mark Event Handling
    
    - (void)timerFired
    {
        NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
        [self animate:currentTime-lastTime];
        lastTime = currentTime;
    }
    
    
    #pragma mark Loose ends
    
    - (void)setFrame:(NSRect)frame
    {
        [super setFrame:frame];
        [self reshapeGL];
    }
    
    // To get key events
    - (BOOL)acceptsFirstResponder
    {
        return YES;
    }
    
    
    @end
    

    和 chink.h

    @interface chinkNS : NSOpenGLView
    {
    
        NSTimer * animationTimer;
        NSTimeInterval lastTime;
    
    }
    
    - (void)initGL;
    - (void)reshapeGL;
    - (void)drawGL;
    - (void)animate:(float)dt;
    
    @end
    

    .xib 中的设置相同,只是它是一个标准的 NSView,它是我的 opengl 视图的子类。

    我希望有一个更简单、更优雅的设置,但你不能全部赢。

    关闭。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多