// 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 )
 {
 }
}