スポンサーサイト



この広告は30日以上更新がないブログに表示されます。

(4)

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

(3)

// Name:GetXXX()// Desc:ピースのそれぞれの端の位置を検出
INT GetLeft( SPIECE sp )
{
 INT i,j;
 for( i=0 ; i<PIECE_W ; i++ )
  for(j=0 ; j<PIECE_H ; j++ )
   if( sp.iBlock[i][j] )
    return i;
 return -1;
}
INT GetRight( SPIECE sp )
{
 INT i,j;
 for( i=PIECE_W-1 ; i>=0 ; i-- )
  for(j=0 ; j<PIECE_H ; j++ )
   if( sp.iBlock[i][j] )
    return i;
 return -1;
}
INT GetDown( SPIECE sp )
{
 INT i,j;
 for(j=PIECE_H-1 ; j>=0 ; j-- )
  for( i=0 ; i<PIECE_W ; i++ )
   if( sp.iBlock[i][j] )
    return j;
 return -1;
}
// Name:MovePiece()// Desc:ピースの移動(戻り値 TRUE:移動した FALSE:移動しなかった)
BOOL MovePiece( INT iDir )
{
 INT iPx,iPy;
 switch( iDir )
 {
 case DOWN_P:
  iPy = GetDown(sPiece);
  
  if( sPiece.iY+1+iPy >= FRAME_H )
   return FALSE;
  for(iPy=0 ; iPy<PIECE_H ; iPy++)
   for(iPx=0 ; iPx<PIECE_W ; iPx++)
    if(sPiece.iX+iPx >= 0 && sPiece.iX+iPx <FRAME_W && sPiece.iY+iPy >= 0 && sPiece.iY+iPy < FRAME_H )
     if( sPiece.iBlock[iPx][iPy] && sBlock[sPiece.iX+iPx][sPiece.iY+iPy+1].dwKind )
      return FALSE;
  sPiece.iY+=1;
  return TRUE;
 case LEFT_P:
  iPx = GetLeft(sPiece);
  if( sPiece.iX-1+iPx < 0 )
   return FALSE;
  for(iPy=0 ; iPy<PIECE_H ; iPy++)
   for(iPx=0 ; iPx<PIECE_W ; iPx++)
    if(sPiece.iX+iPx >= 0 && sPiece.iX+iPx <FRAME_W && sPiece.iY+iPy >= 0 && sPiece.iY+iPy < FRAME_H )
     if( sPiece.iBlock[iPx][iPy] && sBlock[sPiece.iX+iPx-1][sPiece.iY+iPy].dwKind )
      return FALSE;
  sPiece.iX-=1;
  return TRUE;
 case RIGHT_P:
  iPx = GetRight(sPiece);
  if( sPiece.iX+1+iPx >= FRAME_W )
   return FALSE;
  for(iPy=0 ; iPy<PIECE_H ; iPy++)
   for(iPx=0 ; iPx<PIECE_W ; iPx++)
    if(sPiece.iX+iPx >= 0 && sPiece.iX+iPx <FRAME_W && sPiece.iY+iPy >= 0 && sPiece.iY+iPy < FRAME_H )
     if( sPiece.iBlock[iPx][iPy] && sBlock[sPiece.iX+iPx+1][sPiece.iY+iPy].dwKind )
      return FALSE;
  sPiece.iX+=1;
  return TRUE;
 }
 return FALSE;
}
// Name:ChangePiece()// Desc:左右のピースの入れ替え
BOOL ChangePiece()
{
 INT iWork = sPiece.iBlock[0][0];
 sPiece.iBlock[0][0] = sPiece.iBlock[1][0];
 sPiece.iBlock[1][0] = iWork;

 return TRUE;
}
// Name:CreatePiece()// Desc:次に使用するピースの生成
VOID CreatePiece( )
{
 
  sNextPiece.iX = 9;
  sNextPiece.iY = 2;
  sNextPiece.dwKind = WHITE_B;
  switch( rand()%3 )
 {
 case 0:
  sNextPiece.iBlock[0][0] = WHITE_B;
  break;
 case 1:
  sNextPiece.iBlock[0][0] = BLUE_B;
  break;
 case 2:
  sNextPiece.iBlock[0][0] = RED_B;
  switch( rand()%3 )
  {
 case 0:
  sNextPiece.iBlock[0][0] = WHITE_B;
  break;
 case 1:
  sNextPiece.iBlock[0][0] = BLUE_B;
  break;
 case 2:
  sNextPiece.iBlock[0][0] = RED_B;
  }
 }
  switch( rand()%3 )
  {
 case 0:
  sNextPiece.iBlock[0][1] = WHITE_B;
  break;
 case 1:
  sNextPiece.iBlock[0][1] = BLUE_B;
  break;
 case 2:
  sNextPiece.iBlock[0][1] = RED_B;
  switch( rand()%3 )
  {
 case 0:
  sNextPiece.iBlock[0][1] = WHITE_B;
  break;
 case 1:
  sNextPiece.iBlock[0][1] = BLUE_B;
  break;
 case 2:
  sNextPiece.iBlock[0][1] = RED_B;
  }
 }
}
// Name:NextPiece()// Desc:次のピースへの切り替え
VOID NextPiece( )
{
 sPiece = sNextPiece;
 sPiece.iX = FRAME_W/2-1;
 sPiece.iY = 0;
 CreatePiece();
}
// Name:CopyPiece()// Desc:フレームにピースをコピー
VOID CopyPiece( )
{
 INT i,j;
 for(i=0 ; i<PIECE_W ; i++)
  for(j=0 ; j<PIECE_H ; j++)
   if( sPiece.iBlock[i][j] )
    sBlock[sPiece.iX+i][sPiece.iY+j].dwKind = sPiece.iBlock[i][j];
 sPiece.dwKind = 0;
}
// Name:DeleteBall()// Desc:ボールの削除
INT DeleteBall( )
{
 int i,j,k,lf,df,ch,chh;
 ch=0;
 lf=1;
 // つながっているブロックをクリア
 while(lf==1){
  Sleep(160);
 nConnects = 0;
 df=0;
 chh=0;
 // 座標をクリア
 for(i = 0; i < MAX_CONNECT_BLOCK; i++)
 {
  nX[i] = 0;
  nY[i] = 0;
 }
 for(i = 0; i < FRAME_W; i++)
 {
  for(j = 0; j < FRAME_H; j++)
  {
   // 連続しているブロックの数をカウント
   if(sBlock[i][j].dwKind != NONE_D)
   {
    Count(i,j);
   }
   if(nConnects >= ERASE_MIN)
   {
    // 4つ以上連続しているブロックを消去
    for(k = 0; k < nConnects; k++)
    {
     sBlock[nX[k]][nY[k]].dwKind = NONE_D;
     df=1;
     chh=chh+nConnects;
     nX[k] = 0;
     nY[k] = 0;
     Sleep(100);
    }
   }
   nConnects = 0;
  }
 }
 if(df==1)
 {
  ch=ch+1;
  Score=Score+ch*(10*chh);
  chh=0;
 }
 
 ShiftBall();
 if(df==0)
 {
  lf=0;
 }
 }
 return 0;
}
void Count(int x,int y)
{
 int c = sBlock[x][y].dwKind;
 nX[nConnects] = x;
 nY[nConnects] = y;
 nConnects++; // カウント
 sBlock[x][y].dwKind = NONE_D;
 if(x+1<FRAME_W && sBlock[x+1][y].dwKind==c) Count(x+1,y);
 if(y+1<FRAME_H && sBlock[x][y+1].dwKind==c) Count(x,y+1);
 if(x-1>=0 && sBlock[x-1][y].dwKind==c) Count(x-1,y);
 if(y-1>=0 && sBlock[x][y-1].dwKind==c) Count(x,y-1); 
 sBlock[x][y].dwKind = c;
}

