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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C++

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

Q&A

0回答

1009閲覧

ncurses ライブラリ PADが描画されない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/09/21 01:29

編集2021/09/22 02:04

提示コードの/////コメント部Screen.cppvoid Renderer()関数部ですがなぜ画面クリアと画面再描画を行っているのにもかかわらずリファレンスを確認しましたがなぜPADが描画されないのでしょうか?原因がわかりません。 またRenderer();関数は毎フレーム来ていることを確認しました。

調べたこと

リファレンスを確認しました。
werase : https://nxmnpg.lemoda.net/ja/3/werase
wrefresh : https://nxmnpg.lemoda.net/ja/3/wrefresh

#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/Entry.hpp" #include "../header/Character.hpp" #include "../header/Color.hpp" #include "../header/SaveMenu.hpp" #define HOLD_FRAME ((int) 30) #define ESC_KEY ((int)27) // ######################## コンストラクタ ######################## Edit::Edit(Entry* e) : Scene(e) { holdPressed = 0; position.x = 0; position.y = 0; drawCharacter.chr = '@'; drawCharacter.color = 0; drawCharacter.type = 0; canvasPosition.x = 20; canvasPosition.y = 10; //Print("%d\n",sizeof(drawCharacter)); /////////////////////////////////////////////////////////////////////////////////////////////////////////////// canvas = std::make_unique<Screen>(canvasPosition.x,canvasPosition.y,canvasPosition.x,canvasPosition.y,canvasPosition.x + 10,canvasPosition.y + 10); //前景 /////////////////////////////////////////////////////////////////////////////////////////////////////////////// saveMenu = std::make_unique<SaveMenu>(Scene::Menu_Sequence::Save,100,100,10,0); } // ######################## Keyboard Input ######################## void Edit::KeyInput() { int key = getch(); switch(key) { case KEY_LEFT: { position.x--; canvasPosition.x--; } break; case KEY_RIGHT: { position.x++; canvasPosition.x++; } break; case KEY_DOWN: { canvasPosition.y++; position.y++; } break; case KEY_UP: { canvasPosition.y--; position.y--; } break; } //書き込み if(key == ' ') { canvas->Input(position.x,position.y,drawCharacter); } //ESCで終了 if(key == ESC_KEY) { entry->ChangeScene(Scene::Sequence::Exit); } } // ######################## Update ######################## void Edit::Update() { /////////////////////////////////////////////////////////////////////////////// canvas->Move(canvasPosition.x,canvasPosition.y); /////////////////////////////////////////////////////////////////////////////// MouseInput(); //マウス入力 KeyInput(); //キー入力 move(position.y,position.x); //カーソル移動 } // ######################## Renderer ######################## void Edit::Renderer()const { ///////////////////////////////////////////////////////////////////////////////// canvas->Renderer(); //キャンバス ///////////////////////////////////////////////////////////////////////////////// //saveMenu->Renderer(); } // ######################## Mouse Input ######################## void Edit::MouseInput() { //マウス移動イベント if(getmouse(&mouseEvent) == OK) { //マウス座標 if(mouseEvent.bstate & REPORT_MOUSE_POSITION) { position.x = mouseEvent.x; position.y = mouseEvent.y; } } //長押し判定 if(prevClickEvent.bstate & BUTTON1_PRESSED) { holdPressed++; if(holdPressed > HOLD_FRAME) { prevClickEvent.bstate = BUTTON1_PRESSED; canvas->Input(position.x,position.y,drawCharacter); holdPressed = HOLD_FRAME + 1; } } else { prevClickEvent.bstate = 0; holdPressed = 0; } //クリックイベント if(getmouse(&clickEvent) == OK) { //Left Click if(clickEvent.bstate & BUTTON1_PRESSED ) { prevClickEvent.bstate = BUTTON1_PRESSED; canvas->Input(position.x,position.y,drawCharacter); } else if(clickEvent.bstate & BUTTON1_RELEASED) { prevClickEvent.bstate = 0; } else if(clickEvent.bstate & BUTTON1_CLICKED) { } else if(clickEvent.bstate & BUTTON1_DOUBLE_CLICKED) { } else if(clickEvent.bstate & BUTTON1_TRIPLE_CLICKED) { } //Right Click if(clickEvent.bstate & BUTTON1_PRESSED) { } else if(clickEvent.bstate & BUTTON1_RELEASED) { } else if(clickEvent.bstate & BUTTON1_DOUBLE_CLICKED) { } else if(clickEvent.bstate & BUTTON1_TRIPLE_CLICKED) { } else if(clickEvent.bstate & BUTTON1_CLICKED) { } } } // ######################## Loop ######################## void Edit::Loop() { Update(); Renderer(); } // ######################## デストラクタ ######################## Edit::~Edit() { }
#include "../header/Screen.hpp" #include "../header/Character.hpp" #include "../header/Color.hpp" #include "../header/Vector.hpp" #include "../header/Log.hpp" // ######################## コンストラクタ ######################## Screen::Screen(int x,int y,int xMin,int yMin,int xMax,int yMax) { //ウインドウ初期化 //getmaxyx(stdscr,windowSize.y,windowSize.x); window = newpad(yMax - yMin,xMax - xMin); //prefresh(window,posY,posX,posY,posX,posY + sizeY,posX + sizeX); prefresh(window,y,x,yMin,xMin,yMax,xMax); position.x = x; position.y = y; size.x = xMax - xMin; size.y = yMax - yMin; 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 = GetColorNum(2,2); itr->type = 0; } } // ######################## 移動 ######################## void Screen::Move(int x,int y) { position.x = x; position.y = y; prefresh(window,position.y,position.x,position.y,position.x,position.y + size.y,position.x + size.x); } // ######################## 画面サイズ更新 ######################## void Screen::UpdateScreen() { } // ######################## Update ######################## void Screen::Update() { } // ######################## 文字設定 ######################## 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 = 0; stage->at((y * size.x) + x).type = 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ######################## Renderer ######################## void Screen::Renderer()const { clear(); werase(window); //erase(); for(int y = 0; y < size.y; y++) { for(int x = 0; x < size.x; x++) { // Print("あああ"); wattron(window,COLOR_PAIR(stage->at((y * size.x) + x).color)); mvwaddch(window,position.y + y,position.x + x,stage->at((y * size.x) + x).chr); wattroff(window,COLOR_PAIR(stage->at((y * size.x) + x).color)); } } wrefresh(window); //描画 refresh(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ######################## デストラクタ ######################## Screen::~Screen() { }

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問