###質問内容
提示コードのコメント部///// ですが画面がちらついてしまいクリックして文字を描画する際に反応がよくありません。これは何が原因なのでしょうか?
###調べたこと
参考サイトリファレンス関数やサンプルコードを確認してダブルバッファリングのコードがどうなっているか確認して実装を試しました。
参考サイト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() { }
あなたの回答
tips
プレビュー