山あり谷ありFe奮闘記!!!

楽しかったこと、驚いたこと、嬉しかったこと、悲しかったことなど、 日々の日常をドドーンと紹介します!! 1週間に1回程度は更新していきたいです。 嘘・・・できない・・・ よろしくお願いします

#include <windows.h>
#include <d3dx9.h>

#pragma once
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

//頂点フォーマット
#define D3DFVF_VERTEX  (D3DFVF_XYZ | D3DFVF_DIFFUSE) //トランスフォームされていない頂点の位置座標+ディフューズ カラー成分

#define szClassName TEXT("MyForm")

HWND                    hWnd;
LPDIRECT3DDEVICE9       g_pd3dDevice = 0;
LPDIRECT3D9             pD3D;
D3DPRESENT_PARAMETERS   dedpp;
IDirect3DVertexBuffer9 *g_pVB;
typedef struct{
float   x, y, z; // トランスフォームされていない頂点の位置座標
DWORD   color; // ディフューズ カラー成分
}
///<summary>
///DrawPrimitiveUP関数を使う場合のもの
///</summary>
D3DVERTEXCOR;

typedef struct{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
}
///<summary>
///DrawPrimitiveUP関数を使う場合のもの
///</summary>
CUSTOMVERTEX;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL)


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
HRESULT InitD3D(HWND hwnd);
HRESULT InitGeometry();
void  SetupMatrices(float x, float y, float z = 0);
void Render(void);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
MSG     msg;

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, hInst,
NULL, NULL, NULL, NULL, szClassName, NULL };

if (RegisterClassEx(&wc) == 0)
return FALSE;

HWND  hWnd = CreateWindow(szClassName, szClassName, WS_OVERLAPPEDWINDOW,
100, 100, 300, 300,
NULL, NULL, hInst, NULL);

if (FAILED(InitD3D(hWnd))) return FALSE;

if (FAILED(InitGeometry())) return FALSE;

ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
ZeroMemory(&msg, sizeof(msg));

//メッセージループ
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Render();
}

UnregisterClass(szClassName, wc.hInstance);
return 0;
}

VOID Cleanup()
{
g_pd3dDevice->Release();
pD3D->Release();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg){
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}


//デバイス/モード等の初期化
HRESULT InitD3D(HWND hwnd)
{

hWnd = hwnd;
pD3D = NULL;
HRESULT     hr;
D3DDISPLAYMODE          dmode;

// デバイス/モード等の初期化
if (NULL == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;

//現在のディスプレイモードを得る
if (FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode)))
return E_FAIL;

// D3DDeviceオブジェクトの作成
ZeroMemory(&dedpp, sizeof(dedpp));
dedpp.Windowed = TRUE;
dedpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
dedpp.BackBufferFormat = dmode.Format; //ディスプレイモードの決定
dedpp.EnableAutoDepthStencil = TRUE;
dedpp.AutoDepthStencilFormat = D3DFMT_D16;

hr = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &dedpp, &g_pd3dDevice);

if (FAILED(hr)){
hr = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dedpp, &g_pd3dDevice);
if (FAILED(hr)){
hr = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dedpp, &g_pd3dDevice);
if (FAILED(hr)){
MessageBox(NULL, TEXT("Create Device Error"), TEXT("Surface Error"), MB_OK);
return E_FAIL;
}
}
}
//描画設定
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //カリングを無効化する
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); //ゼットバッファを有効にする
return S_OK;
}

HRESULT InitGeometry()
{
if (FAILED(g_pd3dDevice->CreateVertexBuffer(50 * 2 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
return E_FAIL;

CUSTOMVERTEX* pVertices;

if (FAILED(g_pVB->Lock(0, 0, (void**)&pVertices, 0)))
return E_FAIL;

INT vertexes = 50;
for (DWORD i = 0; i < vertexes; i++)
{
FLOAT theta = (2 * D3DX_PI * i) / (vertexes - 1);
pVertices[2 * i + 0].position = D3DXVECTOR3(sinf(theta), -1.0f, cosf(theta));
pVertices[2 * i + 0].normal = D3DXVECTOR3(sinf(theta), 0.0f, cosf(theta));
pVertices[2 * i + 1].position = D3DXVECTOR3(sinf(theta), 1.0f, cosf(theta));
pVertices[2 * i + 1].normal = D3DXVECTOR3(sinf(theta), 0.0f, cosf(theta));
}

g_pVB->Unlock();

return S_OK;
}

VOID SetupLights()
{
// Set up a material. The material here just has the diffuse and ambient
// colors set to yellow. Note that only one material can be used at a time.
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl, sizeof(D3DMATERIAL9));
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pd3dDevice->SetMaterial(&mtrl);

// Set up a white, directional light, with an oscillating direction.
// Note that many lights may be active at a time (but each one slows down
// the rendering of our scene). However, here we are just using one. Also,
// we need to set the D3DRS_LIGHTING renderstate to enable lighting
D3DXVECTOR3 vecDir;
D3DLIGHT9 light;
ZeroMemory(&light, sizeof(D3DLIGHT9));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
vecDir = D3DXVECTOR3(cosf(timeGetTime() / 350.0f),
1.0f,
sinf(timeGetTime() / 350.0f));
D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, &vecDir);
light.Range = 1000.0f;
g_pd3dDevice->SetLight(0, &light);
g_pd3dDevice->LightEnable(0, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);

// Finally, turn on some ambient light.
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
}


//描画環境の設定
VOID SetupMatrices(float x, float y, float z)
{
D3DXMATRIX      w;
D3DVERTEXCOR f;

//物体の設定
D3DXMATRIX matWorld; //物体の設定をするための行列
POINT p;
GetCursorPos(&p);
D3DXMatrixRotationX(&matWorld, -p.y / 50.0f); // X軸を回転軸にして回転する行列を作成する。 システム時刻をミリ秒単位で取得
D3DXMatrixRotationY(&w, -p.x / 50.0f); // Y軸を回転軸にして回転する行列を作成する。 システム時刻をミリ秒単位で取得

matWorld = matWorld * w;

D3DXMatrixTranslation(&w, x, y, z); // オフセットを指定して行列を作成する。

matWorld = matWorld * w;
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

//カメラの設定
D3DXMATRIX matView; //カメラの設定をするための行列
D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f); //カメラの位置
D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f); //カメラの注視点
D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f); //上方向のベクトル
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);

