none
文字列を1文字ずつ表示するには? RRS feed

  • 質問

  • 文字列を1文字ずつ、ミリセコンド単位の間隔で表示したいのですが、どうすればよいでしょうか。イメージとしては、ゲームの画面下に次々に表示される文字列でしょうか。

    以下の方法でも表示はできるのですが(必要箇所以外は略してます)、非常に効率が悪いです。(マルチバイト文字セットを使用)

    char str[10][3] = {"文","字","列","を","表","字"};
     HDC hdc;
     PAINTSTRUCT ps;
     int x,z;

    switch(msg){

    case  WM_PAINT:
      hdc = BeginPaint(hWnd,&ps);
      for(z = 0;z < 100;z++){
       if(strcmp("",str[Z]) == 0){       //配列の数を調べ、値をzに代入。
        break;                                //配列が途切れたら繰り返しを抜ける。
       }
      }
      for(x = 0;x < z;x++){             //配列の数だけ、繰り返す。
       TextOut(hdc,x*20,5,str[x],(int)strlen(str[x]));         //一文字ずつ表示。
       Sleep(500);                        //文字の間隔をあけるため、Sleepさせる。
      }
      EndPaint(hWnd,&ps);
      break;

    2007年10月23日 16:44

回答

  • どの部分がどのように効率が悪いと感じているのかまで書いた方が良いと思いますよ。

    基本的に一文字ずつ出したいのであれば、一文字ずつ描くしか無いと思います。

    あとは、間隔をあけて描画するという部分をどう実現するかだけだと思います。

    書かれている例だと一文字ずつ出している間はオペレーションができないと思いますが、

    それで良いかどうかがまずは問題でしょう。
    単純にソースコード全体をスマートにしたいのであれば、

    一文字ずつ表示する部分を関数化して何処からでも呼び出し可能にしておくくらいではないかと思います。

     

     

    2007年10月24日 2:31

すべての返信

  • 何の効率が悪いのでしょう ?

     

    1文字づつ書きたいのであれば、1文字づつ描画するしかないのでは ?

    2007年10月24日 1:52
  • どの部分がどのように効率が悪いと感じているのかまで書いた方が良いと思いますよ。

    基本的に一文字ずつ出したいのであれば、一文字ずつ描くしか無いと思います。

    あとは、間隔をあけて描画するという部分をどう実現するかだけだと思います。

    書かれている例だと一文字ずつ出している間はオペレーションができないと思いますが、

    それで良いかどうかがまずは問題でしょう。
    単純にソースコード全体をスマートにしたいのであれば、

    一文字ずつ表示する部分を関数化して何処からでも呼び出し可能にしておくくらいではないかと思います。

     

     

    2007年10月24日 2:31
  • FC-Shiroさん、PATIOさん、ありがとうございます。やはり1文字ずつ表示するしかないのですね。効率が悪いと思ったのは、

    char str[10][3] = {"文","字","列","を","表","示"};  の部分です。二次元配列を1つずつ""(ダブルクォート)で囲む部分です。

    また、PATIOさんの言うとおり、オペレーションができないのが一番気になります。

     

    2007年10月24日 8:37
  • 効率化を図ることは出来ませんでしたが、オペレーションを重視して考えた結果、スリープせずに1文字ずつ表示することが出来ました。以下に方法を記述します。

    #define ID_TIMER 100

     

     HDC hdc;
     PAINTSTRUCT ps;
     static char str[10][3] = {"文","字","列","を","表","字"};
     static int iti = 0,c = 0;
     static int x;

     switch (msg) {
      case WM_LBUTTONDOWN:
       if(c == 0){   
        SetTimer(hWnd,ID_TIMER,50,NULL); 
        c = 1;
       }
       return 0;
      case WM_TIMER:
       if(wp == ID_TIMER){
        InvalidateRect(hWnd,NULL,FALSE);
       }
       else{
        return(DefWindowProc(hWnd,msg,wp,lp));
       }
       return 0;
      case WM_PAINT:
       hdc = BeginPaint(hWnd,&ps);
       if(c == 1){
        for(x = 0;x < 50;x++){
         if(strcmp(str[x],"") == 0){           //配列の数を調べ、xに代入。
          break;
         }
        }
        if(iti < x){                    //配列の数だけ文字を1つずつ描画。
         TextOut(hdc,iti * 15,5,str[iti],(int)strlen(str[iti]));
         ++iti;
        }
        else{
         iti = 0;                    //文字を描画し終えたら、初期状態に戻し、タイマーを破棄する。
         c = 0;
         KillTimer(hWnd,ID_TIMER);
        }
       }
       EndPaint(hWnd,&ps);
       return 0;

    2007年10月25日 16:15