2010年3月31日水曜日

ウィンドウ表示とメッセージ処理

そろそろ新学期ということで、かわいいかわいい後輩も入ってくるそうです。

放課後にプログラムの部活みたいなのをやれればいいねーみたいな話になったので、そのときちょこっとだけ教えられるようにとWIN32API周りを復習しております。

何度やっても初期化のあたりは忘れるので、今超適当に組んだコードを保存しておく。今後はこいつのコピペで済ませよう…。
01#include <windows.h>
02#include <tchar.h>
03 
04//定数など
05namespace
06{
07    const TCHAR* APPNAME = _T("01CreateWindow");
08    const int APP_W = 400;
09    const int APP_H = 300;
10}
11 
12//メッセージ処理
13LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
14{
15    switch(msg)
16    {
17    case WM_DESTROY:
18        PostQuitMessage(0);
19        return 0;
20    }
21    return DefWindowProc(hWnd, msg, wp, lp);
22}
23 
24//エントリポイント
25int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, TCHAR*, int)
26{
27    //ウィンドウクラスの登録
28    WNDCLASS wc;
29    memset(&wc, 0, sizeof(wc));
30    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
31    wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);
32    wc.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION);
33    wc.lpfnWndProc = MyWndProc;
34    wc.hInstance = hInst;
35    wc.lpszClassName = APPNAME;
36 
37    //クラス登録
38    if(!RegisterClass(&wc))
39    {
40        //メッセージなどを出して終了
41        exit(1);
42    }
43 
44    //ウィンドウサイズの調整
45    RECT r;
46    SetRect(&r, 0, 0, APP_W, APP_H);
47    AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);
48 
49    //ウィンドウの作成
50    HWND hWnd = CreateWindow(APPNAME, APPNAME,
51        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
52        r.right - r.left, r.bottom - r.top,
53        NULL, NULL, hInst, NULL);
54 
55    //作成できない場合のエラー処理
56    if(!hWnd)
57    {
58        //メッセージなどを出して終了
59        exit(1);
60    }
61 
62    //ウィンドウの表示
63    ShowWindow(hWnd, SW_SHOW);
64 
65    //メインループ
66    while(true)
67    {
68        //メッセージ処理
69        MSG msg;
70        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
71        {
72            DispatchMessage(&msg);
73        }
74        //終了時はループからぬける
75        if(msg.message == WM_QUIT) break;
76 
77        //この辺にメインロジックを書く
78    }
79    return 0;
80}
こんなのが出ます。
PeekMessageを使っているのは、今後このスケルトンをゲーム用に拡張していくため。GetMessageとかは使わないです。ポーリングも自前でできればいいけど、面倒なときはメインループの末端にSleep(1)とか入れとけばいい。次回はDirect3D9の初期化でもやるか。

2010年3月26日金曜日

内定

昨日、ゲーム会社に内定をいただいた。
もう一社受けてたところは落ちた。

入ることが目標ではないので、ここからが勝負。

さあがんばろう。

2010年3月18日木曜日

直感でわかる数学

畑村洋太郎 著『直感でわかる数学』(岩波書店)を読了したので感想をちょこっと。

本書を読んだからといって、数学の問題が解けるようになるわけではない。
しかし、数学の本質を語っているらしい。

各章の要約とか感想とか。

1.見えない直角三角形を見る サイン・コサイン
サインは直角三角形の辺の比で角度を表したもの
コサインはもう一個の角度を同じく辺の比で表したもの

2.数字のウラには意味がある 行列
行列はたくさんの数を同時に計算したいときに楽だから作られた
行列の掛け算が↓→なのは目線の動きにやさしいから

3.見方を変えて新しい数を作る 指数・対数
指数は数の大小比較が便利
指数と対数はペア
対数は掛け算が足し算ですむから頭にやさしい
自然対数は借金の利子から生まれた? 2.71828(フナヒトハチフタハチ)

4.2つを1つにひっくるめる 虚数、複素数
2つの要素を1つの組にひっくるめて作られる新しい数が複素数(2次元ベクトルも複素数といえるのだろうか?)
虚数と複素数を結びつけたのはガウス フェルマーの定理 p=a2+b2から発想

5.日常生活に本質が隠れている 微分・積分
どれだけ変わっているかに着目するのが微分
全部でどれだけあるかに着目するのが積分

6.部分を見れば全体がわかる 微分方程式
微分方程式のほとんどは解けない
微分方程式は解きかたより立て方が大事
部分から全体を想像する方法
具体から抽象へはいけるが、抽象から具体へはいけない

…そういえばスプライン曲線をちょこっと調べたときに微分方程式に苦労した覚えがある

7.未来は等分配されている 確率
確率はこれから起こりそうなことについて考える
確率は未来への判断材料になる
行動→結果→確率の理解 のプロセスを逆転させることで行動への判断基準を確率にゆだねられる

補足1.直感の極意は丸暗記と暗算にあり
だいたい計算できればいい
技術屋的には「倍・半分のずれは許される。桁違いはいけない」

補足2.数量を生み出す努力をせよ
「知らない」「調べます」は厳禁
知っている知識で考えることが大事

鉄の熱膨張率を導くまでの思考プロセスにただただ脱帽

語録.なぜ数学はわからないか?
理解とは実感すること身近に感じること
頭の中のテンプレート(考え方の脈略)をどれだけ多く持つかが頭の回転のよさにつながってくる
理解とは覚えることではなく行動すること(テンプレートを増やすこと)


自分がいかに頭の固い人間かを思い知らされた。特にすぐ調べようとする癖は直したほうがいいね…。