(2)

INT PlaceNotEmpty()
{
 int result = 0;
 INT i,j;
 for(i=0 ; i<PIECE_W ; i++)
  for(j=0 ; j<PIECE_H ; j++)
   if( sBlock[FRAME_W/2+i][j].dwKind )
   {
    // 新しい場所にすでにブロックがあったらゲームオーバー
     result = 1;
   }
 return result;
}
VOID DrawScoreNum(int x,int y,int num)
{
 int pos,i;
 char s[16];
 sprintf(s,"%05d",num);
 for(i = 0; i < 5; i++)
 {
  pos = (int)(s[i] - '0');
  DrawSprite(
   lpDev,lpTex2,
   (FLOAT)x * B_SIZE + i * NUMBER_W, (FLOAT)y * B_SIZE,
   NUMBER_W,NUMBER_H,
   NUMBER_W/2,NUMBER_H/2,
   1,1,
   (FLOAT)pos*NUMBER_W,0.f,
   0,0xffffffff);
 }
}
VOID DrawScoreChar()
{
 int i,j;
 // スコア表示領域の確保
 for(i = 0; i < SCORE_W; i++)
  for(j=0 ; j< SCORE_H ; j++ )
    DrawSprite(
     lpDev,NULL,
     (FLOAT)(SCORE_PX + i)*B_SIZE, (FLOAT)(SCORE_PY+j)*B_SIZE,
     B_SIZE, B_SIZE,
     B_SIZE/2, B_SIZE/2,
     1, 1,
     0, 0,
     0, 0xffffffff); 
 // スコアの文字の表示
 DrawSprite(
   lpDev,lpTex2,
   (SCORE_PX)*B_SIZE, (SCORE_PY)*B_SIZE,
   100.f, 24.f,
   50.f, 12.f,
   0, 0,
   0, 24,
   0, 0xffffffff); 
}
VOID Draw()
{
 int i,j;
 BYTE bKey[256];
 // 経過時間を取得
 FLOAT fTime = DXUtil_Timer(T_GETELAPSEDTIME);
 //アルファブレンドの設定
 SetAlphablend(lpDev, TRUE);
 //キー情報を取得
 GetKeyboardState( bKey );
 //ピースの操作
 if( iDel == 0 ){
  if( bKey[VK_RIGHT]&0x80 && !(bSaveKey[VK_RIGHT]&0x80) ) //右へ
   MovePiece( RIGHT_P );
  if( bKey[VK_LEFT]&0x80 && !(bSaveKey[VK_LEFT]&0x80) ) // 左へ
   MovePiece( LEFT_P );
  if( bKey[VK_DOWN]&0x80 ) // 下へ
   MovePiece( DOWN_P );
  if( bKey[VK_SPACE]&0x80 && !(bSaveKey[VK_SPACE]&0x80) ) //回転
   ChangePiece( );
 }
 //キー情報の保管
 memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
 //更新時間の制御
 {
  static DWORD dwLastTime = timeGetTime();
  DWORD dwTime = timeGetTime();
  if( dwTime - dwLastTime > 800 )
  {
   if( iDel == 0 )
   {
    if( MovePiece( DOWN_P ) )
    {
     //下に移動できた時の作業
    }
    else
    {
     //下に移動できなかった時の作業
     CopyPiece();
     ShiftBall();
     DeleteBall();
     if(PlaceNotEmpty())
     {
      fGameOver = 1;
      // ゲームオーバーのエフェクト
      DrawGameOverEffect();
      return;
     }
     if( iDel == 0 )
      NextPiece();
    }
   }
   else
   {
    iDel = 0;
    NextPiece();
   }
    
   dwLastTime = dwTime;
  }
 }
 // クリア
 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();
 }
 VOID DrawScoreChar();
 //
 lpDev->Present( NULL, NULL, NULL, NULL );
}

