Создать NSApplication в C ++ - PullRequest
       4

Создать NSApplication в C ++

0 голосов
/ 28 января 2020

Я работаю над попыткой создать игровой движок с нуля (используя только системы, предоставляемые OS) и пытаюсь создать его на c ++. В качестве теста я хотел создать оболочку c ++ для окна какао. (Добавьте графику позже) Я обнаружил, что мне нужно использовать идиоту pimpl. У меня есть файл App. cpp (основной метод для тестирования), файл Device.h и файл Device. cpp. Этот код компилируется с использованием clang ++ без каких-либо проблем, так почему он не отображает окно на экран.

Приложение. cpp

#include "Device.h"

int main() {
  Outlaw::MacDevice* device = new Outlaw::MacDevice();
}

Device.h

namespace Outlaw {

    //C++ NSView Wrapper Class
    struct MacViewImpl;
    struct MacViewRect;
    class MacView {
    public:
      MacViewImpl* impl;
      MacViewRect* frame;
      MacView();
      ~MacView();
    };

    //C++ NSWindow Wrapper Class;
    struct MacWindowImpl;
    class MacWindow {
    public:
      MacWindowImpl* impl;
      MacWindow(MacView* view);
      ~MacWindow();
    };

    struct MacDeviceImpl;
    class MacDevice {
    public:
      MacDeviceImpl* impl;

      MacWindow* window;
      MacView* view;
      MacDevice();
      ~MacDevice();
      void Run();
    };
}

Device.mm

#include <Cocoa/Cocoa.h>

#include "Device.h"

@interface MacViewItfc : NSView
-(void)drawRect:(NSRect)rect;
@end

@implementation MacViewItfc
-(void) drawRect:(NSRect)rect {
  [[NSColor grayColor] set];
  NSRectFill([self bounds]);
}
@end

@interface MacWindowItfc : NSWindow <NSApplicationDelegate>
@end

@implementation MacWindowItfc
@end

namespace Outlaw {
  //C++ Wrapper for ViewItfc (NSView)
  struct MacViewImpl {
    MacViewItfc* pimpl;
  };
  struct MacViewRect {
    NSRect pimpl = NSMakeRect(100.0,100.0,300.0,300.0);
  };
  MacView::MacView() :
    impl(new MacViewImpl), frame(new MacViewRect) {
    impl->pimpl = [[MacViewItfc alloc] initWithFrame:frame->pimpl];
  }
  MacView::~MacView() {
    if (impl)
      [impl->pimpl release];
  }

  //C++ Wrapper for WindowItfc (NSWindow)
  struct MacWindowImpl {
    MacWindowItfc* pimpl;
  };
  MacWindow::MacWindow(MacView* view) :
    impl(new MacWindowImpl) {
    impl->pimpl = [[MacWindowItfc alloc] initWithContentRect:view->frame->pimpl
                                         styleMask:NSWindowStyleMaskTitled
                                                  |NSWindowStyleMaskClosable
                                                  |NSWindowStyleMaskResizable
                                         backing:NSBackingStoreBuffered
                                         defer:NO];

    [impl->pimpl setTitle:@"Outlaw Game"];
    [impl->pimpl setContentView:view->impl->pimpl];
    [impl->pimpl makeKeyAndOrderFront:nil];
  }
  MacWindow::~MacWindow() {
    if (impl)
      [impl->pimpl release];
  }

  //C++ Wrapper for NSApplication
  struct MacDeviceImpl {
    NSApplication* pimpl;
  };
  MacDevice::MacDevice()
    : impl(new MacDeviceImpl) {
      impl->pimpl = [NSApplication sharedApplication];
      view = new MacView();
      window = new MacWindow(view);
      [impl->pimpl setDelegate:window->impl->pimpl];
  }
  MacDevice::~MacDevice() {
    if (impl)
      [impl->pimpl release];
  }
  void MacDevice::Run() {
    [impl->pimpl run];
  }
}

Так почему созданный исполняемый файл не создает окно и что я могу сделать, чтобы его исправить?

1 Ответ

2 голосов
/ 28 января 2020

Ваша main функция только создает экземпляр. Вам нужно позвонить Run, чтобы запустить событие l oop:

#include "Device.h"

int main() {
    Outlaw::MacDevice* device = new Outlaw::MacDevice();
    device->Run();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...