コード:
//--------------------------------------------------------------------------------------
// File: EmptyProject.cpp
//
// Empty starting point for new Direct3D applications
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
//古い文字列操作関数に対する警告を回避する
#pragma warning (disable : 4995)
#pragma warning (disable : 4996)
#include <stdio.h>
#include <tchar.h>
#include "dxstdafx.h"
#include "resource.h"
//---------------------------------------------
//プロトタイプ宣言
//-------------------------------
//---------------------------------------------
//その他のインクルード
//-------------------------------
#include "keycheck.h"
//---------------------------------------------
//その他のディファイン
//最大値とかを指定させる
//-------------------------------
/*自機用*/
#define MYSHIP 1 //自機の最大数
#define MYSHIP_SPEED 4 //自機用の移動速度
/*自機用の弾*/
#define BULLET_SPEED 11 //自機用弾の移動速度
#define BULLET_MAX 10 //弾の最大数
/*敵用*/
#define ENEMY_MAX 1 //敵の最大数
#define ENEMY_SPEED 3 //敵の動く最大速度
#define ENEMY_SPEED_B 4 //敵の動く最大速度パターンB
/*敵用の弾*/
#define ENEMY_BLT_MAX 10 //敵の弾の最大数
#define ENEMY_BLT_SPEED 12 //敵用弾の移動速度
//--------------------------------------------------------------------------------------
//関数
//-------------------------------
int gamemode = 0;//ゲームモード管理変数『0:タイトル 1:ゲーム画面 2:ゲームクリア 3:ゲームオーバー』
int times = 60,ti = 0,te = 0,ts = 0;//制限時間管理用変数
int count;//弾の発射数
int i;
int score;//得点
int Hi_score;//最高得点
int Life = 50;//体力
//--------------------------------------------------------------------------------------
//テクスチャ関数
//-------------------------------
LPDIRECT3DTEXTURE9 pTexture;//自機用
LPDIRECT3DTEXTURE9 pText_tama;//自弾用
LPDIRECT3DTEXTURE9 pText_teki;//敵用
LPDIRECT3DTEXTURE9 pText_teta;//敵弾用
LPDIRECT3DTEXTURE9 pText_icon;//アイテム用
LPDIRECT3DTEXTURE9 pText_back;//背景用
//LPDIRECT3DTEXTURE9 pText_logo_a;//ロゴ001用
LPDIRECT3DTEXTURE9 pText_life;//自機ライフ用
//スプライトの作成
LPD3DXSPRITE pSprite;
//--------------------------------------------------------------------------------------
//座標関数
//-------------------------------
D3DXVECTOR3 gPos_map = D3DXVECTOR3(0,0,0);//背景画像用の画像指定位置
//D3DXVECTOR3 gPos_logo_a = D3DXVECTOR3(150,420,0);//ロゴ001画像用の画像指定位置
//--------------------------------------------------------------------------------------
//マトリクス
//-------------------------
D3DXMATRIX matrix_ji;//自機
D3DXMATRIX matrix_back;//背景
//D3DXMATRIX matrix_logo_a;//ロゴ001
//---------------------------------------------
//自機の構造体 ※基本「0」で!
//---------------------------------
typedef struct _myship
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
D3DXMATRIX matrix;//行列
};
_myship myship[MYSHIP];//弾構造体の宣言
//---------------------------------------------
//弾の構造体
//------------------
typedef struct _bullet
{
D3DXVECTOR3 gPos_tm;//自機弾用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_bullet bullets[BULLET_MAX];//弾構造体の宣言
//---------------------------------------------
//敵の構造体
//--------------------------
typedef struct _enemy
{
D3DXVECTOR3 gPos_te;//敵の座標
int active_te;//有効フラグ 0:OFF 1:ON
int type;//敵の種類
D3DXMATRIX matrix_te;//敵の行列
};
_enemy enemy[ENEMY_MAX];//敵構造体の宣言
//---------------------------------------------
//敵の構造体 2
//--------------------------
typedef struct _enemy_a
{
D3DXVECTOR3 gPos;//敵の座標
int active;//有効フラグ 0:OFF 1:ON
int type;//敵の種類
D3DXMATRIX matrix;//敵の行列
};
_enemy_a enemy_a[ENEMY_MAX];//敵構造体の宣言
//---------------------------------------------
//敵の弾の構造体
//------------------
typedef struct _enemy_blt
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_enemy_blt enemy_blt[ENEMY_BLT_MAX];//弾構造体の宣言
//---------------------------------------------
//敵の弾の構造体 2
//------------------
typedef struct _enemy_blt2
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_enemy_blt2 enemy_blt2[ENEMY_BLT_MAX];//弾構造体の宣言
//--------------------------------------------------------------------------------------
//フォント作成 変数宣言
//--------------------------------
LPD3DXFONT pFont;///フォント0タイプ= ARP浪漫明朝体U》主に、[文字表示]など
LPD3DXFONT pFonta;//フォントAタイプ=《Broadway BT》主に、[制限時間]など
LPD3DXFONT pFontb;//フォントBタイプ=《HGep037》主に、[ステータス表示]など
LPD3DXFONT pFontc;//フォントCタイプ=《FancyBalloonsAlphabet》主に、[最高得点]など
LPD3DXFONT pFontd;//フォントDタイプ=《BackSeatAlphabetWidth》主に、[スコア(得点)]など
LPD3DXFONT pFonte;//フォントEタイプ=《D3 Cosmism》主に、[時間]など
LPD3DXFONT pFontf;//フォントFタイプ=《SHOWA73ARegular》主に、[タイトル画面文字]など
LPD3DXFONT pFontg;//フォントGタイプ=《富士ポップP》主に、[その他 小さな文字]など
LPD3DXFONT pFonth;//フォントHタイプ=《TAPEMAN》主に、[]など
//--------------------------------------------------------------------------------------
// Create any D3DPOOL_MANAGED resources here
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
return S_OK;
}
//--------------------------------------------------------------------------------------
// Create any D3DPOOL_DEFAULT resources here
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
return S_OK;
}
//--------------------------------------------------------------------------------------
// Handle updates to the scene
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
// キー状態を調べる関数
keycheck( );
switch(gamemode)
{
case 0://【タイトル画面】
if(gamemode == 0)
{
if(KEY_S == PUSH)//Sキーが押されたら下記の処理を実行!
{
gamemode = 1;//タイトル画面からゲーム画面へ
}
}
//<matrix_te用=ロゴ001画像>
//移動行列を作成
//D3DXMatrixTranslation( &matrix_logo_a,0,0,0);
break;
case 1://【ゲーム画面】
//--------------------------------------------------------------------------------------
//自機を移動させる処理 (押された時、押しっぱなしになった時)
//-------------------------------------------------------------------
if(KEY_LEFT == PUSH || KEY_LEFT == HOLD)
{
myship[0].gPos.x -= MYSHIP_SPEED;
}
if(KEY_RIGHT == PUSH || KEY_RIGHT == HOLD)
{
myship[0].gPos.x += MYSHIP_SPEED;
}
if(KEY_UP == PUSH || KEY_UP == HOLD)
{
myship[0].gPos.y -= MYSHIP_SPEED;
}
if(KEY_DOWN == PUSH || KEY_DOWN == HOLD)
{
myship[0].gPos.y += MYSHIP_SPEED;
}
//--------------------------------------------------------------------------------------
//自機の画像が
//画面から消えないようにする
//-------------------------------
if(myship[0].gPos.x < 0)//画面の左
{
myship[0].gPos.x = 0;
}
if(myship[0].gPos.x >= 585)//画面の右
{
myship[0].gPos.x = 585;
}
if(myship[0].gPos.y < 0)//画面の上
{
myship[0].gPos.y = 0;
}
if(myship[0].gPos.y >= 425)//画面の下
{
myship[0].gPos.y = 425;
}
////////
if(KEY_A == PUSH)
{
score += 1000;
}
//--------------------------------------------------------------------------------------
//弾の発射
//----------------------------------
if(KEY_SPACE == PUSH)//スペースキーが押されたら
{
for (int i = 0; i < BULLET_MAX; i++)
{
if(bullets[i].active == 0)
{
bullets[i].active = 1;//弾の表示
//自機の中央に表示させる
bullets[i].gPos_tm.x = myship[0].gPos.x + 29;
bullets[i].gPos_tm.y = myship[0].gPos.y + 15;
break;//処理を抜け出す
}
}
}
// for文で弾の数だけやる
for(int i = 0;i < BULLET_MAX; i++)
{
switch(bullets[i].type)
{
case 0://
if(bullets[i].active == 1)
{
// 弾の座標はbullet構造体の中に入れる
bullets[i].gPos_tm.y -= BULLET_SPEED;//弾の座標を減らす
if(bullets[i].gPos_tm.y < 0)
{
bullets[i].gPos_tm.y = myship[i].gPos.y;
bullets[i].active = 0;
}
}
break;
case 1://
break;
}
}
//--------------------------------------------------------------------------------------
//自機用の弾と敵の当たり判定
//-------------------------------------------
for(int i = 0;i < BULLET_MAX; i++)
{
for(int j = 0;j < ENEMY_MAX;j++)
{
if(bullets[i].active == 1)//弾がないのに当たり判定させないため
{
if(bullets[i].gPos_tm.x >= enemy[j].gPos_te.x)
{
if(bullets[i].gPos_tm.x <= enemy[j].gPos_te.x + 70)//画像の中心部が初期設定になっているので半分の値を代入
{
if(bullets[i].gPos_tm.y >= enemy[j].gPos_te.y)
{
if(bullets[i].gPos_tm.y <= enemy[j].gPos_te.y + 35)//画像の中心部が初期設定になっているので半分の値を代入
{
if(enemy[j].active_te == 1)//敵のフラグがONの状態で下記を代入
{
//弾が当たったら、フラグをOFFにする
enemy[j].active_te = 0;
bullets[i].active = 0;
if(enemy_blt[j].gPos.y >= 640)//自機用の弾に当たっても敵用の弾は画面外に出るまでは消さない
{
enemy_blt[j].active = 0;
}
score += 100;//敵を倒すことが出来たら得点UP!
if(enemy[j].active_te == 0)
{
enemy[j].active_te = 1;
enemy[j].gPos_te.x = -100;
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//自機用の弾と敵の当たり判定 2
//-------------------------------------------
for(int i = 0;i < BULLET_MAX; i++)
{
for(int j = 0;j < ENEMY_MAX;j++)
{
if(bullets[i].active == 1)//弾がないのに当たり判定させないため
{
if(bullets[i].gPos_tm.x >= enemy_a[j].gPos.x)
{
if(bullets[i].gPos_tm.x <= enemy_a[j].gPos.x + 70)//画像の中心部が初期設定になっているので半分の値を代入
{
if(bullets[i].gPos_tm.y >= enemy_a[j].gPos.y)
{
if(bullets[i].gPos_tm.y <= enemy_a[j].gPos.y + 35)//画像の中心部が初期設定になっているので半分の値を代入
{
if(enemy_a[j].active == 1)//敵のフラグがONの状態で下記を代入
{
//弾が当たったら、フラグをOFFにする
enemy_a[j].active = 0;
bullets[i].active = 0;
if(enemy_blt2[j].gPos.y >= 640)//自機用の弾に当たっても敵用の弾は画面外に出るまでは消さない
{
enemy_blt2[j].active = 0;
}
score += 100;//敵を倒すことが出来たら得点UP!
if(enemy_a[j].active == 0)
{
enemy_a[j].active = 1;
enemy_a[j].gPos.x = -100;
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵の動き
//------------------------------------------
//敵の動き
for(int i = 0;i< ENEMY_MAX;i++)
{
if(enemy[i].active_te == 1)
{
enemy[i].gPos_te.x += ENEMY_SPEED;
if(enemy[i].gPos_te.x > 640)
{
enemy[i].gPos_te.x = -100;
}
}
}
//敵の動き B
for(int i = 0;i< ENEMY_MAX;i++)
{
if(enemy_a[i].active == 1)
{
enemy_a[i].gPos.x -= ENEMY_SPEED_B;
if(enemy_a[i].gPos.x < -70)
{
enemy_a[i].gPos.x = 680;
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for (int i = 0; i < ENEMY_BLT_MAX; i++)
{
for(int j = 0;j < ENEMY_MAX; j++)
{
if(enemy_blt[0].active == 0)
{
enemy_blt[0].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[i].gPos.x = enemy[j].gPos_te.x + 30;
enemy_blt[i].gPos.y = enemy[j].gPos_te.y + 20;
//敵が自機用の弾に当たって倒されたら
//これ以上敵用の弾が出ないようにする。
if(enemy[j].active_te == 0)
{
if(enemy_blt[i].gPos.y >= 640)//敵用の弾が画面の外に出たら
{
enemy_blt[i].active = 0;
}
}
break;
}
}
}
// for文で弾の数だけやる
for(int i = 0;i < ENEMY_BLT_MAX; i++)
{
switch(enemy_blt[i].type)
{
case 0://
if(enemy_blt[i].active == 1)
{
// 弾の座標はbullet構造体の中に入れる
enemy_blt[i].gPos.y += ENEMY_BLT_SPEED;//弾の座標を増やす
if(enemy_blt[i].gPos.y > 640)
{
enemy_blt[i].gPos.y = enemy[i].gPos_te.y;
enemy_blt[i].active = 0;
}
}
break;
case 1://
break;
}
}
//2体目の敵
//敵用の弾
for (int i = 0; i < ENEMY_BLT_MAX; i++)
{
for(int j = 0;j < ENEMY_MAX; j++)
{
if(enemy_blt2[0].active == 0)
{
enemy_blt2[0].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt2[i].gPos.x = enemy_a[j].gPos.x + 30;
enemy_blt2[i].gPos.y = enemy_a[j].gPos.y + 20;
//敵が自機用の弾に当たって倒されたら
//これ以上敵用の弾が出ないようにする。
if(enemy_a[j].active == 0)
{
if(enemy_blt2[i].gPos.y >= 640)//敵用の弾が画面の外に出たら
{
enemy_blt2[i].active = 0;
}
}
break;
}
}
}
// for文で弾の数だけやる
for(int i = 0;i < ENEMY_BLT_MAX; i++)
{
switch(enemy_blt2[i].type)
{
case 0://
if(enemy_blt2[i].active == 1)
{
// 弾の座標はbullet構造体の中に入れる
enemy_blt2[i].gPos.y += ENEMY_BLT_SPEED;//弾の座標を増やす
if(enemy_blt2[i].gPos.y > 640)
{
enemy_blt2[i].gPos.y = enemy_a[i].gPos.y;
enemy_blt2[i].active = 0;
}
}
break;
case 1://
break;
}
}
//--------------------------------------------------------------------------------------
//敵用の弾と自機の当たり判定
//-----------------------------------------
for(int i = 0;i < ENEMY_BLT_MAX;i++)
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//自機に当たったら、敵用の弾と自機を消す
{
if(enemy_blt[i].gPos.x > myship[0].gPos.x + 5)
{
if(enemy_blt[i].gPos.x < myship[0].gPos.x + 55)
{
if(enemy_blt[i].gPos.y > myship[0].gPos.y + 15)
{
if(enemy_blt[i].gPos.y < myship[0].gPos.y + 50)
{
enemy_blt[i].active = 0;//敵用の弾を非表示
if(enemy_blt[i].active == 0)
{
Life -= 5;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;
}
}
}
}
}
}
}
}
}
//敵の弾が自機に当たって自機が消えたら今までの弾も非表示
for(int i = 0; i < ENEMY_BLT_MAX;i++)
{
if(myship[0].active == 0 && enemy_blt[i].active == 0)
{
for(int k = 0;k < BULLET_MAX;k++)
{
bullets[k].active = 0;//弾を非表示
}
}
}
//--------------------------------------------------------------------------------------
//敵用の弾と自機の当たり判定 2
//-----------------------------------------
for(int i = 0;i < ENEMY_BLT_MAX;i++)
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//自機に当たったら、敵用の弾と自機を消す
{
if(enemy_blt2[i].gPos.x > myship[0].gPos.x + 5)
{
if(enemy_blt2[i].gPos.x < myship[0].gPos.x + 55)
{
if(enemy_blt2[i].gPos.y > myship[0].gPos.y + 15)
{
if(enemy_blt2[i].gPos.y < myship[0].gPos.y + 50)
{
enemy_blt2[i].active = 0;//敵用の弾を非表示
if(enemy_blt2[i].active == 0)
{
Life -= 5;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;
}
}
}
}
}
}
}
}
}
//敵の弾が自機に当たって自機が消えたら今までの弾も非表示
for(int i = 0; i < ENEMY_BLT_MAX;i++)
{
if(myship[0].active == 0 && enemy_blt2[i].active == 0)
{
for(int k = 0;k < BULLET_MAX;k++)
{
bullets[k].active = 0;//弾を非表示
}
}
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score > Hi_score)
{
Hi_score = score;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score >= 5000)//ある一定の得点を超えたらクリア画面にする
{
gamemode = 2;
}
//--------------------------------------------------------------------------------------
//マトリクスを作成
//---------------------------------------
// for文で弾の数だけまとめてMatrix計算する
for(int i = 0;i < BULLET_MAX; i++)
{
//<matrix用=弾>
//移動行列を作成
D3DXMatrixTranslation( &bullets[i].matrix,bullets[i].gPos_tm.x,bullets[i].gPos_tm.y,0);
}
for(int i = 0;i < MYSHIP;i++)
{
//<matrix_ji用=自機>
//移動行列を作成
D3DXMatrixTranslation( &myship[i].matrix,myship[i].gPos.x,myship[i].gPos.y,0);
}
for(int i = 0;i < ENEMY_MAX; i++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy[i].matrix_te,enemy[i].gPos_te.x,enemy[i].gPos_te.y,0);
}
for(int i = 0;i < ENEMY_MAX; i++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_a[i].matrix,enemy_a[i].gPos.x,enemy_a[i].gPos.y,0);
}
//敵の弾を敵弾の数だけ
for(int i = 0;i < ENEMY_BLT_MAX; i++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_blt[i].matrix,enemy_blt[i].gPos.x,enemy_blt[i].gPos.y,0);
}
//敵の弾を敵弾の数だけ
for(int i = 0;i < ENEMY_BLT_MAX; i++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_blt2[i].matrix,enemy_blt2[i].gPos.x,enemy_blt2[i].gPos.y,0);
}
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back,0,0,0);
break;
case 2://【ゲームクリア画面】
if(gamemode == 2)
{
score = 0;
for(int i = 0;i < ENEMY_MAX;i++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
//初期設定に戻す
//敵1
enemy[i].gPos_te.x = -80;
enemy[i].gPos_te.y = 50;
//敵2
enemy_a[i].gPos.x = 690;
enemy_a[i].gPos.y = 90;
//敵用の弾
enemy_blt[i].gPos.x = 280;
enemy_blt[i].gPos.y = 430;
//敵用の弾2
enemy_blt2[i].gPos.x = 280;
enemy_blt2[i].gPos.y = 430;
//自機
myship[i].gPos.x = 280;
myship[i].gPos.y = 420;
//体力(ライフ)
Life = 50;
}
}
}
break;
case 3://【ゲームオーバー画面】
if(gamemode == 3)
{
score = 0;
for(int i = 0;i < ENEMY_MAX;i++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
//初期設定に戻す
//敵1
enemy[i].gPos_te.x = -80;
enemy[i].gPos_te.y = 50;
//敵2
enemy_a[i].gPos.x = 690;
enemy_a[i].gPos.y = 90;
//敵用の弾
enemy_blt[i].gPos.x = 280;
enemy_blt[i].gPos.y = 430;
//敵用の弾2
enemy_blt2[i].gPos.x = 280;
enemy_blt2[i].gPos.y = 430;
//自機
myship[i].gPos.x = 280;
myship[i].gPos.y = 420;
//体力(ライフ)
Life = 50;
}
}
}
break;
case 4://
break;
}
}
//--------------------------------------------------------------------------------------
// Render the scene
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
HRESULT hr;
// Clear the render target and the zbuffer
V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 128, 255), 1.0f, 0) );
// Render the scene
if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{
//ここから描画処理を行う
//スプライトの開始
pSprite->Begin(D3DXSPRITE_ALPHABLEND);
switch(gamemode)
{
case 0://【タイトル画面】
/*//ロゴ001
//テクスチャの表示領域
RECT rect_logo_a;
SetRect(&rect_logo_a,0,0,640,480);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_logo_a);
//スプライトで2D描画=自機
pSprite->Draw( pText_logo_a,&rect_logo_a,NULL,&gPos_logo_a,D3DCOLOR_ARGB(255,255,255,255));*/
break;
case 1://【ゲーム画面】
//背景画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back;
SetRect(&rect_back,0,0,640,480);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back);
//スプライトで2D描画=背景
pSprite->Draw( pText_back,&rect_back,NULL,&gPos_map,D3DCOLOR_ARGB(255,255,255,255));
for(int i = 0;i < MYSHIP;i++)
{
if(myship[i].active == 1)
{
//自機
//テクスチャの表示領域
RECT rect_tex;
SetRect(&rect_tex,0,0,60,60);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&myship[i].matrix);
//スプライトで2D描画=自機
pSprite->Draw( pTexture,&rect_tex,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int i = 0;i < BULLET_MAX; i++)
{
if(bullets[i].active == 1)
{
//弾
//テクスチャの表示領域
RECT rect_tex_ta;
SetRect(&rect_tex_ta,0,0,10,10);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&bullets[i].matrix);
//中心をセット
D3DXVECTOR3 center_ta = D3DXVECTOR3(10.f / 2.f,10.f / 2.f,0.f);
//スプライトで2D描画=弾
pSprite->Draw( pText_tama,&rect_tex_ta,¢er_ta,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int i = 0;i < ENEMY_MAX; i++)
{
if( enemy[i].active_te == 1)
{
//敵
//テクスチャの表示領域
RECT rect_tex_te;
SetRect(&rect_tex_te,0,0,70,35);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy[i].matrix_te);
//スプライトで2D描画=敵
pSprite->Draw( pText_teki,&rect_tex_te,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int i = 0;i < ENEMY_MAX; i++)
{
if( enemy_a[i].active == 1)
{
//敵2
//テクスチャの表示領域
RECT rect_te_a;
SetRect(&rect_te_a,0,0,70,35);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_a[i].matrix);
//スプライトで2D描画=敵
pSprite->Draw( pText_teki,&rect_te_a,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int i = 0;i < 10; i++)
{
if( enemy_blt[i].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_teta;
SetRect(&rect_tex_teta,0,0,12,12);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_blt[i].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_teta,&rect_tex_teta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int i = 0;i < 10; i++)
{
if( enemy_blt2[i].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_teta;
SetRect(&rect_tex_teta,0,0,12,12);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_blt2[i].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_teta,&rect_tex_teta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
break;
case 2://【ゲームクリア画面】
break;
case 3://【ゲームオーバー画面】
break;
case 4://
break;
}
//スプライトの終了
pSprite->End();
switch(gamemode)
{
case 0://【タイトル画面】
//========================================
//各フォント
//========================================
//フォント1
RECT rectf; //フォント位置を保持する構造体変数
SetRect ( &rectf,10,100,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ここにタイトル画面が入ります\nタイトル画像やタイトル画面文字も表示!!"),//表示文字列
-1, //表示文字数
&rectf, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//フォント1
RECT rectq; //フォント位置を保持する構造体変数
SetRect ( &rectq,10,180,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔S〕キーでゲームが始まります!"), //表示文字列
-1, //表示文字数
&rectq, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,50,50)); //表示色
/*//フォント1
RECT rectcp; //フォント位置を保持する構造体変数
SetRect ( &rectcp,0,420,640,480); //変数への位置セット
//フォントの描画
pFontg -> DrawText(NULL, //標準機能で描画
_T("Copyright(C)"), //表示文字列
-1, //表示文字数
&rectcp, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,50,50)); //表示色*/
//----------------------
//得点(最高得点)
//---------------
//フォント3
RECT recth; //フォント位置を保持する構造体変数
SetRect ( &recth,400,10,640,480); //変数への位置セット
//フォントの描画
pFontf -> DrawText(NULL, //標準機能で描画
_T("HI-SCORE"), //表示文字列
-1, //表示文字数
&recth, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,255)); //表示色
//変数内容の表示
TCHAR str_hi[255];
_stprintf(str_hi,_T("%08d"),Hi_score);
RECT rect_hi;
SetRect(&rect_hi,420,30,640,480);
pFontc->DrawText(NULL,str_hi,-1,&rect_hi,NULL,D3DCOLOR_ARGB(255,0,255,0));
break;
case 1://【ゲーム画面】
//----------------------
//得点(スコア)
//---------------
//フォント3
RECT rectfc; //フォント位置を保持する構造体変数
SetRect ( &rectfc,370,0,640,480); //変数への位置セット
//フォントの描画
pFontb -> DrawText(NULL, //標準機能で描画
_T("SCORE"), //表示文字列
-1, //表示文字数
&rectfc, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,0,255,255)); //表示色
//変数内容の表示
TCHAR str[255];
_stprintf(str,_T("%08d"),score);
RECT rect_ti;
SetRect(&rect_ti,460,0,640,480);
pFontd->DrawText(NULL,str,-1,&rect_ti,NULL,D3DCOLOR_RGBA(255,255,255,255));
//フォント1
RECT rect; //フォント位置を保持する構造体変数
SetRect ( &rect,0,4,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("LIFE"), //表示文字列
-1, //表示文字数
&rect, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//フォント1
//変数内容の表示
TCHAR str_la[255];
_stprintf(str_la,_T("%d"),Life);
RECT rect_la;
SetRect(&rect_la,80,4,640,480);
pFont->DrawText(NULL,str_la,-1,&rect_la,NULL,D3DCOLOR_ARGB(255,255,0,0));
break;
case 2://【ゲームクリア】
//フォント2
RECT rectb; //フォント位置を保持する構造体変数
SetRect ( &rectb,10,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ゲームクリア画面です!"), //表示文字列
-1, //表示文字数
&rectb, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//フォント
RECT recten; //フォント位置を保持する構造体変数
SetRect ( &recten,10,80,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔Enter←〕でタイトル画面に!"), //表示文字列
-1, //表示文字数
&recten, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
break;
case 3://【ゲームオーバー】
//フォント2
RECT rectc; //フォント位置を保持する構造体変数
SetRect ( &rectc,10,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ゲームオーバー画面です!"), //表示文字列
-1, //表示文字数
&rectc, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//フォント
RECT recten2; //フォント位置を保持する構造体変数
SetRect ( &recten2,10,80,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔Enter←〕でタイトル画面に!"), //表示文字列
-1, //表示文字数
&recten2, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
break;
case 4://
break;
}
V( pd3dDevice->EndScene() );
}
}
//--------------------------------------------------------------------------------------
// Handle messages to the application
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
bool* pbNoFurtherProcessing, void* pUserContext )
{
return 0;
}
//--------------------------------------------------------------------------------------
// Release resources created in the OnResetDevice callback here
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{
}
//--------------------------------------------------------------------------------------
// Release resources created in the OnCreateDevice callback here
//--------------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{
//----------------------------------------------------------
//ロードした後は、解放しましょう♪
//-------------------------------------
//テクスチャの解放
SAFE_RELEASE(pTexture);//自機
SAFE_RELEASE(pText_tama);//自機用の弾
SAFE_RELEASE(pText_teki);//敵
SAFE_RELEASE(pText_teta);//敵用の弾
SAFE_RELEASE(pText_back);//背景
//SAFE_RELEASE(pText_logo_a);//ロゴ001
//SAFE_RELEASE(pText_life);//自機ライフ用
//スプライトの解放
SAFE_RELEASE(pSprite);
// フォントの解放
SAFE_RELEASE( pFont );
SAFE_RELEASE( pFonta );
SAFE_RELEASE( pFontb );
SAFE_RELEASE( pFontc );
SAFE_RELEASE( pFontd );
SAFE_RELEASE( pFonte );
SAFE_RELEASE( pFontf );
SAFE_RELEASE( pFontg );
SAFE_RELEASE( pFonth );
}
//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
// Set the callback functions
DXUTSetCallbackDeviceCreated( OnCreateDevice );
DXUTSetCallbackDeviceReset( OnResetDevice );
DXUTSetCallbackDeviceLost( OnLostDevice );
DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
DXUTSetCallbackMsgProc( MsgProc );
DXUTSetCallbackFrameRender( OnFrameRender );
DXUTSetCallbackFrameMove( OnFrameMove );
// TODO: Perform any application-level initialization here
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application
DXUTInit( true, true, true ); // Parse the command line, handle the default hotkeys, and show msgboxes
DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
DXUTCreateWindow( L"EmptyProject" );
DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480);
//スプライトの作成
D3DXCreateSprite( DXUTGetD3DDevice(), &pSprite);
//--------------------------------------------------------------------------------------
//テクスチャのロード
//------------------------------------------------------------------
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\jiki02.png"),&pTexture );//自機(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\tama01.png"),&pText_tama);//自機用の弾(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\teki001.png"),&pText_teki);//敵(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\tama04.png"),&pText_teta);//敵用の弾(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\back.png"),&pText_back);//背景(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\"),&pText_icon);//宝箱(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\logo001.png"),&pText_logo_a);//ロゴ001(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\heart01.png"),&pText_life);//自機ライフ(画像)
//--------------------------------------------------------------------------------------
//フォントの作成 各パターン
//----------------------------------------------------
////フォントの作成0パターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
22, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("ARP浪漫明朝体U"), //フォント名
&pFont); //作成されたフォントが格納される変数
//フォントの作成(Aパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
30, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("Broadway BT"), //フォント名
&pFonta); //作成されたフォントが格納される変数
//フォントの作成(Bパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
23, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("HGep022"), //フォント名
&pFontb); //作成されたフォントが格納される変数
//フォントの作成(Cパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
30, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("FancyBalloonsAlphabet"), //フォント名
&pFontc); //作成されたフォントが格納される変数
//フォントの作成(Dパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
30, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("BackSeatAlphabetWidth"),//フォント名
&pFontd); //作成されたフォントが格納される変数
//フォントの作成(Eパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
30, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("D3 Cosmism"), //フォント名
&pFonte); //作成されたフォントが格納される変数
//フォントの作成(Fパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
23, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("SHOWA73ARegular"), //フォント名
&pFontf); //作成されたフォントが格納される変数
//フォントの作成(Gパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
20, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("富士ポップP"), //フォント名
&pFontg); //作成されたフォントが格納される変数
//フォントの作成(Hパターン)
D3DXCreateFont(
DXUTGetD3DDevice(), //direct3Dデバイス
23, //フォントサイズ
0, //平均文字幅
FW_NORMAL, //太さ
1, //ミップマップレベル
false, //斜体フラグ
DEFAULT_CHARSET, //文字セット
OUT_DEFAULT_PRECIS, //精度
DEFAULT_QUALITY, //品質
DEFAULT_PITCH, //ピッチ
_T("TAPEMAN"), //フォント名
&pFonth); //作成されたフォントが格納される変数
//次のフォント
//--------------------------------------------------------------------------------------
//1度しか実行しないもの
//--------------------------------------------------
//------------------------------------------------
//自機の構造体に関する処理
//-------------------------------
for(i = 0;i < 1;i++)
{
myship[i].gPos.x = 280;
myship[i].gPos.y = 420;
myship[i].active = 1;
}
//------------------------------------------------
//弾の構造体に関する処理
//-------------------------------
for(i = 0;i < BULLET_MAX;i++)
{
bullets[i].gPos_tm.x = 280;
bullets[i].gPos_tm.y = 430;
bullets[i].active = 0;
bullets[i].type = 0;
}
//------------------------------------------------
//敵の構造体に関する処理
//-------------------------------
for(i = 0;i < ENEMY_MAX;i++)
{
enemy[i].gPos_te.x = -80;
enemy[i].gPos_te.y = 50;
enemy[i].active_te = 0;
enemy[i].type = 0;
enemy_a[i].gPos.x = 690;
enemy_a[i].gPos.y = 90;
enemy_a[i].active = 0;
enemy_a[i].type = 0;
}
enemy[0].active_te = 1;//一番最初の敵のフラグをONにする
enemy_a[0].active = 1;
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(i = 0;i < ENEMY_BLT_MAX;i++)
{
enemy_blt[i].gPos.x = 280;
enemy_blt[i].gPos.y = 430;
enemy_blt[i].active = 0;
enemy_blt[i].type = 0;
}
enemy_blt[0].active = 1;
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(i = 0;i < ENEMY_BLT_MAX;i++)
{
enemy_blt2[i].gPos.x = 280;
enemy_blt2[i].gPos.y = 430;
enemy_blt2[i].active = 0;
enemy_blt2[i].type = 0;
}
enemy_blt2[0].active = 1;
//--------------------------------------------------------------------------------------
//初期化
//-----------------------------
bullets[i].gPos_tm = D3DXVECTOR3(280,430,0);
score = 0;
Hi_score = 12500;
// Start the render loop
DXUTMainLoop();
// TODO: Perform any application-level cleanup here
return DXUTGetExitCode();
}