落ち物

#define _CRT_SECURE_NO_DEPRECATE 1
//必要なライブラリファイルのロード
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
//必要なヘッダーファイルのインクルード
#define STRICT
#include <windows.h>
#include <d3dx9.h>
#include "GPLib.h"
#include "MyLib.h"
//シンボル定義及びマクロ
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define SAFE_RELEASE(p)   { if(p) { (p)->Release(); (p)=NULL; } }
//円周率
#define PI 3.1415926535f
//ブロックサイズ
#define B_SIZE 32
//フレームサイズ
#define FRAME_W 10
#define FRAME_H 14
#define MAX_CONNECT_BLOCK (100)
// 消去に必要な連続の数
#define ERASE_MIN (4)
#define SCORE_PX 5  
#define SCORE_PY 4
#define SCORE_W 8
#define SCORE_H 2
#define NUMBER_W 24
#define NUMBER_H 24
//ピースサイズ
#define PIECE_W 2
#define PIECE_H 1
//移動方向
#define LEFT_P 1<<0
#define RIGHT_P 1<<1
#define DOWN_P 1<<2
//ブロックの種類
#define NONE_D  0
#define WHITE_B  1
#define BLUE_B   2
#define RED_B  3
#define WALL1_B   4

// モード
#define MODE_OPENING  0
#define MODE_GAME_PREPARE 1
#define MODE_GAME   2
#define MODE_ENDING   3
//操作PIECE
struct SPIECE
{
 INT  iX,iY;//フィールド内のピース左上の位置
 DWORD dwKind;//ピースの種類
 INT  iBlock[PIECE_W][PIECE_H];//ピースの形状
};
//配置BLOCK
struct SBLOCK
{
 DWORD dwKind;//ブロックの種類
};
//関数プロトタイプの宣言
VOID Draw();
VOID FreeDx();
VOID Initialize();
BOOL ChangePiece();
INT DeleteLine( );
void Count(int, int);
BOOL MovePiece( INT );
VOID CreatePiece( );
VOID NextPiece( );
VOID CopyPiece( );
INT DeleteBall( );
VOID ShiftBall();
VOID DrawGameOverEffect();
BOOL RotationPiece();
INT GetLeft( SPIECE );
INT GetRight( SPIECE );
INT GetDown( SPIECE );
//グローバルなインスタンスを宣言
LPDIRECT3D9   lpD3d = NULL;
LPDIRECT3DDEVICE9 lpDev = NULL;
LPDIRECT3DTEXTURE9 lpTex = NULL;
LPDIRECT3DTEXTURE9 lpTex2 = NULL;
LPDIRECT3DTEXTURE9 lpTex3 = NULL;
LPDIRECT3DTEXTURE9 lpTex4 = NULL;
LPDIRECT3DTEXTURE9 lpTitleTex = NULL;
LPDIRECT3DTEXTURE9 lpEndingTex = NULL;

