質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

受付中

glfw3のウィンドウが表示できない。(My program has a error with glfw3 window)

Il11
Il11

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0評価

0クリップ

2958閲覧

投稿2018/06/09 01:13

問題(Problem)

  • glfw3を使って、ウィンドウを表示させたいのですが、

ERROR: Setting <GLFWContentView: 0x1007508a0> as the first responder for window <GLFWWindow: 0x10072f620>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil.

というエラーが出て、表示する途中で落ちてしまいます。
どうすれば解決できるでしょうか?

  • My program has a error with glfw3 window. The error is that

ERROR: Setting <GLFWContentView: 0x1007508a0> as the first responder for window <GLFWWindow: 0x10072f620>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil.

How can I deal with it?

発生している問題・エラーメッセージ(Error)

Main[74526:7122089] [General] ERROR: Setting <GLFWContentView: 0x1007508a0> as the first responder for window <GLFWWindow: 0x10072f620>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil. ( 0 AppKit 0x00007fff5520752e -[NSWindow _validateFirstResponder:] + 578 1 AppKit 0x00007fff5494ea58 -[NSWindow _setFirstResponder:] + 31 2 AppKit 0x00007fff549ed17d -[NSWindow _realMakeFirstResponder:] + 448 3 Main 0x0000000100055003 createNativeWindow + 1187 4 Main 0x000000010005490f _glfwPlatformCreateWindow + 63 5 Main 0x000000010004d167 glfwCreateWindow + 887 6 Main 0x000000010000caa1 _ZN6WindowC2EiiPKc + 97 7 Main 0x0000000100008e59 _ZN6WindowC1EiiPKc + 41 8 Main 0x000000010000855c main + 156 9 libdyld.dylib 0x00007fff7ebc4115 start + 1 )

該当のソースコード

c++

#include <GL/glew.h> #include <GLFW/glfw3.h> #include <chrono> #include <iostream> #include <thread> #include "./MendelsEngine/Model/UI/Window.h" #include "./MendelsEngine/State/Scene/Scene.h" /* 変数名の省略の対応表 global: g pointer: p member: m array: a vector: vec matrix: mat index: id count: cou number: num value: val allocate: alloc, buffer: buf, current: cur, dimension: dim, direction: dire, event: ev, fragment: frag height: hei, inverse: inv, location: loc, medium: med, multiply: mult, normal : norm, perspective: persp, position: pos, previous: pre, projection: proj, random: rand, string: str, target: tar, texture: tex, vertex: vert, volume: vol, width: wid, win: win */ int main() { /* 初期化 */ /// GLFW を初期化する。 if (glfwInit() == GL_FALSE) { // 初期化に失敗した。 std::cerr << "Can't Initialize GLFW" << std::endl; }; // プログラム終了時の処理を登録する。 atexit(glfwTerminate); //// OpenGL Version 3.2 Core Profile を選択する。 //glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // ゲーム画面を構築するインスタンス生成。 // インスタンスへの参照を他クラスへ渡し、他クラスでもその処理を行えるようにする。 Window win; Scene scene; // 背景色を指定する。 glClearColor(1.0f, 1.0f, 1.0f, 0.0f); // 背面カリングを有効にする。 glFrontFace(GL_CCW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); // デプスバッファを有効にする。 glClearDepth(1.0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); // ゲームループの変数初期化。 const std::chrono::milliseconds MS_PER_UPDATE(10); std::chrono::milliseconds lag; auto pre = std::chrono::system_clock::now(); // メインゲームループ。ゲームループでゲームを更新し、描画し続ける。 while (win.should_close(win.win()) == GL_FALSE) { std::this_thread::sleep_for(std::chrono::seconds(1)); auto curr = std::chrono::system_clock::now(); // 処理に要した時間をミリ秒に変換。 auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(curr - pre); pre = curr; lag = lag + elapsed; // 画面をクリア。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 変換行列の初期化。 glLoadIdentity(); /* インプット */ // 現在のウィンドウの大きさを取得。 int wid, hei; glfwGetFramebufferSize(win.win(), &wid, &hei); // ESCキーで終了。 if (glfwGetKey(win.win(), GLFW_KEY_ESCAPE) == GLFW_PRESS) { break; }; while (lag >= MS_PER_UPDATE) { /* 更新 */ scene.update(win); }; /* 描画 */ scene.render(win); glViewport(0, 0, wid, hei); lag -= MS_PER_UPDATE; }; };

