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

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

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

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

解決済

[glfw]将来性のためキー入力はどういった形で実装するべきか?オブジェクト指向が知りたい。

削除済ユーザー
削除済ユーザー

総合スコア0

GLFW

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

1回答

-2評価

0クリップ

31閲覧

投稿2021/04/19 08:45

キー入力についてなのですが場当たりなことはせず将来性を考えた設計をする際にどうやってキー入力を実装したらいいコードになるのか知りたいです。現状はWindowクラスにウインドウコンテキスト当を管理しているのですが"ここに実装するべき"コメント部に実装するべきなのでしょうか?またゲーム内容とフレームワーク部でオブジェクト指向を分けたいのでゲームプログラム内でwindowコンテキスト変数を直接触りたくなりません。現在は描画物は一つですがGame クラスを作ってそこにゲーム内容を記述してくといった規模の大きなプロジェクトになる場合どういった手法でプロ人は実装するのでしょうか?

cpp

//#define GLEW_STATIC //スタティックリンク #include <iostream> #include <fstream> #include <cstdlib> #include <vector> #include <glew/include/GL/glew.h> #include <glfw/include/GLFW/glfw3.h> #include "Window.hpp" #include "Shape.hpp" #include "Shader.hpp" Object::Vertex rectangleVertex[4] = { {-0.5f,-0.5f}, {0.5f,-0.5f}, {0.5f,0.5f}, {-0.5f,0.5f} }; int main() { if (glfwInit() == GL_FALSE) { std::cerr << "glfw初期化失敗。" << std::endl; return -1; } atexit(glfwTerminate); //プログラム終了時の処理を登録 Window window; //OpenGL Verison 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); Shape* shape = new Shape(2, 4, rectangleVertex); Shader shader("Test.vert","Test.frag"); shader.setBindAttribVertex(0, "Position"); shader.setBindAttribFragment(0, "fragment"); glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 while (window) { glClear(GL_COLOR_BUFFER_BIT); //カラーバッファをクリア shader.Active(); shader.setUniform2fv("location",window.getLocation()); shader.setUniform1f("scale",window.getScale()); shader.setUniform2fv("size",window.getSize()); shape->Draw(); //表示物 window.SwapBuffers(); //ダブルバッファリング } }

cpp

#include "Window.hpp" Window::Window(int width, int height, const char* title) :window(glfwCreateWindow(width,height,title,NULL,NULL)), scale(100.0f), location{ 0.0f,0.0f } { if (window == NULL) { std::cerr << "ウインドウ生成失敗" << std::endl; exit(1); } glfwMakeContextCurrent(window); //コンテキストを作成 glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { std::cerr << "GLFW 初期化失敗" << std::endl; exit(1); } atexit(glfwTerminate); //プログラム終了時の処理を登録 glfwSwapInterval(1); //垂直同期 glfwSetWindowUserPointer(window, this); //このインスタンスのthis glfwSetWindowSizeCallback(window, Resize); //ウインドウサイズを変更する時に呼び出す処理 glfwSetScrollCallback(window,Wheel); //マウスホイール操作時に呼び出す処理 Resize(window, width, height); } //サイズ変更 void Window::Resize(GLFWwindow* const window, int width, int height) { int fbWidth, fbHeight; glfwGetFramebufferSize(window, &fbWidth, &fbHeight); glViewport(0, 0, fbWidth, fbHeight); Window* const instance = (Window*)glfwGetWindowUserPointer(window); if (instance != NULL) { instance->size[0] = (GLfloat)width; instance->size[1] = (GLfloat)height; } } const glm::vec2 Window::getSize() const { return size; } GLfloat Window::getScale() const { return scale; } const glm::vec2 Window::getLocation()const { return location; } Window::~Window() { glfwDestroyWindow(window); } void Window::Wheel(GLFWwindow* win, double x, double y) { Window* const instance = (Window*)glfwGetWindowUserPointer(win); if (instance != NULL) { instance->scale += (GLfloat)y; } } Window::operator bool() { glfwPollEvents(); //イベントを取り出す ////////////////////////////////////////////////////////////////// //ここに書くべきか? ////////////////////////////////////////////////////////////////// //マウスをクリックしたとき if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_1) != GLFW_RELEASE) { //マウスカーソルの座標を取得 double x, y; glfwGetCursorPos(window, &x, &y); //マウスカーソルの正規化デバイス座標系上での座標を求める location.x = (GLfloat)x * 2.0f / size.x - 1.0f; location.y = 1.0f - (GLfloat)y * 2.0f / size.y; } //ESCキーを押したら強制終了 if (glfwGetKey(window, GLFW_KEY_ESCAPE)) { return false; } //ウインドウを閉じる必要があれば false if (glfwWindowShouldClose(window) != 0) { return false; } else { return true; } } //ダブルバッファリング void Window::SwapBuffers()const { glfwSwapBuffers(window); }

cpp

#ifndef ___WINDOW_HPP #define ___WINDOW_HPP #include <iostream> #include <glew/include/GL/glew.h> #include <glfw/include/GLFW/glfw3.h> #include "glm/glm.hpp" class Window { public: Window(int width = 640, int height = 480, const char* title = "Hello!"); virtual ~Window(); explicit operator bool(); void SwapBuffers()const; //ダブルバッファリング static void Resize(GLFWwindow* const window, int width, int height); //サイズ変更 const glm::vec2 getSize() const; GLfloat getScale() const; const glm::vec2 getLocation()const; static void Wheel(GLFWwindow* win, double x, double y); GLfloat scale; //ワールド座標系に対するデバイス座標系の拡大率 private: GLFWwindow *const window; //ウインドウコンテキスト glm::vec2 size; //ウインドサイズ glm::vec2 location; //図形の正規化デバイス座標上での位置 }; #endif

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

GLFW

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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