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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

Q&A

0回答

1305閲覧

ncursesライブラリ 画面がちらついてしまう原因とは?

退会済みユーザー

退会済みユーザー

総合スコア0

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

0グッド

0クリップ

投稿2021/09/15 14:55

編集2021/09/16 00:01

###質問内容
提示コードのコメント部///// ですが画面がちらついてしまいクリックして文字を描画する際に反応がよくありません。これは何が原因なのでしょうか? 

###調べたこと
参考サイトリファレンス関数やサンプルコードを確認してダブルバッファリングのコードがどうなっているか確認して実装を試しました。

参考サイトA: http://www.kis-lab.com/serikashiki/man/ncurses.html
参考サイトB: https://qiita.com/kaityo256/items/80863d466e0d69808eb9

#include "../header/Screen.hpp" #include "../header/Character.hpp" #include "../header/Color.hpp" #include "../header/Vector.hpp" #include "../header/Screen.hpp" // ######################## コンストラクタ ######################## Screen::Screen() { //ウインドウ初期化 getmaxyx(stdscr,windowSize.y,windowSize.x); window = newpad(windowSize.y,windowSize.x); prefresh(window,0,0,0,0,windowSize.y,windowSize.x); size.x = windowSize.x; size.y = windowSize.y; maxSize = size.x * size.y; stage = std::make_unique<std::vector<Character>>(size.x * size.y); for(std::vector<Character>::iterator itr = stage->begin(); itr != stage->end(); itr++) { itr->chr = ' '; itr->color = Color::NONE; itr->type = 0; } } // ######################## 画面サイズ更新 ######################## void Screen::UpdateScreen() { //画面サイズを取得 getmaxyx(stdscr,windowSize.y,windowSize.x); prefresh(window,0,0,0,0,windowSize.y,windowSize.x); //前のウインドウサイズをより大きければ要素を代入 if((windowSize.x * windowSize.y) > maxSize) { maxSize = windowSize.x * windowSize.y; size.x = windowSize.x; size.y = windowSize.y; for(int i = 0; i< (windowSize.x * windowSize.y); i++) { stage->emplace_back(Character{Color::NONE,' ',0}); } } } // ######################## Update ######################## void Screen::Update() { UpdateScreen(); //画面サイズを更新 } // ######################## 文字設定 ######################## void Screen::Input(int x,int y,Character c) { stage->at((y * size.x) + x) = c; } // ######################## 文字削除 ######################## void Screen::Delete(int x,int y) { stage->at((y * size.x) + x).chr = ' '; stage->at((y * size.x) + x).color = Color::NONE; stage->at((y * size.x) + x).type = 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////// // ######################## Renderer ######################## void Screen::Renderer()const { for(int y = 0; y < size.y; y++) { for(int x = 0; x < size.x; x++) { attron(COLOR_PAIR(stage->at((y * size.x) + x).color)); attron(stage->at((y * size.x) + x).type); mvwaddch(window,y,x,stage->at((y * size.x) + x).chr); // mvwaddch(window,y,x,'A'); attroff(stage->at(y * x).type); attroff(COLOR_PAIR(stage->at((y * size.x) + x).color)); } } } ////////////////////////////////////////////////////////////////////////////////////////////////////// // ######################## デストラクタ ######################## Screen::~Screen() { }
#include <stdlib.h> #include <iostream> #include "../lib/ncurses/include/curses.h" #include "../header/Log.hpp" #include "../header/Vector.hpp" #include "../header/Edit.hpp" #include "../header/Screen.hpp" #include "../header/Character.hpp" #include "../header/Color.hpp" #define TERMIMAL_DEFAUT_COLOR ((int)8) // ######################## コンストラクタ ######################## Edit::Edit() : Scene() { mousePosition.x = 0; mousePosition.y = 0; int t = 1; for(int i = 0; i < TERMIMAL_DEFAUT_COLOR; i++) { for(int j = 0; j< TERMIMAL_DEFAUT_COLOR; j++) { init_pair(t, i, j); t++; } } screen = std::make_unique<Screen>(); //前景 changeScene = Scene::SceneType::Edit; //現在のシーン } // ######################## Keyboard Input ######################## void Edit::KeyInput() { int key = getch(); //ESCで終了 if(key == 27) { changeScene = Scene::SceneType::Exit; } } // ######################## Update ######################## void Edit::Update() { screen->Update(); //ウインドウ更新 MouseInput(); //マウス入力 KeyInput(); //キー入力 } ////////////////////////////////////////////////////////////////////////////////////////////////// // ######################## Renderer ######################## void Edit::Renderer()const { //erase(); clear(); screen->Renderer(); refresh(); } ////////////////////////////////////////////////////////////////////////////////////////////////// // ######################## Mouse Input ######################## void Edit::MouseInput() { //マウスイベント if(getmouse(&event) == OK) { //マウス座標 if(event.bstate & REPORT_MOUSE_POSITION) { mousePosition.x = event.x; mousePosition.y = event.y; } //Left click if(event.bstate & BUTTON1_PRESSED) { Print("AAAAAAAAAAAA\n"); screen->Input(mousePosition.x,mousePosition.y,Character{Color::WHITE_BLACK,'@',0}); } //Right click if(event.bstate & BUTTON3_PRESSED) { } } move(mousePosition.y,mousePosition.x); //マウス移動 } // ######################## デストラクタ ######################## Edit::~Edit() { }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問