82511


提示コードです`Screen.cpp`の`Renderer()`関数で文字を描画しているのですが提示画像のようにカーソルが一番上に戻らないため？かわかりませんが何故か連続して描かれるため表示したい文字の倍、画面に表示されてしまいます。これはなぜでしょうか？  
※参考サイトのリファレンスを参考にして関数を色々調べてましたが`mvaddch()`関数以外それらしい関数はありません。

参考サイトA： http://www.kis-lab.com/serikashiki/man/ncurses.html#out  
参考サイトB：
http://mcweb.nagaokaut.ac.jp/progex/index.php?curses%A4%CE%BB%C8%A4%A4%CA%FD  
参考サイトC： http://www5a.biglobe.ne.jp/~espoir/ncurses_man_ja.html

[![画像の説明をここに入力](https://i.stack.imgur.com/dUhOo.png)](https://i.stack.imgur.com/dUhOo.png)

///////Screen.cpp

[code]

    #include "../header/Screen.hpp"
    #include "../header/Character.hpp"
    #include "../header/Color.hpp"
    
    #include "../lib/ncurses/include/curses.h"
    
    
    #define WIDTH ((int)50)
    #define HEIGHT ((int)50)
    
    
    //　######################## コンストラクタ ######################## 
    Screen::Screen()
    {
          stage = std::make_unique<std::vector<Character>>(WIDTH * HEIGHT);
          
          for(std::vector<Character>::iterator itr = stage->begin(); itr != stage->end(); itr++)
          {
                itr->chr = 'A';
                itr->color = Color::DEFAULT;
            
    #include "../header/Screen.hpp"
    #include "../header/Character.hpp"
    #include "../header/Color.hpp"
    
    #include "../lib/ncurses/include/curses.h"
    
    
    #define WIDTH ((int)50)
    #define HEIGHT ((int)50)
    
    
    //　######################## コンストラクタ ######################## 
    Screen::Screen()
    {
          stage = std::make_unique<std::vector<Character>>(WIDTH * HEIGHT);
          
          fo    itr->type = 0;
          }
    }
    
    //　######################## Update ########################
    void Screen::Update()
    {
          
    }
    
    //　######################## 文字設定 ######################## 
    void Screen::Input(int x,int y,Character c)
    {
          stage->at((y * WIDTH) + x) = c;
    }
    
    //　######################## 文字削除 ######################## 
    void Screen::Delete(int x,int y)
    {
          stage->at((y * WIDTH) + x).chr = ' ';
          stage->at((y * WIDTH) + x).color = Color::DEFAULT;
          stage->at((y * WIDTH) + x).type = 0;
    }
    
    //　######################## Renderer ######################## 
    void Screen::Renderer()const
    {
    
          for(int y = 0; y < HEIGHT; y++)
          {
                for(int x = 0; x < WIDTH; x++)
                {
                    attron(COLOR_PAIR(stage->at((y * WIDTH) + x).color));
                    attron(stage->at((y * WIDTH) + x).type);
    
                      mvaddch(y,x,stage->at((y * WIDTH) + x).chr);
    
                    attroff(stage->at(y * x).type);
                    attroff(COLOR_PAIR(stage->at((y * WIDTH) + x).color));
                }
          }
    
          
    }
    
    //　######################## デストラクタ ######################## 
    Screen::~Screen()
    {
    
    }
    
[/code]

///////////////////////////////////////////////Edit.cpp

[code]

    #include <stdlib.h>
    #include <iostream>
    #include "../header/Log.hpp"
    
    #include "../header/Edit.hpp"
    #include "../lib/ncurses/include/curses.h"
    
    //　######################## コンストラクタ ######################## 
    Edit::Edit() : Scene()
    {
    
        mousePosition.x = 0;
        mousePosition.y = 0;
        
        int t = 1;
        for(int i = 0; i < 8; i++)
        {
            for(int j = 0; j<8; 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()
    {
    
    
    
        MouseInput();   //マウス入力
        KeyInput();     //キー入力
    }
    
    //　######################## Renderer ######################## 
    void Edit::Renderer()const
    {
        erase();
    
        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)
            {
    
            }       
    
            //Right click
            if(event.bstate & BUTTON3_PRESSED)
            {
    
            }       
        }
        
        move(mousePosition.y,mousePosition.x);
    
    
    }
    
    
    //　######################## デストラクタ ######################## 
    Edit::~Edit()
    {
    
    }
    
[/code]


CC BY-SA 4.0
2021-09-15T11:15:34.657
82507
2021-09-15T13:16:35.143
question
c++
ncursesライブラリ 文字描画のカーソルが戻らない原因が知りたい 連続されて表示されてしまう


コードは正しく動いており原因は **半角だから(縦横のサイズが異なる)** です。


CC BY-SA 4.0
2021-09-15T13:16:35.143
82511
2021-09-15T13:16:35.143
82507
answer