c++

#pragma once #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> #include <vector> // ウィンドウ関連の処理。 class Window { // ウィンドウのポインタの入れ物。 GLFWwindow *win_; // ウィンドウのサイズ。 std::vector<GLfloat> size_; // 図形の正規化デバイス座標系上での位置。 std::vector<GLfloat> pos_; // ワールド座標系に対するデバイス座標系の拡大率。 GLfloat scale_; // キーボードの状態。 int key_status_; public: // コンストラクタ。 Window(int wid = 640, int hei = 480, const char *title = "MendelsEngine") : win_(glfwCreateWindow(wid, hei, title, NULL, NULL)), scale_(100.0f), key_status_(GLFW_RELEASE) { // 作成したウィンドウをOpenGLの処理対象にする。 glfwMakeContextCurrent(win_); // GLEW を初期化する。 glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { // GLEW の初期化に失敗した。 std::cerr << "Can't initialize GLEW" << std::endl; }; // 垂直同期のタイミングを待つ。 glfwSwapInterval(1); // ウィンドウのサイズ変更時に呼び出す処理の登録。 glfwSetWindowSizeCallback(win_, &resize); // マウスホイール操作時に呼び出す処理の登録。 glfwSetScrollCallback(win_, &wheel); // キーボード操作時に呼び出す処理の登録。 glfwSetKeyCallback(win_, &keyboard); // このインスタンスの this ポインタを記録しておく。 glfwSetWindowUserPointer(win_, this); // 開いたウィンドウの初期設定。 resize(win_, wid, hei); }; // デストラクタ。 virtual ~Window() { glfwDestroyWindow(win_); } // メンバ関数。 int should_close(GLFWwindow *win) const; void swap_buffers(GLFWwindow *win, int key_status); // ウィンドウのサイズ変更時の処理。 static void resize(GLFWwindow *win, int wid, int hei){ // ウィンドウ全体をビューポートに設定する。 glViewport(0, 0, wid, hei); // このインスタンスの this ポインタを得る。 Window *instance(static_cast<Window *>(glfwGetWindowUserPointer(win))); if (instance != NULL) { // 開いたウィンドウのサイズを保存する。 GLfloat wid0 = static_cast<GLfloat>(wid); GLfloat hei0 = static_cast<GLfloat>(hei); instance->size(0, wid0); instance->size(1, hei0); }; }; // マウスホイール操作時の処理。 static void wheel(GLFWwindow *win, double x, double y){ // このインスタンスの this ポインタを得る。 Window *const instance(static_cast<Window *>(glfwGetWindowUserPointer(win))); if (instance != NULL) { // ワールド座標系に対するデバイス座標系の拡大率を更新する。 GLfloat scale0 = instance->scale() + static_cast<GLfloat>(y); instance->scale(scale0); }; }; // キーボード操作時の処理。 static void keyboard(GLFWwindow *win, int action, int key = -1, int scancode = -1, int mods = -1){ // このインスタンスの this ポインタを得る。 Window *const instance(static_cast<Window *>(glfwGetWindowUserPointer(win))); if (instance != NULL) { // キーの状態を保存する。 instance->key_status(action); }; }; // アクセサ。 GLFWwindow *win() { return win_; }; std::vector<GLfloat> size() { return size_; }; GLfloat size(int i) { return size_[i]; }; void size(int i, GLfloat &glf) { size_[i] = glf; }; std::vector<GLfloat> pos() { return pos_; }; GLfloat pos(int i) { return pos_[i]; }; void pos(int i, GLfloat &glf) { pos_[i] = glf; }; GLfloat scale() { return scale_; }; void scale(GLfloat &glf) { scale_ = glf; }; int key_status() { return key_status_; }; void key_status(int &i) { key_status_ = i; }; };

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。