1

我的目标是一款游戏,稍后也会在 MacOS 和 iOS 上运行。

第一种方法是在主循环中使用 GLUT:

int main ( int argc, char * argv [] )
{
                                // initialize glut
    glutInit            ( &argc, argv );
    glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowSize  ( 500, 500 );


                                // create window
    glutCreateWindow ( "Simple GLUT Example" );

                                // register handlers
    glutDisplayFunc  ( display );
    glutReshapeFunc  ( reshape );
    glutKeyboardFunc ( key     );
    glutMouseFunc    ( mouse   );
    glutMotionFunc   ( motion  );
    glutIdleFunc     ( animate );

    glutMainLoop ();

    return 0;
}

这可能是一个不错的决定,但我现在没有经验,我如何捕捉用户交互(触摸、鼠标移动等)

第二种方式,我正在调查的是使用 NSOpenGLView 的子类:

    - (void) setupRenderTimer
    {
        NSTimeInterval timeInterval = 0.005;

        renderTimer =  [ NSTimer scheduledTimerWithTimeInterval:timeInterval
                                                          target:self
                                                        selector:@selector( updateGLView: )
                                                        userInfo:nil repeats:YES ];
        [ [ NSRunLoop currentRunLoop ] addTimer:renderTimer
                                        forMode:NSEventTrackingRunLoopMode ];
        [ [ NSRunLoop currentRunLoop ] addTimer:renderTimer
                                        forMode:NSModalPanelRunLoopMode ];
    }


    /*
     * Called by the rendering timer.
     */
    - (void) updateGLView:(NSTimer *)timer
    {
        if( glView != nil )
            [ glView drawRect:[ glView frame ] ];
    }

- (void) awakeFromNib
{
    [ NSApp setDelegate:self ];   // We want delegate notifications
    renderTimer = nil;
    //[self makeFirstResponder:self ];
    glView = [ [ MyOpenGLView alloc ] initWithFrame:[ self.myGLview frame ]
                                          colorBits:16 depthBits:16 fullscreen:FALSE ];
    if( glView != nil )
    {
        [ self.window.contentView addSubview:glView ];
        [ self.window makeKeyAndOrderFront:self ];
        [ self setupRenderTimer ];
    }
    else
        [ self createFailed ];
}  

最后,我喜欢保留 Cocoa IB 的优势(在 IB 中构建所有控件并使其保持在 OpenGL 上下文之前)。在这种情况下,直到现在我还没有找到一个解决方案,它在 MacOS 下运行良好,我可以在 OpenGL 上下文之前使用可可 IB 元素。在 IB 上下文中,总是预先考虑所有元素,使用以下方法破解:

const GLint aValue = 1;
[[self openGLContext] setValues:&aValue
                   forParameter:NSOpenGLCPSurfaceOpacity];

给了我很好的结果设置背景颜色:

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );   // Black background

不起作用:

在此处输入图像描述

我想要求的是: - 以任何方式以第二种方式取得成功(性能原因可能对我未来至关重要,游戏将拥有大的 3d 世界)。如果是,您能否分享一些有用的示例或编写我当前错误的修复程序。

  • 如果第一种方式只有一种方式,那么在一个代码中支持 iOS 和 osx 平台的代码组织是什么(也写一些代码示例)。GLUT 是否可以很好地控制 iOS 的触摸,难以取代所有可可触摸功能,如长按等

  • 我很清楚,我需要做一个特定于平台的更改,但也许你可以分享一些经验,如何更好、更简单地完成它。

PS 我知道我可以使用 GLKit,但不幸的是现在它在 MacOS 上工作得非常糟糕,有已知的错误。

4

1 回答 1

0

如果您愿意花时间做正确的事,我建议您阅读一两本书,教程也会有所帮助。这里有两个非常基础的教程:NeHeGameTutorials

此外,这是一本非常好的初学者书籍(它是免费的):学习现代 3D 图形编程

顺便说一句,GLUT 并不是游戏编程的最佳方式。认真的,读一读。为了简单和紧凑,示例 OpenGL 脚本将使用 GLUT,但这不是在现实世界中执行此操作的方法。

于 2013-03-06T17:54:51.040 回答