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;
}

それは良い決断かもしれませんが、私は今のところ、ユーザーの操作(タッチ、マウスの動きなど)をキャッチする方法を経験していません。

私が調査している2番目の方法は、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 コンテキストの前に置いておきます)。その場合、私はこれまで、OpenGL コンテキストの前にココア IB 要素を使用できる MacOS で正常に動作するソリューションを見つけられませんでした。IB コンテキストでは、常にすべての要素を前に出し、次のようにハックします。

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

背景色を後ろに設定すると良い結果が得られます:

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

動作しません:

ここに画像の説明を入力

私が求めたいこと: - 2 番目の方法で成功するためにあらゆる方法を実行してください (パフォーマンス上の理由は、将来的には私にとって重要になる可能性があります。ゲームには大きな 3D ワールドがあります)。はいの場合、役立つ例を共有するか、現在のバグの修正を書いてください。

  • 最初の方法が一方向のみの場合、iOS と osx の両方のプラットフォームを 1 つのコードでサポートする優れたコード編成は何ですか (いくつかのコード サンプルも記述してください)。GLUT は iOS のタッチを制御するのにうまく機能しますか、長押しなどのすべてのココアタッチ機能を置き換えるのは難しすぎます

  • プラットフォーム固有の変更を行うために何が必要になるかはよくわかっていますが、経験を共有して、それをより良く簡単に行う方法を共有できるかもしれません。

PS GLKit を使用できることは理解していますが、残念ながら、MacOS では非常にうまく機能せず、既知のバグがあります。

4

1 に答える 1

0

時間をかけて正しく行う場合は、1 冊か 2 冊の本を読むことをお勧めします。また、チュートリアルも役に立ちます。ここには、非常に基本的な 2 つのチュートリアルがあります。 NeHeGameTutorialsです。

また、非常に優れた初心者用の本 (無料) があります: Learning Modern 3D Graphics Programming .

余談ですが、GLUT はゲーム プログラミングに最適な方法ではありません。真剣に、読んでください。OpenGL スクリプトの例では、単純さとコンパクトさのために GLUT を使用しますが、実際には GLUT を使用する方法ではありません。

于 2013-03-06T17:54:51.040 に答える