瀏覽代碼

Fix nullptr errors.
Make game close when the window closes.

Sam Jaffe 6 年之前
父節點
當前提交
ccc92eb465
共有 2 個文件被更改,包括 14 次插入11 次删除
  1. 4 0
      danmaku/AppDelegate.m
  2. 10 11
      danmaku/GameView.mm

+ 4 - 0
danmaku/AppDelegate.m

@@ -25,6 +25,10 @@ NSWindowStyleMask const borderless = NSWindowStyleMaskBorderless;
   [[self window] makeMainWindow];
 }
 
+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {
+  return YES;
+}
+
 @end
 
 @implementation GameWindow

+ 10 - 11
danmaku/GameView.mm

@@ -20,17 +20,11 @@ namespace env { namespace detail {
 }}
 
 @implementation GameView {
+  BOOL initialized;
   std::shared_ptr<graphics::direct_renderer> renderer;
   std::shared_ptr<engine::game_dispatch> game;
 };
 
-- (void)doInit {
-  if (renderer) return;
-  using namespace graphics;
-  renderer = std::make_shared<direct_renderer>(driver::openGL);
-  game = std::make_shared<engine::game_dispatch>(renderer);
-}
-
 - (id)initWithFrame:(NSRect)aRect {
   NSOpenGLPixelFormatAttribute attr[] = {
     NSOpenGLPFADoubleBuffer,
@@ -49,13 +43,17 @@ namespace env { namespace detail {
   [[self openGLContext] makeCurrentContext];
   
   // rest of your init method ...
-  [self doInit];
+  using namespace graphics;
+  renderer = std::make_shared<direct_renderer>(driver::openGL);
+  game = std::make_shared<engine::game_dispatch>(renderer);
+  
+  renderer->clear();
+
+  initialized = YES;
   return self;
 }
 
 - (void)prepareOpenGL {
-  [self doInit];
-  renderer->clear();
   // enable vertical sychronization to refresh rate
   const GLint vals = 0x01;
   [[self openGLContext] setValues:&vals forParameter:NSOpenGLCPSwapInterval];
@@ -66,12 +64,13 @@ namespace env { namespace detail {
 }
 
 - (void)drawRect:(NSRect)dirtyRect {
+  if (!initialized) return;
   //  glClear(GL_COLOR_BUFFER_BIT);
   //  glLoadIdentity();
   
   env::detail::resize_screen({{(int)dirtyRect.size.width,
                                (int)dirtyRect.size.height}});
-  game->render();
+  if (initialized) game->render();
   //  glFlush();
   // the correct way to do double buffering on Mac is this:
   [[self openGLContext] flushBuffer];