私のターゲットは、後で 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 では非常にうまく機能せず、既知のバグがあります。