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 );
}