メッセージのスクロール

ゲームの世界観やスタッフロールなど、ゲームメッセージをスクロールしながら表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. ゲームのメッセージをスクロールしながら表示します。
    普通に描画したのでは、多少画面が「チラツク」のは仕方ありません。
    「ちらつき」を抑えてスクロールする方法は、次のページを参照して下さい。
  2. ID_TIMER はタイマのIDで、タイマ割り込みでメッセージをスクロールします。
    WIDTH, HEIGHT はウインドウのサイズです。
    HFONT hFont; はタイトルを表示するフォントを設定する領域です。
    S_POS はスクロールメッセージを制御する領域で、タイマ割り込みで「400~0」まで変化します。
    MsgTxt[] が表示するメッセージの定義です。
        /**********************************************/
        /*★ Message Scroll のプログラム    前田 稔 ★*/
        /**********************************************/
        #define     NAME    "Msg Scroll"
        #include    <windows.h>
        #define     ID_TIMER    (WM_APP + 0)
        #define     WIDTH       640
        #define     HEIGHT      480
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        HFONT       hFont,hFontOld;
        int         S_POS= 400;
    
        LPSTR       MsgTxt[] =
        { "宇宙暦○△□×、宇宙連合とクリンゴンは1000",
          "年間に渡り宇宙の覇権争いを続けていた。",
          "近年宇宙連合の劣勢は覆いがたく、このまま行けば",
          "クリンゴンに征服される日も近い。",
          "そこで起死回生の秘策として温存されていた宇宙船",
          "エンタープライズを出動させることにした。"
        };
        
  3. CALLBACK 関数の WM_CREATE: です。
    SetMyFont() でメッセージを表示するフォントを生成します。
    SetTimer() でタイマを起動してスクロールを開始します。
            case WM_CREATE:
                hFont = SetMyFont((LPCTSTR)"MS 明朝",26,0);
                SetTimer(hWnd,ID_TIMER,50,NULL);
                break;
        
  4. WM_PAINT: で TEXT の色と背景色とフォントを設定してメッセージを描画します。
    S_POS が表示する座標で、400から始まり、ゼロになるまでカウントダウンされます。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                SetTextColor(hdc, RGB(255,115,0));
                SetBkColor(hdc,RGB(0,0,0));
                hFontOld= (HFONT)SelectObject(hdc, hFont);
                for(i=0; i<6; i++)
                    TextOut(hdc,20,(S_POS)+i*40,MsgTxt[i],strlen(MsgTxt[i]));
                SelectObject(hdc,hFontOld);
                EndPaint(hWnd,&ps);
                break;
        
  5. WM_TIMER: では S_POS が400から始まり、ゼロになるまでカウントダウンします。
    InvalidateRect() でウインドウをクリアして、WM_PAINT: を呼び出します。
            case WM_TIMER:
                if (S_POS)
                {   S_POS--;
                    InvalidateRect(hWnd,NULL,TRUE);
                }
                break;
        
  6. WM_KEYDOWN: では、ESC キーを検出してプログラムを終了します。
            case WM_KEYDOWN:            //KEY が押された
                switch(wParam)
                {   case VK_ESCAPE:     //ESC KEY
                        DestroyWindow(hWnd);
                        return 0L;
                }
                break;
        
  7. WM_DESTROY: ではタイマを停止して、リソースを開放して下さい。
            case WM_DESTROY:
                KillTimer(hWnd,ID_TIMER);
                DeleteObject(hFont);
                PostQuitMessage(0);
                return 0L;
        
  8. フォントの設定は 文字フォントを設定して描画する を参照して下さい。
    WinMain() では WIDTH, HEIGHT のサイズでウインドウを生成して表示します。
        g_hWnd= CreateWindow(NAME,NAME,WS_OVERLAPPEDWINDOW,
                100,100,WIDTH,HEIGHT,NULL,NULL,hInst,NULL);
        

【演習】

  1. プログラムを完成させて下さい。
  2. ページ先頭画面のように背景に画像を描画して、その上でメッセージをスクロールして下さい。
  3. Enter キーでスクロールを開始するようにプログラムして下さい。

超初心者のプログラム入門(Win32API C++)