// Name:ShiftLine()// Desc:削除したライン分、ラインを詰める
VOID ShiftBall()
{
INT i,j,z;
INT countmove;
z=0;
while(z==0)
{
countmove=0;
for( j=FRAME_H-1 ; j>=1 ; j-- )
{
for( i=0 ; i<FRAME_W ; i++ )
{
if(sBlock[i][j].dwKind==0)
{
sBlock[i][j].dwKind=sBlock[i][j-1].dwKind;
if(sBlock[i][j-1].dwKind>0)
{
countmove=1;
}
sBlock[i][j-1].dwKind=0;
}
}
}
// クリア
lpDev->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,128), 1.0f, 0 );
// 描画開始
if( SUCCEEDED( lpDev->BeginScene() ) )
{
//背景描画
DrawSprite(lpDev,lpTex3, 0, 0, 256, 384, 128, 400, 1, 1, 256, 0, 0, 0xffffffff);
DrawSprite(lpDev,lpTex3, 0, 384, 800, 216 , 128, 400, 1, 1, 256, 0, 0, 0xffffffff);
//配置ブロック描画
for( i=0 ; i<WINDOW_WIDTH / B_SIZE ; i++)
{
for( j=0 ; j<FRAME_H ; j++ )
{
//壁面描画
if(i >= FRAME_W )
{
DrawSprite(
lpDev,lpTex,
(FLOAT)i*B_SIZE, (FLOAT)j*B_SIZE,
B_SIZE, B_SIZE,
B_SIZE/2, B_SIZE/2,
1, 1,
(FLOAT)(WALL1_B-1)*B_SIZE, 0,
0, 0xffffffff);
continue;
}
//通常ブロック描画
if( sBlock[i][j].dwKind )
DrawSprite(
lpDev,lpTex,
(FLOAT)i*B_SIZE, (FLOAT)j*B_SIZE,
B_SIZE, B_SIZE,
B_SIZE/2, B_SIZE/2,
1, 1,
(FLOAT)(sBlock[i][j].dwKind-1)*B_SIZE, 0,
0, 0xffffffff);
}
}
//操作ピース描画
if( sPiece.dwKind )
for(i=0 ; i<PIECE_W ; i++)
for(j=0 ; j<PIECE_H ; j++)
if(sPiece.iBlock[i][j])
DrawSprite(
lpDev, lpTex,
(FLOAT)(sPiece.iX+i)*B_SIZE, (FLOAT)(sPiece.iY+j)*B_SIZE,
B_SIZE, B_SIZE,
B_SIZE/2, B_SIZE/2,
1, 1,
(FLOAT)(sPiece.iBlock[i][j]-1)*B_SIZE, 0,
0, 0xffffffff);
//予告ピース描画
if( sNextPiece.dwKind )
for(i=0 ; i<PIECE_W ; i++)
for(j=0 ; j<PIECE_H ; j++)
if(sNextPiece.iBlock[i][j])
DrawSprite(
lpDev, lpTex,
(FLOAT)(sNextPiece.iX+i)*B_SIZE, (FLOAT)(sNextPiece.iY+j)*B_SIZE,
B_SIZE, B_SIZE,
B_SIZE/2, B_SIZE/2,
1, 1,
(FLOAT)(sNextPiece.iBlock[i][j]-1)*B_SIZE, 0,
0, 0xffffffff);
// スコア文字の表示
VOID DrawScoreChar();
// スコアの表示
DrawScoreNum(SCORE_PX+4,SCORE_PY+1,Score);
// FPS表示
DrawFps(lpDev, 1.f);
// 描画終了
lpDev->EndScene();
}
lpDev->Present( NULL, NULL, NULL, NULL );
Sleep(80);
if(countmove==0)
{
z=1;
}
}
return;
}
// Name:Initialize()// Desc:その他の初期化
VOID Initialize()
{
int i,j;
// デバイス情報からWindowハンドルを取得
D3DDEVICE_CREATION_PARAMETERS dParam;
lpDev->GetCreationParameters( &dParam );
// モードをオープニングに
iMode = MODE_OPENING;
// テクスチャの生成
CreateTextureEx(lpDev, "Image/ball.bmp", &lpTex, 256, 256, 0xff808080);
CreateTextureEx(lpDev, "Image/score.png", &lpTex2, 256, 256, 0xff808080);
CreateTextureEx(lpDev, "Image/フィールド.bmp", &lpTex3, 1280, 856, 0xff808080);
CreateTextureEx(lpDev, "Image/pen.bmp", &lpTex4, 256, 256, 0xff808080);
CreateTextureEx(lpDev, "Image/ta.bmp", &lpTitleTex, 1121, 921, 0xff808080);
CreateTextureEx(lpDev, "Image/end.bmp", &lpEndingTex, 1220, 860, 0xff808080);
// フォントの生成
CreateFont(lpDev, &lpFont, 12, 24);
//2次元配列の初期化
for( i=0 ; i<FRAME_W ; i++)
for( j=0 ; j<FRAME_H ; j++ )
sBlock[i][j].dwKind = NONE_D;
//ピースの生成
CreatePiece();
NextPiece();
//フラグ等の初期化
iDel = 0;
ZeroMemory( bSaveKey, sizeof(BYTE)*256);
HighScore = 5000;
}
// Name:FreeDx()// Desc:作成したDirectXオブジェクトの開放
VOID FreeDx()
{
SAFE_RELEASE( lpFont );
SAFE_RELEASE( lpTex );
SAFE_RELEASE( lpTex3 );
SAFE_RELEASE( lpTitleTex );
SAFE_RELEASE( lpEndingTex );
SAFE_RELEASE( lpDev );
SAFE_RELEASE( lpD3d );
}
// Name:WinMain()// Desc:アプリケーションのエントリー関数
INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)
{
static char szAppName[] = "Sample01";
HWND hWnd = NULL; // ウインドウハンドル
MSG msg; // メッセージ構造体
// マルチメディアタイマーの精度を向上 ------
timeBeginPeriod( 1 );
// ウィンドウの初期化
InitWindow( hInst, &hWnd, szAppName, WINDOW_WIDTH, WINDOW_HEIGHT);
// ダイレクト3Dの初期化関数を呼ぶ
InitDirect3D( hWnd, &lpD3d, &lpDev, FALSE );
// COM の初期化 -----------
CoInitialize(NULL);
// その他の初期化
Initialize();
// ウインドウハンドルをグローバル変数に格納
hWndApp = hWnd;
ZeroMemory( &msg, sizeof(msg) );
// メッセージループ
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
// 描画
switch(iMode)
{
// オープニング
case MODE_OPENING:
Opening();
break;
// ゲーム準備
case MODE_GAME_PREPARE:
GamePrepare();
break;
// ゲーム中
case MODE_GAME:
Draw();
// ゲームオーバーフラグが立っていたらゲームオーバー
if(fGameOver)
{
iMode = MODE_ENDING;
}
break;
// エンディング
case MODE_ENDING:
Ending();
break;
}
}
}
// 開放
FreeDx();
// COM・オブジェクト開放 ----------
CoUninitialize();
// ウインドウ・クラスの登録解除 ----------
UnregisterClass(szAppName, hInst);
// マルチメディアタイマーの精度向上を解除 ------
timeEndPeriod( 1 );
return (INT)msg.wParam ;
}
// Name:NextPiece()// Desc:ゲームオーバーの処理
VOID DrawGameOverEffect()
{
int i,j;
sPiece.iX = FRAME_W/2;
sPiece.iY = 0;
if( SUCCEEDED( lpDev->BeginScene() ) ){
for(i=0 ; i<PIECE_W ; i++)
for(j=0 ; j<PIECE_H ; j++)
if(sPiece.iBlock[i][j])
DrawSprite(
lpDev, lpTex,
(FLOAT)(sPiece.iX+i)*B_SIZE, (FLOAT)(sPiece.iY+j)*B_SIZE,
B_SIZE, B_SIZE,
B_SIZE/2, B_SIZE/2,
1, 1,
(FLOAT)(sPiece.iBlock[i][j]-1)*B_SIZE, (FLOAT)B_SIZE,
0, 0xffffffff);
lpDev->EndScene();
}
lpDev->Present( NULL, NULL, NULL, NULL );
// 時間稼ぎ
DWORD dwTime = timeGetTime();
while( dwTime - timeGetTime() < 10000 )
{
}
}