HWND    hWndApp;
LPD3DXFONT   lpFont = NULL;

INT  iMode;
//キーボード情報
BYTE bSaveKey[256];
//操作ピース情報
SPIECE sPiece;
//予告ピース情報
SPIECE sNextPiece;
//配置ブロック情報
SBLOCK sBlock[FRAME_W][FRAME_H];
//削除中かどうかの判断フラグ&削除ライン数
INT  iDel;
// ゲームオーバーフラグ
INT  fGameOver;

INT  Score;
INT  HighScore;
// つながったブロックの値
int nConnects;
// つながったブロックの座標
int nX[MAX_CONNECT_BLOCK];
int nY[MAX_CONNECT_BLOCK];
// ブロッククリア
void clear();
// ブロック表示
void show();
// ブロックの消去
void delBlock();
// 連続しているブロックのカウント
void Count(int x,int y);
// Name:Draw()
// Desc:描画
VOID Opening()
{
 BYTE bKey[256];
 //キー情報を取得
 GetKeyboardState( bKey );
 lpDev->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,128), 1.0f, 0 );
 // 描画開始 
 if( SUCCEEDED( lpDev->BeginScene() ) ){
 
  // タイトルの描画
  DrawSprite(
   lpDev,lpTitleTex,
   0, 0,
   WINDOW_WIDTH, WINDOW_HEIGHT,
   WINDOW_WIDTH/2, WINDOW_HEIGHT/2,
   1, 1,
   0, 0,
   0, 0xffffffff);
  // 描画終了
  lpDev->EndScene();
 }
 //
 lpDev->Present( NULL, NULL, NULL, NULL );
 // スペースキーを押されたらモードチェンジ
 if( bKey[VK_SPACE]&0x80 && !(bSaveKey[VK_SPACE]&0x80))
 {
  // ゲーム準備モード
  iMode = MODE_GAME_PREPARE;
 }
 // キーボードのコピー
 memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
}
// Name:GamePrepare()// Desc:ゲームの準備
VOID GamePrepare()
{
 int i,j;
 // スコアを0にする
 Score = 0;
 //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;
 // ゲームオーバーフラグをリセット
 fGameOver = 0;
 // セーブキーのクリア
 ZeroMemory( bSaveKey, sizeof(BYTE)*256);
 // ゲーム準備モード
 iMode = MODE_GAME;
 // オートリピートカウントを0にする
}
// Name:Ending()// Desc:オープニング
VOID Ending()
{
 BYTE bKey[256];
 //キー情報を取得
 GetKeyboardState( bKey );
 lpDev->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,128), 1.0f, 0 );
 // 描画開始
 if( SUCCEEDED( lpDev->BeginScene() ) ){
  // タイトルの描画
  DrawSprite(
   lpDev,lpEndingTex,
   0, 0,
   WINDOW_WIDTH, WINDOW_HEIGHT,
   WINDOW_WIDTH/2, WINDOW_HEIGHT/2,
   1, 1,
   0, 0,
   0, 0xffffffff);
  // 描画終了
  lpDev->EndScene();
 }
 lpDev->Present( NULL, NULL, NULL, NULL );
 // スペースキーを押されたらモードチェンジ
 if( bKey[VK_SPACE]&0x80 && !(bSaveKey[VK_SPACE]&0x80))
 {
  // オープニングモード
  iMode = MODE_OPENING;
  // キーボードのクリア
  ZeroMemory( bSaveKey, sizeof(BYTE)*256);
 }
 // キーボードのコピー
 memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
}

第2印象

ウォーズだけじゃ飽き足らず、ダンボール戦機とWのDVD借りてきました。とりあえず、無印のアルテミスまで見ました。
なんか、前に書いた気がするけどアニメ見たら色々変わってきました。

箱の中の魔術師さんとユウヤとジン君が好きですね。あとヒロ君とか。
ウォーズなら、ヒカルを筆頭に、ジェノック全体とタケル君。

LBXならリュウビとかバル・ダイバーとかジョーカーとかナイトメアとか。
ナイトフレームとストライダーフレームが多めです。でも、ワイルドフレームも…。
DCシリーズ欲しいんですよね。ジャンヌDも商品化してほしいところです。

←prev next→