//透視変換の設定
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DXToRadian(45.0f), 1.0f, 1.0f, 100.0f); // 視野に基づいて、左手座標系パースペクティブ射影行列を作成する
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}

//描画処理
VOID Render(void)
{
if (!g_pd3dDevice)
return;
//青で塗りつぶして消去
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);

//描画の開始
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//ライトの設定
SetupLights();
//物体の設定
SetupMatrices(0.0f, 0.0f, 0.0f);

//頂点バッファの読み込み
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
//デバイスに使用する頂点フォーマットをセットする
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
//描画方法:連続した三角形として描画する
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2 * 50 - 2);

g_pd3dDevice->EndScene();
}

g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}



これ、なんだと思いますか?
暗号ではないんです。コンパイルすればちゃんと動きます。
実は今、DirectXっていう機能を勉強しているんです。

言語はC++ なんですが、それだけではこのプログラムは動作しないと思います。
興味がある方はこちらをどうぞ。 

いまはこのほぼ暗号のプログラムとひいひい言いながら戦ってる真っ最中です。辛いです。



マスターして早く3Dゲームが作りたい...

 

何年も先の話になると思いますw





さて、春休みなうの自分ですが、
暇ではありません。


暇ではありません! 
大事なことなので2(ry 

やることがこんなにいっぱいあるんですよね~

・DirectXの勉強
・車の学科の勉強
・教習所での車の免許の教習
・マイクラマルチ(魔術MODPACK)
・マイクラマルチ(3月9日プロジェクト)
・マイクラマルチ(工業MOD)
・Deemo 
・ギターの練習
・皿洗い
・バイト

一杯ありすぎてもう疲れた・・・
今回の記事はここで終わりにします(超手抜き) 

yellowここから画像を引っ張ってくるので、おかせてください・・・redorangenonemagentalightbluegreenblue
記事の更新?暇があればしますよ!(フラグkousi

どうも、Feです。

いやいやいやいや、お久しぶりでございます。
ずいぶ~~~ん 


…と間が空いてしまいました。

けっして死んでたわけではありませんよ!?
高専という名の青春剥奪施設に収容されておりますが、なんとか生きてます。

「いい加減高校2年生で学校生活も忙しくなってきたし今の時代ブログなんかよりもツイッターの時代だから疾走しようかな~」なんて微塵も思ったことはありません。
やめてっ、小石投げないで~~汗


オープニングはさて置き、
こんな私でも、年齢をコツコツ積み重ね早、高校2年生です。

勉強は、一年生の頃より、やはり難しいです。
特に数学2Aと来たら・・・

ベクトルだの内積だのくっそむずいところを、
教え方がくっそ下手でクッソ進むの早いマイペース教師に教えていただいてます。
正直言って、先生の話を聞かず、
自分のペースで教科書を読んでいたほうが理解できると思うのですが・・・

しかし、難しいといっても、成績がその文下がったかと言われれば、
そうでもないです。

むしろ、テスト勉強の甲斐あってあがりましたよ(ΦωΦ)フフフ…
(まあ今までのテストがほぼノーbゲフンゲフン

どれぐらい上がったかをマイクラにたとえて言えば、
 
直下ぼりしている時に誤ってマグマに落ちた時ぐらい(温度が)上がりました!
(面白くないことを連発しているFeくんですが、こういう仕様の人間なのでご了承くださいm(_ _)m)

部活は、まだ試合に出れるほどの実力はありません。
ですが、ボールの落下地点が全く読めず、チャンスボールすらボールがかすらないなんてこともあった一年前と比べれば、かなり精度はがったと思います。
スパイクも少しづつではありますが、コートの中に落とせるようにはなってきました。

実はここからが重要。

一週間後に、専大連(高体連の高専ver)があります!

この大会で、5年生は最後になってしまうので、
悔いの残らないよう精一杯応援したいです! 


いま、何かと大変な時期ではありますが、Feはめげづに元気に活動しております!
みなさんはどうでしょうか?
何事もなく、無事に過ごしているといいのですが・・・

まだまだ暑い夏はこれからなので、熱中症にはくれぐれも注意してください。


以上、現状報告でした!

またいつか更新しますw 

このページのトップヘ