この広告は30日以上更新がないブログに表示されます。
ログイン |
更新は不定期です。 アイカツのマイキャラパーツやそれ以外にもアニメ、漫画、ゲームの話、好きな物の話など。
// 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 )
{
}
}
// 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;
}
INT PlaceNotEmpty()
#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 );
}
ウォーズだけじゃ飽き足らず、ダンボール戦機とWのDVD借りてきました。とりあえず、無印のアルテミスまで見ました。
性 別 | 女性 |
地 域 | 北海道 |
職 業 | 夢追人 |
血液型 | A型 |