忍者ブログ
個人的な情報蓄積 時系列にノージャンルで
[1] [2]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

#pragma comment(lib, "xxx.lib")


makefileに追加せずにソースファイルに必要なリンクを記述する方法

あくまでもサンプルソース等だけに使用すべきですけど。
初心者に集中力を分散させない為の説明にはうってつけ。

大規模開発に用いると pragma知らない人とかが混入して厄介な事になるかもしれないけど。
修正に手間取るような事はないのでどうでもいいかもしれない。




PR
DirextXを用いて、ゲームを作成する場合、
イベント駆動型のプログラミングではなく、バックグラウンドでループ処理を使う必要がある。

■サンプルソース1
#include <windows.h>

LRESULT CALLBACK
proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return(DefWindowProc(hWnd, msg, wp, lp));
    }

    return 0;
}

HWND
init(HINSTANCE hInst)
{
    HWND hWnd;
    WNDCLASSEX wc;

    // ウィンドウクラス登録
    memset(&wc, 0, sizeof(wc));
    wc.hInstance     = hInst;
    wc.lpszClassName = TEXT("mainwin");
    wc.lpfnWndProc   = proc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    if(!RegisterClassEx(&wc)) return 0;

    // ウィンドウ作成
    hWnd = CreateWindow(
        TEXT("mainwin"),        // ウィンドウクラス名
        TEXT("test"),           // ウィンドウ名
        WS_OVERLAPPEDWINDOW,    // ウィンドウスタイル
        CW_USEDEFAULT,          // ウィンドウ表示位置(X)
        CW_USEDEFAULT,          // ウィンドウ表示位置(Y)
        CW_USEDEFAULT,          // ウィンドウサイズ(X)
        CW_USEDEFAULT,          // ウィンドウサイズ(Y)
        NULL,                   // 親ウィンドウハンドル
        NULL,                   // メニューハンドル
        hInst,                  // インスタンスハンドル
        NULL                    // 引数データ
    );

    // ウィンドウ表示
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    return hWnd;
}

int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPSTR args, int dummy)
{
    init(hInst);

    MSG msg;
    do{
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // ここにループ処理を記載する。
        }
    }while(msg.message != WM_QUIT);
}
■サンプルソース2
サンプルソース1からWinMainだけを差し替えてください。
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPSTR args, int dummy)
{
    init(hInst);

    MSG msg;
    do{
        if(PeekMessage(&msg , NULL , 0 , 0 , PM_NOREMOVE))
        {
            if(!GetMessage(&msg , NULL , 0 , 0))
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // ここにループ処理を記載する。
        }
    }while(msg.message != WM_QUIT);
}
PM_REMOVE→ PM_NOREMOVEに変更してGetMessageを追加
一見無意味な気もしますがこちらの方が処理が早いという噂があります。
プログラムカウンタの計測をして処理が早いかどうかを調べたことないので噂です。
個人的にはサンプルソース2は不必要と思っています。
PeekMessage説明

#include <stdio.h>

int
main(int ac, char **av)
{
printf("aaa"
"bbbb" "\n");
return 0;
}

-----------------------
結果
aaabbbb

coutはC言語のprintfのように画面に文字列を出力します。

使うには
#include <iostream>
using namespace std;
が必要です。

C++のヘッダファイルは.hがいりません。
using namespaceは名前空間を省略する機能です。
本来はstd::coutとしないと関数が使えませんが、
usingで指定していればその名前空間内を探します。

cout << "hello\n";

printf("hello\n");
は一緒の意味です。

cout << 12 + 20 << endl;
printf("%d\n", 12+20);
上記も一緒です。

※endlは改行+フラッシュバッファ
フラッシュしたくない時は\nを文字列に入れましょう。

16進数の入出力
cout << hex << showbase << 0x12+0x20 << endl;

hexは16進数出力
showbaseを付けると0xと表示されるようになります。

使わないと思いますが8進数は octです。





忍者ブログ [PR]
カウンター
ブログ内検索
カレンダー
06 2025/07 08
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
忍者アド
アクセス解析
フリーエリア