この広告は30日以上更新がないブログに表示されます。
ログイン |
更新は不定期です。 アイカツのマイキャラパーツやそれ以外にもアニメ、漫画、ゲームの話、好きな物の話など。
とびだせ どうぶつの森
ダンボール戦機WARS、クリアしたのでせっかくだから色々晒しちゃいます。各小隊メンバーとスカウトしたキャラたちの12月5日現在のレベルとか武器とか使用機体とか。せっかくだからツバサ君の必殺ファンクションも載せとく。
ちまちまとアイカツ!もしてます。
とびだせ どうぶつの森、発売から1年。おめでとう!
盛大にネタバレ?してます。
長引く戦いの中、新たな空母がこの激戦地へ配備されることとなった。その空母の名は鸞(らん)。新型空母・鸞の艦長となった君は、死地へと身を投じることとなる。艦載機に指示を出しこの死地を潜り抜け、多くの武勲を挙げよ
WinMain.cpp
//**************************************************************************
// GameProgram シューティングゲーム
//**************************************************************************
#define _CRT_SECURE_NO_DEPRECATE 1
//必要なライブラリファイルのロード
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment (lib, "dxerr9.lib") // DirectXエラー関数・マクロ
#pragma comment (lib, "dxguid.lib")
//必要なヘッダーファイルのインクルード
#define STRICT
#include <windows.h>
#include <d3dx9.h>
#include <time.h>
#include "GPLib.h"
#include "MyLib.h"
#include "Title.h"
#include "Shot.h"
#include "Gyorai.h"
#include "Missile.h"
#include "Enemy.h"
#include "Boss.h"
#include "Chara.h"
#include "Shiden.h"
#include "Score.h"
#include "ChkKey.h"
#include "ChkBlast.h"
#include "Draw.h"
#include "GameEnd.h"
#include "GameClear.h"
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
//円周率
#define PI 3.1415926535f
//シンボル定義及びマクロ
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 640
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
//自機情報
#define CHARA_WIDTH 32
#define CHARA_HEIGHT 32
//敵情報
#define ENEMY_WIDTH 32
#define ENEMY_HEIGHT 32
#define ENEMY2_WIDTH 56
#define ENEMY2_HEIGHT 27 //描画は40
#define ENEMY_MAX 10
#define ENEMY_SPEED 3.5f
#define ENEMYSHOT_MAX 30
//爆風
#define BLAST_WIDTH 32
#define BLAST_HEIGHT 32
#define BLAST_MAX 16 //アニメーションパターン数
//自機の弾情報
#define SHOT_MAX 10 //最大発射数
#define SHOT_WIDTH 8
#define SHOT_HEIGHT 8
#define SHOT_SPEED 5.0f
//アイテム情報
#define ONEUP_WIDTH 24
#define ONEUP_HEIGHT 24
#define ITEM_MAX 10
#define POWERUP_WIDTH 16
#define POWERUP_HEIGHT 16
//テクスチャ内のY座標
#define CHARA_TEX_V 0
#define ENEMY_TEX_V CHARA_HEIGHT
#define BLAST_TEX_V (ENEMY_TEX_V + ENEMY_HEIGHT)
#define SHOT_TEX_V (BLAST_TEX_V + BLAST_HEIGHT)
//最大テクスチャ枚数
#define MAX_TEX 6
//ゲーム進行用フラグ
#define _INIT_ 0
#define _TITLE_ 1
#define _MAIN_ 2
#define _GAMEEND_ 3
#define _GAMECLEAR_ 4
//関数プロトタイプの宣言
VOID Draw(); //ゲーム中の描画
VOID GameEnd(); //クリアー画面描画
VOID Initialize(LPDIRECT3DDEVICE9,LPDIRECT3DTEXTURE9*);
VOID FreeDx(LPDIRECT3DDEVICE9,LPDIRECT3DTEXTURE9*,LPDIRECT3D9);
VOID Format();
//グローバルなインスタンスを宣言
LPDIRECT3D9 lpD3d = NULL;
LPDIRECT3DDEVICE9 lpDev = NULL;
LPDIRECT3DTEXTURE9 lpTex[MAX_TEX];
HWND hWndApp;
LPD3DXFONT lpFont = NULL;
//ゲーム情報
CFLAG cFlag;
//自機データ
SDATA sChara;
//自機の弾データ
SSHOT sShot[SHOT_KIND][SHOT_MAX];
SGYORAI sGyorai[GYORAI_MAX];
SMISSILE sMissile[MISSILE_MAX];
SSHIDEN sShiden[SHIDEN_MAX];
//敵機データ
SENEMY sEnemy[ENEMY_KIND][ENEMY_MAX];
//敵機の弾データ
SENEMYSHOT sEnemyShot[ENEMYSHOT_MAX];
//アイテムデータ
SITEM sItem[ENEMY_MAX];
//キーボード情報
BYTE bSaveKey[256];
//スコアカウント
INT score;
//自機のライフ
INT CharaLife;
//自機のパワー
INT CharaPower;
//無敵時間
INT Invincible;
INT InvincibleAnim;
//無敵時間判定用
DWORD dwLastInvTime,dwInvTime;
INT dwItime;
//スクロール
INT ScrollX;
INT ScrollY;
//アイテム
INT ItemDrop;
//ボス用
SENEMY sBoss;
INT Boss;
INT Turn_RIGHT;
INT Turn_LEFT;
INT BossDead;
//ゲームクリア・ゲームオーバーの文字表示時間
INT dwCTime;
DWORD dwLastClearTime,dwClearTime;
INT dwETime;
DWORD dwLastEndTime,dwEndTime;
//--------------------------------------------
// Name:Initialize()
// Desc:その他の初期化
//--------------------------------------------
VOID Initialize(LPDIRECT3DDEVICE9 lpDev,LPDIRECT3DTEXTURE9* lpTex)
{
//乱数初期化
srand(time(NULL));
//キーボード情報
BYTE bSaveKey[256];
//テクスチャオブジェクトの初期化
ZeroMemory(lpTex,sizeof(LPDIRECT3DTEXTURE9)*MAX_TEX);
// デバイス情報からWindowハンドルを取得
D3DDEVICE_CREATION_PARAMETERS dParam;
lpDev->GetCreationParameters( &dParam );
// テクスチャの生成
CreateTextureEx(lpDev, "Image/stg_parts.png", &lpTex[0], 512, 512, 0xff808080);
CreateTextureEx(lpDev, "Image/back.png", &lpTex[1], GAME_WIDTH, GAME_HEIGHT, 0xff808080);
CreateTextureEx(lpDev, "Image/Font.png", &lpTex[2], 640, 480, 0xff808080);
CreateTextureEx(lpDev, "Image/Title.png", &lpTex[3], WINDOW_WIDTH, WINDOW_HEIGHT, 0xff808080);
CreateTextureEx(lpDev, "Image/GameEnd.png", &lpTex[4], WINDOW_WIDTH, WINDOW_HEIGHT, 0xff808080);
CreateTextureEx(lpDev, "Image/GameClear.png", &lpTex[5], WINDOW_WIDTH, WINDOW_HEIGHT, 0xff808080);
//キーボード情報の初期化
ZeroMemory(bSaveKey, sizeof(BYTE)*256);
//ゲームフラグの初期化
cFlag.iGameFlag=_INIT_;
//自機の初期化
sChara.sPos.fX = GAME_WIDTH/2 - CHARA_WIDTH/2;
sChara.sPos.fY = GAME_HEIGHT - CHARA_HEIGHT;
sChara.fSpe = 4.0;
sChara.iAnim = 0;
//自機の弾の初期化
for( int i = 0; i < SHOT_MAX; i++ )
for(int j = 0; j < SHOT_KIND; j++)
sShot[j][i].iUsed = FALSE;
for( int i = 0; i < GYORAI_MAX; i++ )
sGyorai[i].iUsed = FALSE;
for( int i = 0; i < MISSILE_MAX; i++ )
sMissile[i].iUsed = FALSE;
//敵機の初期化
for( int i = 0; i < ENEMY_MAX; i++)
for(int j = 0; j < ENEMY_KIND; j++)
{
sEnemy[j][i].iUsed = FALSE;
sEnemy[j][i].iUsedShot = FALSE;
sEnemy[j][i].eLifeAnim = 0;
sEnemy[j][i].iHit = FALSE;
sEnemy[j][i].eLife = 10;
}
//敵機の弾の初期化
for( int i = 0; i < ENEMYSHOT_MAX; i++ )
{
sEnemyShot[i].iUsed = FALSE;
sEnemyShot[i].fSpe = 5;
}
//アイテムの初期化
for( int i = 0; i < ENEMY_MAX; i++)
{
sItem[i].iUsed = FALSE;
sItem[i].Oneup = FALSE;
sItem[i].Power = FALSE;
}
//スコアの初期化
score = 0;
//自機初期化
CharaLife = 3;
CharaPower = 0;
//無敵時間の初期化
Invincible = FALSE;
InvincibleAnim = 0;
//スクロールの初期化
ScrollX = 0;
ScrollY = 0;
//ボスの初期化
sBoss.fSpe = 0.5f;
sBoss.iUsed = FALSE;
sBoss.iBlast = FALSE;
sBoss.iBstPtn = 0;
sBoss.iHit = FALSE;
Boss = FALSE;
BossDead = FALSE;
Turn_RIGHT = TRUE;
Turn_LEFT = FALSE;
}
//--------------------------------------------
// Name:Format()
// Desc:クリア・ゲームオーバーからの初期化
//--------------------------------------------
VOID Format()
{
//キーボード情報
BYTE bSaveKey[256];
//キーボード情報の初期化
ZeroMemory(bSaveKey, sizeof(BYTE)*256);
//自機の初期化
sChara.sPos.fX = GAME_WIDTH/2 - CHARA_WIDTH/2;
sChara.sPos.fY = GAME_HEIGHT - CHARA_HEIGHT;
sChara.fSpe = 4.0;
sChara.iAnim = 0;
//自機の弾の初期化
for( int i = 0; i < SHOT_MAX; i++ )
for(int j = 0; j < SHOT_KIND; j++)
sShot[j][i].iUsed = FALSE;
for( int i = 0; i < GYORAI_MAX; i++ )
sGyorai[i].iUsed = FALSE;
for( int i = 0; i < MISSILE_MAX; i++ )
sMissile[i].iUsed = FALSE;
//敵機の初期化
for( int i = 0; i < ENEMY_MAX; i++)
for(int j = 0; j < ENEMY_KIND; j++)
{
sEnemy[j][i].iUsed = FALSE;
sEnemy[j][i].iUsedShot = FALSE;
sEnemy[j][i].eLifeAnim = 0;
sEnemy[j][i].iHit = FALSE;
sEnemy[j][i].eLife = 10;
}
//敵機の弾の初期化
for( int i = 0; i < ENEMYSHOT_MAX; i++ )
{
sEnemyShot[i].iUsed = FALSE;
sEnemyShot[i].fSpe = 5.5;
}
//アイテムの初期化
for( int i = 0; i < ENEMY_MAX; i++)
{
sItem[i].iUsed = FALSE;
sItem[i].Oneup = FALSE;
sItem[i].Power = FALSE;
}
//スコアの初期化
score = 0;
//自機初期化
CharaLife = 3;
CharaPower = 0;
//無敵時間の初期化
Invincible = FALSE;
InvincibleAnim = 0;
//スクロールの初期化
ScrollX = 0;
ScrollY = 0;
//ボスの初期化
sBoss.fSpe = 0.5f;
sBoss.iUsed = FALSE;
sBoss.iBlast = FALSE;
sBoss.iBstPtn = 0;
sBoss.iHit = FALSE;
Boss = FALSE;
BossDead = FALSE;
Turn_RIGHT = TRUE;
Turn_LEFT = FALSE;
}
//--------------------------------------------
// Name:FreeDx()
// Desc:作成したDirectXオブジェクトの開放
//--------------------------------------------
VOID FreeDx(LPDIRECT3DDEVICE9 lpDev,LPDIRECT3DTEXTURE9* lpTex,LPDIRECT3D9 lpD3d)
{
for(INT i=0 ; i<MAX_TEX ; i++)
SAFE_RELEASE( lpTex[i] );
SAFE_RELEASE( lpDev );
SAFE_RELEASE( lpD3d );
}
//--------------------------------------------
// Name:WinMain()
// Desc:アプリケーションのエントリー関数
//--------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)
{
static char szAppName[] = "ぐんぃてーゅし";
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(lpDev,lpTex);
// ウインドウハンドルをグローバル変数に格納
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(cFlag.iGameFlag)
{
case _INIT_:
Initialize(lpDev,lpTex);
cFlag.iGameFlag = _TITLE_;
break;
case _TITLE_:
Title();
break;
case _MAIN_:
Draw();
break;
case _GAMEEND_:
GameEnd();
break;
case _GAMECLEAR_:
GameClear();
break;
}
}
}
// 開放
FreeDx(lpDev,lpTex,lpD3d);
// COM・オブジェクト開放 ----------
CoUninitialize();
// ウインドウ・クラスの登録解除 ----------
UnregisterClass(szAppName, hInst);
// マルチメディアタイマーの精度向上を解除 ------
timeEndPeriod( 1 );
return (INT)msg.wParam ;
}
Shot.h
#ifndef _SHOT_H_
#define _SHOT_H_
#define SHOT_MAX 10 //最大発射数
#define ENEMY_MAX 10
#define SHOT_KIND 5
//自機の弾データ
typedef struct {
S2DVECTOR sPos; //位置
FLOAT fSpe; //スピード
INT iUsed; //発射されているかどうか
} SSHOT;
//自機の弾データ
extern SSHOT sShot[SHOT_KIND][SHOT_MAX];
extern INT CharaPower;
VOID Shot(); //自機の弾発射
VOID MoveShot(); //自機の弾の移動処理
VOID DrawShot(); //自機の弾の描画
#endif //_SHOT_H_
Title.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Title.h"
//#include "CDxAudio.h"
#define _MAIN_ 2
//シンボル定義及びマクロ
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 640
//テクスチャ数
#define MAX_TEX 6
//グローバルなインスタンスを宣言
extern LPDIRECT3D9 lpD3d;
extern LPDIRECT3DDEVICE9 lpDev;
extern LPDIRECT3DTEXTURE9 lpTex[MAX_TEX];
extern HWND hWndApp;
//--------------------------------------------
// Name:Title()
// Desc:タイトル描画
//--------------------------------------------
VOID Title()
{
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,lpTex[3],
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))
{
//モードセレクトへ
cFlag.iGameFlag = _MAIN_;
}
// キーボードのコピー
memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
}
Title.h
#ifndef _TITLE_H_
#define _TITLE_H_
typedef struct {
INT iGameFlag;
} CFLAG;
extern CFLAG cFlag;
extern BYTE bSaveKey[256];
VOID Title(); //タイトル描画
#endif // _TITLE_H_
Shiden.h
#ifndef _SHIDEN_H_
#define _SHIDEN_H_
#define SHIDEN_MAX 2 //最大発射数
#define ENEMY_MAX 10
//自機の弾データ
typedef struct {
S2DVECTOR sPos; //位置
FLOAT fSpe; //スピード
INT iUsed; //発射されているかどうか
} SSHIDEN;
//自機の弾データ
extern SSHIDEN sShiden[SHIDEN_MAX];
VOID Shiden(); //紫電の発艦
VOID MoveShiden(); //紫電の移動処理
VOID DrawShiden(); //自機の弾の描画
#endif //_SHIDEN_H_
Shot.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Shot.h"
#include "Enemy.h"
#include "Chara.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
//自機情報
#define CHARA_WIDTH 32
#define CHARA_HEIGHT 32
//自機の弾情報
#define SHOT_MAX 10 //最大発射数
#define SHOT_WIDTH 8
#define SHOT_HEIGHT 8
#define SHOT_SPEED 5.0f
//ショットレベルが上がるパワー
#define ShotPower_2 2
#define ENEMY_MAX 10
//--------------------------------------------
// Name:Shot()
// Desc:自機の弾発射
//--------------------------------------------
VOID Shot()
{
int i;
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if(sChara.iBlast == FALSE ) //自機爆発中は発射できない
{
if( dwTime - dwLastTime > 100 )
{
dwLastTime = dwTime;
for( i = 0; i < SHOT_MAX; i++ )
{
//ショットレベル2(2列)
if( sShot[0][i].iUsed == FALSE && sShot[1][i].iUsed == FALSE && CharaPower <= ShotPower_2)
{
//使用中にする
sShot[0][i].iUsed = TRUE;
sShot[1][i].iUsed = TRUE;
//位置を自機の頭に合せる
sShot[0][i].sPos.fX = sChara.sPos.fX + CHARA_WIDTH / 2 - SHOT_WIDTH - SHOT_WIDTH/2;
sShot[0][i].sPos.fY = sChara.sPos.fY - SHOT_HEIGHT;
sShot[0][i].fSpe = SHOT_SPEED;
sShot[1][i].sPos.fX = sChara.sPos.fX + CHARA_WIDTH / 2 - SHOT_WIDTH - SHOT_WIDTH/2;
sShot[1][i].sPos.fY = sChara.sPos.fY - SHOT_HEIGHT;
sShot[1][i].fSpe = SHOT_SPEED;
break;
}
}
}
}
}
//--------------------------------------------
// Name:MoveShot()
// Desc:自機の弾を移動
//--------------------------------------------
VOID MoveShot()
{
int i,j;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = -1; //弾の進む方向を設定
if(CharaPower <= ShotPower_2)
{
for(j = 0; j < 2; j++)
{
for( i = 0; i < SHOT_MAX; i++ )
{
if( sShot[j][i].iUsed == TRUE )
{
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sShot[j][i].fSpe ); //スピードを設定
sShot[j][i].sPos = My2DVecAdd(sShot[j][i].sPos, vDir);
}
}
}
}
if(CharaPower >= ShotPower_2)
{
for(j = 0; j < 3; j++)
{
for( i = 0; i < SHOT_MAX; i++ )
{
if( sShot[j][i].iUsed == TRUE )
{
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sShot[j][i].fSpe ); //スピードを設定
if(j == 0)
vDir.fX = -0.5;
if(j == 1)
vDir.fX = 0;
if(j == 2)
vDir.fX = 0.5;
sShot[j][i].sPos = My2DVecAdd(sShot[j][i].sPos, vDir);
}
}
}
}
//画面外に出たかチェック
for(j = 0; j < SHOT_KIND; j++)
for(i = 0; i < SHOT_MAX; i++)
if( sShot[j][i].sPos.fY < 0 || sShot[j][i].sPos.fX < 0 || sShot[j][i].sPos.fX > GAME_WIDTH )
sShot[j][i].iUsed = FALSE; //画面外なので使用済みにする
}
Score.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Score.h"
// スコアの表示関連
#define SCORE_PX 16
#define SCORE_PY 3
#define SCORE_W 20
#define SCORE_H 31
Score.h
#ifndef _SCORE_H_
#define _SCORE_H
extern INT score;
VOID Score();
#endif // _SCORE_H_
Shiden.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Shiden.h"
#include "Enemy.h"
#include "Chara.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
//自機情報
#define CHARA_WIDTH 32
#define CHARA_HEIGHT 32
//自機の弾情報
#define SHIDEN_MAX 2 //最大発射数
#define SHIDEN_WIDTH 32
#define SHIDEN_HEIGHT 32
#define SHIDEN_SPEED 5.0f
//--------------------------------------------
// Name:Shiden()
// Desc:自機の弾発射
//--------------------------------------------
VOID Shiden()
{
int i;
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 100 ) {
dwLastTime = dwTime;
for( i = 0; i < SHIDEN_MAX; i++ ) {
if( sShiden[i].iUsed == FALSE ) {
sShiden[i].iUsed = TRUE; //使用中にする
sShiden[i].sPos.fX = sChara.sPos.fX + CHARA_WIDTH / 2 - SHIDEN_WIDTH / 2;//位置を自機の頭に合せる
sShiden[i].sPos.fY = sChara.sPos.fY - SHIDEN_HEIGHT;
sShiden[i].fSpe = SHIDEN_SPEED;
break;
}
}
}
}
//--------------------------------------------
// Name:MoveShiden()
// Desc:自機の弾を移動
//--------------------------------------------
VOID MoveShiden()
{
int i;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = -1; //弾の進む方向を設定
for( i = 0; i < SHIDEN_MAX; i++ ) {
if( sShiden[i].iUsed == TRUE ) {
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sShiden[i].fSpe ); //スピードを設定
sShiden[i].sPos = My2DVecAdd(sShiden[i].sPos, vDir);
}
}
//画面外に出たかチェック
for(i = 0; i < SHIDEN_MAX; i++){
if( sShiden[i].sPos.fY < 0 )
sShiden[i].iUsed = FALSE; //画面外なので使用済みにする
}
}
Missile.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Missile.h"
#include "Enemy.h"
#include "Chara.h"
#include "Shot.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
//自機情報
#define CHARA_WIDTH 32
#define CHARA_HEIGHT 32
//自機の弾情報
#define MISSILE_MAX 2 //最大発射数
#define MISSILE_WIDTH 9
#define MISSILE_HEIGHT 36
#define MISSILE_SPEED 5.0f
#define ENEMY_MAX 10
//--------------------------------------------
// Name:Missile()
// Desc:ミサイル発射
//--------------------------------------------
VOID Missile()
{
int i;
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 100 ) {
dwLastTime = dwTime;
for( i = 0; i < MISSILE_MAX; i++ ) {
if( sMissile[i].iUsed == FALSE ) {
sMissile[i].iUsed = TRUE; //使用中にする
sMissile[i].sPos.fX = sChara.sPos.fX + CHARA_WIDTH / 2 - MISSILE_WIDTH / 2;//位置を自機の頭に合せる
sMissile[i].sPos.fY = sChara.sPos.fY - MISSILE_HEIGHT;
sMissile[i].fSpe = MISSILE_SPEED;
break;
}
}
}
}
//--------------------------------------------
// Name:MoveMissile()
// Desc:ミサイルを移動
//--------------------------------------------
VOID MoveMissile()
{
int i;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = -1; //弾の進む方向を設定
for( i = 0; i < MISSILE_MAX; i++ ) {
if( sMissile[i].iUsed == TRUE ) {
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sMissile[i].fSpe ); //スピードを設定
sMissile[i].sPos = My2DVecAdd(sMissile[i].sPos, vDir);
}
}
//画面外に出たかチェック
for(i = 0; i < MISSILE_MAX; i++){
if( sMissile[i].sPos.fY < 0 || sMissile[i].sPos.fX < 0 || sMissile[i].sPos.fX > GAME_WIDTH )
sMissile[i].iUsed = FALSE; //画面外なので使用済みにする
}
}
Missile.h
#ifndef _MISSILE_H_
#define _MISSILE_H_
#define MISSILE_MAX 2 //最大発射数
#define ENEMY_MAX 10
#define MISSILE_KIND 5
//自機の弾データ
typedef struct {
S2DVECTOR sPos; //位置
FLOAT fSpe; //スピード
INT iUsed; //発射されているかどうか
} SMISSILE;
//自機の弾データ
extern SMISSILE sMissile[MISSILE_MAX];
VOID Missile(); //自機の弾発射
VOID MoveMissile(); //自機の弾の移動処理
VOID DrawMissile(); //自機の弾の描画
#endif //_MISSILE_H_
Gyorai.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Gyorai.h"
#include "Enemy.h"
#include "Chara.h"
#include "Shot.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
//自機情報
#define CHARA_WIDTH 32
#define CHARA_HEIGHT 32
//自機の弾情報
#define GYORAI_MAX 2 //最大発射数
#define GYORAI_WIDTH 9
#define GYORAI_HEIGHT 36
#define GYORAI_SPEED 5.0f
#define ENEMY_MAX 10
//--------------------------------------------
// Name:Gyorai()
// Desc:魚雷発射
//--------------------------------------------
VOID Gyorai()
{
int i;
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 100 ) {
dwLastTime = dwTime;
for( i = 0; i < GYORAI_MAX; i++ ) {
if( sGyorai[i].iUsed == FALSE ) {
sGyorai[i].iUsed = TRUE; //使用中にする
sGyorai[i].sPos.fX = sChara.sPos.fX + CHARA_WIDTH / 2 - GYORAI_WIDTH / 2;//位置を自機の頭に合せる
sGyorai[i].sPos.fY = sChara.sPos.fY - GYORAI_HEIGHT;
sGyorai[i].fSpe = GYORAI_SPEED;
break;
}
}
}
}
//--------------------------------------------
// Name:MoveGyorai()
// Desc:魚雷を移動
//--------------------------------------------
VOID MoveGyorai()
{
int i;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = -1; //弾の進む方向を設定
for( i = 0; i < GYORAI_MAX; i++ ) {
if( sGyorai[i].iUsed == TRUE ) {
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sGyorai[i].fSpe ); //スピードを設定
sGyorai[i].sPos = My2DVecAdd(sGyorai[i].sPos, vDir);
}
}
//画面外に出たかチェック
for(i = 0; i < GYORAI_MAX; i++){
if( sGyorai[i].sPos.fY < 0 )
sGyorai[i].iUsed = FALSE; //画面外なので使用済みにする
}
}
Gyorai.h
#ifndef _GYORAI_H_
#define _GYORAI_H_
#define GYORAI_MAX 2 //最大発射数
#define ENEMY_MAX 10
#define GYORAI_KIND 5
//自機の弾データ
typedef struct {
S2DVECTOR sPos; //位置
FLOAT fSpe; //スピード
INT iUsed; //発射されているかどうか
} SGYORAI;
//自機の弾データ
extern SGYORAI sGyorai[GYORAI_MAX];
VOID Gyorai(); //自機の弾発射
VOID MoveGyorai(); //自機の弾の移動処理
VOID DrawGyorai(); //自機の弾の描画
#endif //_GYORAI_H_
GameClear.h
#ifndef _GAMECLEAR_H_
#define _GAMECLEAR_H_
extern BYTE bSaveKey[256];
extern VOID Format();
VOID GameClear();
#endif // _GAMECLEAR_H_
GameEnd.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "GameEnd.h"
#include "Title.h"
#define _TITLE_ 1
//シンボル定義及びマクロ
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 640
//テクスチャ数
#define MAX_TEX 6
//グローバルなインスタンスを宣言
extern LPDIRECT3D9 lpD3d;
extern LPDIRECT3DDEVICE9 lpDev;
extern LPDIRECT3DTEXTURE9 lpTex[MAX_TEX];
extern HWND hWndApp;
//--------------------------------------------
// Name:GameEnd()
// Desc:ゲームオーバー画面の描画
//--------------------------------------------
VOID GameEnd()
{
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,lpTex[4],
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))
{
Format(); //初期化
cFlag.iGameFlag = _TITLE_; //タイトル画面ヘ
}
// キーボードのコピー
memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
}
GameEnd.h
#ifndef _GAMEEND_H_
#define _GAMEEND_H_
extern BYTE bSaveKey[256];
extern VOID Format();
VOID GameEnd(); //ゲームオーバー画面描画
#endif // _GAMEEND_H_
Enemy.h
#ifndef _ENEMY_H_
#define _ENEMY_H_
#define ENEMY_MAX 10
#define ENEMY_KIND 10
#define ENEMYSHOT_MAX 30
//敵機データ
typedef struct {
S2DVECTOR sPos; //位置
FLOAT fSpe; //スピード
INT iUsed; //生成されているかどうか
INT iUsedShot; //弾を発射しているか
INT eLife; //敵機のライフ
INT eLifeAnim; //ライフ減少時のアニメーション描画
INT iHit; //ヒット時のアニメーション切り替え
INT iCnt; //アニメーション用カウンタ
INT iAnim; //アニメーションパターン
INT iBlast; //TRUE:爆発
INT iBstPtn; //爆発パターン
} SENEMY;
//敵機の弾データ
typedef struct {
S2DVECTOR sPos; //位置
FLOAT fSpe; //スピード
INT iUsed; //発射されているかどうか
} SENEMYSHOT;
//敵機情報
extern SENEMY sEnemy[ENEMY_KIND][ENEMY_MAX]; //[種類][数]
//敵弾情報
extern SENEMYSHOT sEnemyShot[ENEMYSHOT_MAX];
VOID CreateEnemy(); //敵機の生成
VOID MoveEnemy(); //敵機の移動処理
VOID ShotEnemy(); //敵機の弾発射
VOID DrawEnemy(); //敵機の描画
VOID DrawEnemyShot(); //敵機の弾の描画
VOID MoveEnemyShot(); //敵機の弾移動
#endif // _ENEMY_H_
GameClear.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "GameClear.h"
#include "Title.h"
#define _TITLE_ 1
//シンボル定義及びマクロ
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 640
//テクスチャ数
#define MAX_TEX 6
//グローバルなインスタンスを宣言
extern LPDIRECT3D9 lpD3d;
extern LPDIRECT3DDEVICE9 lpDev;
extern LPDIRECT3DTEXTURE9 lpTex[MAX_TEX];
extern HWND hWndApp;
//--------------------------------------------
// Name:GameClear()
// Desc:クリア画面の描画
//--------------------------------------------
VOID GameClear()
{
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,lpTex[5],
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))
{
Format(); //初期化
cFlag.iGameFlag = _TITLE_; //タイトル画面ヘ
}
// キーボードのコピー
memcpy( bSaveKey, bKey, sizeof(BYTE)*256 );
}
Enemy.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Enemy.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
#define SHOT_WIDTH 8
#define SHOT_HEIGHT 8
//敵情報
#define ENEMY_WIDTH 32
#define ENEMY_HEIGHT 32
#define ENEMY2_WIDTH 32
#define ENEMY2_HEIGHT 32
#define ENEMY_MAX 10
#define ENEMY_KIND 10
#define ENEMY_SPEED 3.5f
#define ENEMY2_SPEED 2.5f
#define ENEMYSHOT_MAX 30
#define ENEMYSHOT_SPEED 5.5
//--------------------------------------------
// Name:CreateEnemy()
// Desc:敵を生成する
//--------------------------------------------
VOID CreateEnemy()
{
int i,j;
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 1000 ) //1秒ごとに生成する
{
dwLastTime = dwTime;
j = rand()%2;
//敵機1
if(j == 0)
{
for( i = 0; i < ENEMY_MAX; i++ )
{
if( sEnemy[j][i].iUsed == FALSE )
{
sEnemy[j][i].iUsed = TRUE; //使用中にする
//位置をランダムで決める
sEnemy[j][i].sPos.fX = rand() % (GAME_WIDTH - ENEMY_WIDTH);
sEnemy[j][i].sPos.fY = 0;
sEnemy[j][i].fSpe = ENEMY_SPEED;
//アニメーションのための初期化
sEnemy[j][i].iCnt = 0;
sEnemy[j][i].iAnim = 0;
//爆発情報のクリア
sEnemy[j][i].iBlast = FALSE;
break;
}
}
}
//敵機2
if(j == 1)
{
for( i = 0; i < ENEMY_MAX; i++ )
{
if( sEnemy[j][i].iUsed == FALSE )
{
sEnemy[j][i].iUsed = TRUE; //使用中にする
//位置をランダムで決める
sEnemy[j][i].sPos.fX = rand() % (GAME_WIDTH - ENEMY2_WIDTH);
sEnemy[j][i].sPos.fY = 0;
sEnemy[j][i].fSpe = ENEMY2_SPEED;
//アニメーションのための初期化
sEnemy[j][i].iCnt = 0;
sEnemy[j][i].iAnim = 0;
//爆発情報のクリア
sEnemy[j][i].iBlast = FALSE;
//ライフの設定
sEnemy[j][i].eLife = 10;
break;
}
}
}
}
}
//--------------------------------------------
// Name:MoveEnemy()
// Desc:敵機を移動
//--------------------------------------------
VOID MoveEnemy()
{
int i,j;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = 1; //敵機の進む方向を設定
for( i = 0; i < ENEMY_MAX; i++ )
{
for(j = 0; j < ENEMY_KIND; j++)
{
if( sEnemy[j][i].iUsed == TRUE && sEnemy[j][i].iBlast == FALSE)
{
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sEnemy[j][i].fSpe ); //スピードを設定
sEnemy[j][i].sPos = My2DVecAdd(sEnemy[j][i].sPos, vDir); //座標を決定
sEnemy[j][i].iCnt++; //アニメーションカウンタを上げる
//画面外に出たかチェック
if( sEnemy[j][i].sPos.fY > GAME_HEIGHT )
sEnemy[j][i].iUsed = FALSE; //画面外なので使用済みにする
}
}
}
}
//--------------------------------------------
// Name:ShotEnemy()
// Desc:敵機の弾を生成
//--------------------------------------------
VOID ShotEnemy()
{
int i,j,k,m;
for(i = 0; i < ENEMYSHOT_MAX; i++)
{
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 1000 )
{
dwLastTime = dwTime;
//生成されている敵機を調べる
for(i = 0; i < ENEMY_MAX; i++)
{
for(j = 0; j < ENEMY_KIND; j++)
{
if(sEnemy[j][i].iUsed == TRUE)
{
//使用していない弾を探す
for(k = 0; k < ENEMYSHOT_MAX; k++)
{
if(sEnemyShot[k].iUsed == FALSE)
{
//弾を使用中にする
sEnemyShot[k].iUsed = TRUE;
//位置を敵機の頭に合せる
//敵機1
if(j == 0)
{
sEnemyShot[k].sPos.fX = sEnemy[j][i].sPos.fX + ENEMY_WIDTH / 2 - SHOT_WIDTH / 2;
sEnemyShot[k].sPos.fY = sEnemy[j][i].sPos.fY + ENEMY_HEIGHT;
sEnemyShot[k].fSpe = ENEMYSHOT_SPEED;
}
//敵機2
if(j == 1)
{
for(m = 0; m < ENEMYSHOT_MAX; m++)
{
//未使用の弾を2つ見つけたら発射
if(sEnemyShot[m].iUsed == FALSE)
{
sEnemyShot[m].iUsed = TRUE;
sEnemyShot[m].sPos.fX = sEnemy[j][i].sPos.fX + ENEMY2_WIDTH / 2 + SHOT_WIDTH *2;
sEnemyShot[m].sPos.fY = sEnemy[j][i].sPos.fY + ENEMY2_HEIGHT;
sEnemyShot[m].fSpe = ENEMYSHOT_SPEED;
sEnemyShot[k].sPos.fX = sEnemy[j][i].sPos.fX + ENEMY2_WIDTH / 2 - SHOT_WIDTH *2;
sEnemyShot[k].sPos.fY = sEnemy[j][i].sPos.fY + ENEMY2_HEIGHT;
sEnemyShot[k].fSpe = ENEMYSHOT_SPEED;
break;
}
}
}
break;
}
}
}
}
}
}
}
}
//--------------------------------------------
// Name:MoveShot()
// Desc:敵機の弾を移動
//--------------------------------------------
VOID MoveEnemyShot()
{
int i;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = 1; //弾の進む方向を設定
for( i = 0; i < ENEMYSHOT_MAX; i++ )
{
if( sEnemyShot[i].iUsed == TRUE )
{
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sEnemyShot[i].fSpe ); //スピードを設定
sEnemyShot[i].sPos = My2DVecAdd(sEnemyShot[i].sPos, vDir);
//画面外に出たかチェック
// (画面下部しかチェックしていないので注意!!)
if( sEnemyShot[i].sPos.fY > GAME_HEIGHT )
sEnemyShot[i].iUsed = FALSE; //画面外なので使用済みにする
}
}
}
//--------------------------------------------
// Name:BossLife()
// Desc:ボスのライフの描画
//--------------------------------------------
VOID BossLife()
{
//外枠
if(sBoss.iUsed == TRUE)
{
DrawSprite( lpDev, lpTex[2],
0,0,
BOSSLIFE_WIDTH, BOSSLIFE_HEIGHT,
BOSSLIFE_WIDTH/2, BOSSLIFE_HEIGHT/2,
1, 1,
0, BOSSLIFE_TEX_V,
0, 0xFFFFFFFF);
//ライフ
for(int i = 0; i < sBoss.eLife; i++)
{
DrawSprite( lpDev, lpTex[2],
BOSSLIFE2_TEX_X + (BOSSLIFE_WIDTH2 / 100 * i),4,
BOSSLIFE_WIDTH2 / 100, BOSSLIFE_HEIGHT,
BOSSLIFE_WIDTH2 / 100 /2, BOSSLIFE_HEIGHT/2,
1, 1,
BOSSLIFE2_TEX_X, BOSSLIFE2_TEX_Y,
0, 0xFFFFFFFF);
}
}
}
//--------------------------------------------
// Name:DrawItem()
// Desc:アイテム描画
//--------------------------------------------
VOID DrawItem()
{
FLOAT hami = 0;
//出現済みのアイテムを探す
for( int i = 0; i < ENEMY_MAX; i++ )
{
//1UP描画
if( sItem[i].Oneup == TRUE )
{
//はみ出し感知
if(sItem[i].sPos.fX + ONEUP_WIDTH > GAME_WIDTH)
hami = sItem[i].sPos.fX+ONEUP_WIDTH - GAME_WIDTH;
DrawSprite(
lpDev,lpTex[0],
sItem[i].sPos.fX, sItem[i].sPos.fY,
ONEUP_WIDTH - hami, ONEUP_HEIGHT,
(ONEUP_WIDTH - hami)/2, ONEUP_HEIGHT/2,
1, 1,
0, ONEUP_TEX_V,
0, 0xffffffff);
}
//パワーアップ描画
if( sItem[i].Power == TRUE )
{
//はみ出し感知
if(sItem[i].sPos.fX + POWERUP_WIDTH > GAME_WIDTH)
hami = sItem[i].sPos.fX+POWERUP_WIDTH - GAME_WIDTH;
DrawSprite(
lpDev,lpTex[0],
sItem[i].sPos.fX, sItem[i].sPos.fY,
POWERUP_WIDTH - hami, POWERUP_HEIGHT,
(POWERUP_WIDTH - hami)/2, POWERUP_HEIGHT/2,
1, 1,
0, POWERUP_TEX_V,
0, 0xffffffff);
}
//アイテムを下に移動
sItem[i].sPos.fY++;
}
}
//--------------------------------------------
// Name:Score()
// Desc:スコアの表示
//--------------------------------------------
VOID Score()
{
int i;
int a[3] = {0,0,0}; //各桁の数字を記憶
int keta = 1; //桁数を記憶
//スコアが1桁のとき
a[0] = score;
//スコアが2桁のとき
if(score > 9 && score < 100)
{
a[0] = score % 10; //1桁目記憶
a[1] = score / 10; //2桁目記憶
keta = 2; //桁数記憶
}
//スコアが3桁のとき
if(score >99 && score < 1000)
{
a[0] = score % 10; //1桁目記憶
a[1] = score % 100 / 10;//2桁目記憶
a[2] = score / 100; //3桁目記憶
keta = 3; //桁数記憶
}
//999でカンスト
if(score >= 999){
a[0] = 9;
a[1] = 9;
a[2] = 9;
keta = 3;
}
//スコア表示領域の確保
for(i = 0; i < NOMBER_W; i++)
DrawSprite(
lpDev,NULL,
(FLOAT)(SCORE_PX + i)*CHARA_WIDTH, (FLOAT)SCORE_PY*CHARA_WIDTH,
CHARA_WIDTH, CHARA_WIDTH,
CHARA_WIDTH/2, CHARA_WIDTH/2,
1, 1,
0, 0,
0, 0xffffffff);
//スコアの数字描画
for(i = 0; i < keta; i++)
DrawSprite(
lpDev,lpTex[2],
(FLOAT)(SCORE_PX*CHARA_WIDTH+250)-(i * NOMBER_W), (FLOAT)SCORE_PY*CHARA_WIDTH,
NOMBER_W, NOMBER_H,
NOMBER_W/2, NOMBER_H/2,
1, 1,
(FLOAT)NOMBER_W*a[i], 0,
0, 0xffffffff);
//スコアの文字描画
DrawSprite(
lpDev,lpTex[2],
(SCORE_PX)*CHARA_WIDTH, (SCORE_PY)*CHARA_WIDTH,
FONT_W*5, FONT_H,
(FONT_W*5)/2, FONT_H/2,
1, 1,
0, SCORE_TEX_V,
0, 0xffffffff);
}
//--------------------------------------------
// Name:DrawLife()
// Desc:ライフ描画
//--------------------------------------------
VOID DrawLife()
{
int i;
//ライフ表示領域の確保
for(i = 0; i < NOMBER_W; i++)
DrawSprite(
lpDev,NULL,
(FLOAT)(SCORE_PX + i)*CHARA_WIDTH, (FLOAT)SCORE_PY*CHARA_WIDTH+CHARA_HEIGHT,
CHARA_WIDTH, CHARA_WIDTH,
CHARA_WIDTH/2, CHARA_WIDTH/2,
1, 1,
0, 0,
0, 0xffffffff);
//ライフ描画
for(i = 0; i < CharaLife; i++)
DrawSprite( lpDev, lpTex[0],
(FLOAT) (SCORE_PX)*CHARA_WIDTH+(i*CHARA_WIDTH)+130, (FLOAT) (SCORE_PY)*CHARA_WIDTH+CHARA_HEIGHT,
CHARA_WIDTH, CHARA_HEIGHT,
CHARA_WIDTH/2, CHARA_HEIGHT/2,
1, 1,
0, 0,
0, 0xFFFFFFFF);
//ライフの文字描画
DrawSprite(
lpDev,lpTex[2],
(SCORE_PX)*CHARA_WIDTH, (SCORE_PY)*CHARA_WIDTH+CHARA_HEIGHT,
FONT_W*5, FONT_H,
(FONT_W*5)/2, FONT_H/2,
1, 1,
0, LIFE_TEX_V,
0, 0xffffffff);
}
//--------------------------------------------
// Name:DrawPower()
// Desc:パワー数字描画
//--------------------------------------------
VOID DrawPower()
{
int i;
int a[3] = {0,0,0}; //各桁の数字を記憶
int keta = 1; //桁数を記憶
//パワーが1桁のとき
a[0] = CharaPower;
//スコアが2桁のとき
if(CharaPower > 9 && CharaPower < 100)
{
a[0] = CharaPower % 10; //1桁目記憶
a[1] = CharaPower / 10; //2桁目記憶
keta = 2; //桁数記憶
}
//パワー表示領域の確保
for(i = 0; i < NOMBER_W; i++)
DrawSprite(
lpDev,NULL,
(FLOAT)(SCORE_PX + i)*CHARA_WIDTH, (FLOAT)SCORE_PY*CHARA_WIDTH+CHARA_HEIGHT+FONT_H,
CHARA_WIDTH, CHARA_WIDTH,
CHARA_WIDTH/2, CHARA_WIDTH/2,
1, 1,
0, 0,
0, 0xffffffff);
//パワー描画
if(CharaPower < ShotPower_2)
for(i = 0; i < keta; i++)
DrawSprite( lpDev, lpTex[2],
(FLOAT) (SCORE_PX*CHARA_WIDTH+250)-(i * NOMBER_W), (FLOAT) (SCORE_PY)*CHARA_WIDTH+CHARA_HEIGHT+FONT_H,
NOMBER_W, NOMBER_H,
NOMBER_W, NOMBER_H/2,
1, 1,
(FLOAT)NOMBER_W*a[i], 0,
0, 0xFFFFFFFF);
//ショットレベルがMAXのとき
if(CharaPower == ShotPower_2)
DrawSprite( lpDev, lpTex[2],
(FLOAT) SCORE_PX * CHARA_WIDTH + 250 - (FONT_W*2), (FLOAT) (SCORE_PY)*CHARA_WIDTH+CHARA_HEIGHT+FONT_H,
FONT_W*3, FONT_H,
(FONT_W*3)/2, FONT_H/2,
1, 1,
FONT_W * 5, POWER_TEX_V,
0, 0xFFFFFFFF);
//パワーの文字描画
DrawSprite(
lpDev,lpTex[2],
(SCORE_PX)*CHARA_WIDTH, (SCORE_PY)*CHARA_WIDTH+CHARA_HEIGHT+FONT_H,
FONT_W*5, FONT_H,
(FONT_W*5)/2, FONT_H/2,
1, 1,
0, POWER_TEX_V,
0, 0xffffffff);
}
//--------------------------------------------
// Name:DrawBoss()
// Desc:ボスの描画
//--------------------------------------------
VOID DrawBoss()
{
int i;
if(sBoss.iUsed == TRUE)
{
//弾がヒットしていれば点滅アニメーション
if(sBoss.iHit == TRUE)
sBoss.iAnim = 1;
DrawSprite( lpDev, lpTex[0],
sBoss.sPos.fX, sBoss.sPos.fY,
BOSS_WIDTH, BOSS_HEIGHT,
BOSS_WIDTH/2, BOSS_HEIGHT/2,
1, 1,
(FLOAT) sBoss.iAnim * BOSS_WIDTH, BOSS_TEX_V,
0, 0xFFFFFFFF);
sBoss.iAnim = 0;
sBoss.iHit = FALSE;
}
//爆発アニメーション
if(sBoss.iBlast == TRUE)
{
for(i = 0; i < 30; i++)
{
DrawSprite( lpDev, lpTex[0],
sBoss.sPos.fX+rand()%BOSS_WIDTH, sBoss.sPos.fY+rand()%BOSS_HEIGHT,
BLAST2_WIDTH, BLAST2_HEIGHT,
BLAST2_WIDTH/2, BLAST2_HEIGHT/2,
1, 1,
(FLOAT)sBoss.iBstPtn*BLAST2_WIDTH, BLAST2_TEX_V,
0, 0xFFFFFFFF);
}
sBoss.iBstPtn++;
if( sBoss.iBstPtn >= BLAST2_MAX ) //パターン終了
{
sBoss.iBlast = FALSE; //使用済みにする
sBoss.sPos.fX = GAME_WIDTH;
sBoss.sPos.fY = GAME_HEIGHT;
BossDead = TRUE;
dwCTime = timeGetTime();
}
}
}
//--------------------------------------------
// Name:DrawClear()
// Desc:「GAMECLEAR」の描画
//--------------------------------------------
VOID DrawClear()
{
//3秒間「GAME CLEAR」を描画する
if(BossDead == TRUE)
{
dwClearTime = 0;
dwClearTime = timeGetTime();
dwLastClearTime = dwCTime;
if(dwClearTime - dwLastClearTime < 3000)
{
DrawSprite( lpDev, lpTex[2],
( GAME_WIDTH /2 ) - ( FONT_W*9+8 )/2, GAME_HEIGHT /2,
FONT_W*9+8, FONT_H,
(FONT_W*9+8)/2, FONT_H /2,
1, 1,
0, CLEARFONT_TEX_V,
0, 0xFFFFFFFF);
//描画中は無敵にする
Invincible = TRUE;
}
//3秒経ったらゲームクリアへ
if( dwClearTime - dwLastClearTime > 3000 )
cFlag.iGameFlag=_GAMECLEAR_;
}
}
//--------------------------------------------
// Name:DrawGameOver()
// Desc:「GAMEOVER」の描画
//--------------------------------------------
VOID DrawGameOver()
{
//3秒間「GAME OVER」を描画する
if(CharaLife <= 0)
{
dwEndTime = 0;
dwEndTime = timeGetTime();
dwLastEndTime = dwETime;
if(dwEndTime - dwLastEndTime < 3000)
{
DrawSprite( lpDev, lpTex[2],
( GAME_WIDTH /2 ) - ( FONT_W*8+8 )/2, GAME_HEIGHT /2,
FONT_W*8+8, FONT_H,
(FONT_W*8+8)/2, FONT_H /2,
1, 1,
0, GAMEOVER_TEX_V,
0, 0xFFFFFFFF);
//描画中は無敵にする
Invincible = TRUE;
}
//3秒経ったらゲームオーバーへ
if( dwEndTime - dwLastEndTime > 3000 )
cFlag.iGameFlag=_GAMEEND_;
}
}
//メイン画面より右にいる敵は描画しない---------------------------------------------------------------
//敵機1
if(sEnemy[j][i].sPos.fX + ENEMY_WIDTH > GAME_WIDTH && j == 0)
{
hami = sEnemy[j][i].sPos.fX+ENEMY_WIDTH - GAME_WIDTH;
DrawSprite( lpDev, lpTex[0],
sEnemy[j][i].sPos.fX, sEnemy[j][i].sPos.fY,
ENEMY_WIDTH-hami, ENEMY_HEIGHT,
(ENEMY_WIDTH-hami)/2, ENEMY_HEIGHT/2,
1, 1,
(FLOAT)sEnemy[j][i].iAnim * ENEMY_WIDTH, ENEMY_TEX_V,
0, 0xFFFFFFFF);
}
//敵機2
if(sEnemy[j][i].sPos.fX + ENEMY2_WIDTH > GAME_WIDTH && j == 1)
{
hami = sEnemy[j][i].sPos.fX+ENEMY2_WIDTH - GAME_WIDTH;
DrawSprite( lpDev, lpTex[0],
sEnemy[j][i].sPos.fX, sEnemy[j][i].sPos.fY,
ENEMY2_WIDTH-hami, ENEMY2_HEIGHT,
(ENEMY2_WIDTH-hami)/2, ENEMY2_HEIGHT/2,
1, 1,
(FLOAT) sEnemy[j][i].iAnim * ENEMY2_WIDTH, ENEMY2_TEX_V,
0, 0xFFFFFFFF);
}
}
else
{
//爆発描画----------------------------------------------------------------------------------------------
//敵機1
if(j == 0)
DrawSprite( lpDev, lpTex[0],
sEnemy[j][i].sPos.fX, sEnemy[j][i].sPos.fY,
ENEMY_WIDTH, ENEMY_HEIGHT,
ENEMY_WIDTH/2, ENEMY_HEIGHT/2,
1, 1,
(FLOAT)sEnemy[j][i].iBstPtn * BLAST_WIDTH, BLAST_TEX_V,
0, 0xFFFFFFFF);
//敵機2
if(j == 1)
DrawSprite( lpDev, lpTex[0],
sEnemy[j][i].sPos.fX+8, sEnemy[j][i].sPos.fY,
BLAST2_WIDTH, BLAST2_HEIGHT,
BLAST2_WIDTH/2, BLAST2_HEIGHT/2,
1, 1,
(FLOAT)sEnemy[j][i].iBstPtn * BLAST2_WIDTH, BLAST2_TEX_V,
0, 0xFFFFFFFF);
//爆発アニメーション設定
sEnemy[j][i].iBstPtn++;
if( j == 0 && sEnemy[j][i].iBstPtn >= BLAST_MAX ) //敵機1パターン終了
sEnemy[j][i].iUsed = FALSE; //使用済みにする
if( j == 1 && sEnemy[j][i].iBstPtn >= BLAST2_MAX ) //敵機2パターン終了
sEnemy[j][i].iUsed = FALSE; //使用済みにする
}
}
}
}
}
//--------------------------------------------
// Name:DrawEnemyShot()
// Desc:敵機の弾の描画
//--------------------------------------------
VOID DrawEnemyShot()
{
int i;
float hami = 0; //はみ出し判定
for( i = 0; i < ENEMYSHOT_MAX; i++ )
{
if( sEnemyShot[i].iUsed == TRUE ) //発射済みなら描画
{
//画面中央より左なら描画
if(sEnemyShot[i].sPos.fX + SHOT_WIDTH < GAME_WIDTH)
{
DrawSprite( lpDev, lpTex[0],
sEnemyShot[i].sPos.fX, sEnemyShot[i].sPos.fY,
SHOT_WIDTH, SHOT_HEIGHT,
SHOT_WIDTH/2, SHOT_HEIGHT/2,
1, 1,
0, SHOT_TEX_V,
0, 0xFFFFFFFF);
}
//画面外にはみ出した弾は描画しない
if(sEnemyShot[i].sPos.fX + SHOT_WIDTH> GAME_WIDTH)
{
hami = sEnemyShot[i].sPos.fX+SHOT_WIDTH - GAME_WIDTH;
DrawSprite( lpDev, lpTex[0],
sEnemyShot[i].sPos.fX, sEnemyShot[i].sPos.fY,
SHOT_WIDTH - hami, SHOT_HEIGHT,
(SHOT_WIDTH - hami )/2, SHOT_HEIGHT/2,
1, 1,
0, SHOT_TEX_V,
0, 0xFFFFFFFF);
}
}
}
}
//--------------------------------------------
// Name:DrawShot()
// Desc:自機の弾の描画
//--------------------------------------------
VOID DrawShot()
{
int i,j;
FLOAT hami = 0;
for(i = 0; i < SHOT_KIND; i++)
{
for(j = 0; j < SHOT_MAX; j++)
{
if(sShot[i][j].iUsed == TRUE)
{
//画面外にはみ出した弾は描画しない
if(sShot[i][j].sPos.fX + SHOT_WIDTH > GAME_WIDTH)
hami = sShot[i][j].sPos.fX+SHOT_WIDTH - GAME_WIDTH;
//発射済みなら描画
DrawSprite( lpDev, lpTex[0],
sShot[i][j].sPos.fX, sShot[i][j].sPos.fY,
SHOT_WIDTH - hami, SHOT_HEIGHT,
(SHOT_WIDTH - hami) / 2, SHOT_HEIGHT/2,
1, 1,
0, SHOT_TEX_V,
0, 0xFFFFFFFF);
}
}
}
}
//--------------------------------------------
// Name:DrawGyorai()
// Desc:自機の魚雷の描画
//--------------------------------------------
VOID DrawGyorai()
{
int j;
FLOAT hami = 0;
for(j = 0; j < GYORAI_MAX; j++)
{
if(sGyorai[j].iUsed == TRUE)
{
//発射済みなら描画
DrawSprite( lpDev, lpTex[0],
sGyorai[j].sPos.fX, sGyorai[j].sPos.fY,
GYORAI_WIDTH , GYORAI_HEIGHT,
(GYORAI_WIDTH ) / 2, GYORAI_HEIGHT/2,
1, 1,
32, 96,
0, 0xFFFFFFFF);
}
}
}
//--------------------------------------------
// Name:DrawMissile()
// Desc:自機のミサイルの描画
//--------------------------------------------
VOID DrawMissile()
{
int j;
FLOAT hami = 0;
for(j = 0; j < MISSILE_MAX; j++)
{
if(sMissile[j].iUsed == TRUE)
{
//発射済みなら描画
DrawSprite( lpDev, lpTex[0],
sMissile[j].sPos.fX, sMissile[j].sPos.fY,
MISSILE_WIDTH , MISSILE_HEIGHT,
(MISSILE_WIDTH ) / 2, MISSILE_HEIGHT/2,
1, 1,
24, 96,
0, 0xFFFFFFFF);
}
}
}
//--------------------------------------------
// Name:DrawShiden()
// Desc:自機のミサイルの描画
//--------------------------------------------
VOID DrawShiden()
{
int j;
FLOAT hami = 0;
for(j = 0; j < SHIDEN_MAX; j++)
{
if(sShiden[j].iUsed == TRUE)
{
//発射済みなら描画
DrawSprite( lpDev, lpTex[0],
sShiden[j].sPos.fX, sShiden[j].sPos.fY,
SHIDEN_WIDTH , SHIDEN_HEIGHT,
SHIDEN_WIDTH/2, SHIDEN_HEIGHT/2,
1, 1,
0, CHARA_TEX_V,
0, 0xFFFFFFFF);
}
}
}
//--------------------------------------------
// Name:DrawEnemy()
// Desc:敵機の描画
//--------------------------------------------
VOID DrawEnemy()
{
int i,j;
float hami = 0;
//生成済みの敵機を探す
for( i = 0; i < ENEMY_MAX; i++ )
{
for( j = 0; j < ENEMY_KIND; j++)
{
if( sEnemy[j][i].iUsed == TRUE )
{
//敵機は爆破しているか
if(sEnemy[j][i].iBlast == FALSE )
{
//12描画毎にアニメーション
if(sEnemy[j][i].iCnt > 12)
{
sEnemy[j][i].iAnim = (sEnemy[j][i].iAnim + 1) % 2;
sEnemy[j][i].iCnt = 0;
}
//生成済みかつ画面内にいて爆発していないなら描画----------------------------------------------------------------
//敵機1
if(sEnemy[j][i].sPos.fX + ENEMY_WIDTH < GAME_WIDTH && j == 0)
{
DrawSprite( lpDev, lpTex[0],
sEnemy[j][i].sPos.fX, sEnemy[j][i].sPos.fY,
ENEMY_WIDTH, ENEMY_HEIGHT,
ENEMY_WIDTH/2, ENEMY_HEIGHT/2,
1, 1,
(FLOAT)sEnemy[j][i].iAnim * ENEMY_WIDTH, ENEMY_TEX_V,
0, 0xFFFFFFFF);
}
//敵機2
//被弾していたときのアニメーション
if(sEnemy[j][i].iHit == TRUE)
sEnemy[j][i].iAnim = 1;
if(sEnemy[j][i].sPos.fX + ENEMY2_WIDTH < GAME_WIDTH && j == 1)
{
DrawSprite( lpDev, lpTex[0],
sEnemy[j][i].sPos.fX, sEnemy[j][i].sPos.fY,
ENEMY2_WIDTH, ENEMY2_HEIGHT,
ENEMY2_WIDTH/2, ENEMY2_HEIGHT/2,
1, 1,
(FLOAT) (sEnemy[j][i].iAnim + sEnemy[j][i].eLifeAnim)*ENEMY2_WIDTH, ENEMY2_TEX_V,
0, 0xFFFFFFFF);
//被弾アニメーション
sEnemy[j][i].eLifeAnim = 0;
sEnemy[j][i].iHit = FALSE;
}
Draw.cpp
//--------------------------------------------
// Name:Draw()
// Desc:描画
//--------------------------------------------
#include "GPLib.h"
#include "MyLib.h"
#include "Title.h"
#include "Draw.h"
#include "Shot.h"
#include "Gyorai.h"
#include "Missile.h"
#include "Enemy.h"
#include "Chara.h"
#include "Score.h"
#include "Boss.h"
#include "Shiden.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
#define _GAMEEND_ 3
#define _GAMECLEAR_ 4
//自機情報
#define CHARA_WIDTH 32
#define CHARA_HEIGHT 32
//弾情報
#define SHOT_WIDTH 8
#define SHOT_HEIGHT 8
#define ShotPower_2 2
#define GYORAI_WIDTH 9
#define GYORAI_HEIGHT 36
#define MISSILE_WIDTH 9
#define MISSILE_HEIGHT 36
//自機情報
#define SHIDEN_WIDTH 32
#define SHIDEN_HEIGHT 32
//敵情報
#define ENEMY_WIDTH 32
#define ENEMY_HEIGHT 32
#define ENEMY2_WIDTH 32
#define ENEMY2_HEIGHT 40
#define ENEMYSHOT_MAX 30
#define BOSS_WIDTH 32
#define BOSS_HEIGHT 105
#define BOSSLIFE_WIDTH 400
#define BOSSLIFE_HEIGHT 32
#define BOSSLIFE_WIDTH2 392
//爆風
#define BLAST_WIDTH 32
#define BLAST_HEIGHT 32
#define BLAST_MAX 16
#define BLAST2_WIDTH 48
#define BLAST2_HEIGHT 48
#define BLAST2_MAX 8 //アニメーションパターン数
//アイテム
#define ONEUP_WIDTH 24
#define ONEUP_HEIGHT 24
#define POWERUP_WIDTH 16
#define POWERUP_HEIGHT 16
// スコアの表示関連
#define SCORE_PX 15
#define SCORE_PY 3
//フォントのサイズ
#define FONT_W 24
#define FONT_H 32
#define NOMBER_W 20
#define NOMBER_H 31
//テクスチャ内のY座標
#define CHARA_TEX_V 0 //自機
#define ENEMY_TEX_V CHARA_HEIGHT //敵機1
#define BLAST_TEX_V (ENEMY_TEX_V + ENEMY_HEIGHT) //自機・敵機1爆発エフェクト
#define SHOT_TEX_V (BLAST_TEX_V + BLAST_HEIGHT) //弾
#define ONEUP_TEX_V (SHOT_TEX_V + SHOT_HEIGHT) //1UPアイテム
#define POWERUP_TEX_V (ONEUP_TEX_V + ONEUP_HEIGHT) //パワーアップアイテム
#define ENEMY2_TEX_V (POWERUP_TEX_V + POWERUP_HEIGHT)//敵機2
#define BLAST2_TEX_V (ENEMY2_TEX_V + ENEMY2_HEIGHT) //敵機2爆発エフェクト
#define BOSS_TEX_V (BLAST2_TEX_V + BLAST2_HEIGHT) //ボス
#define START_TEX_V NOMBER_H+1
#define SCORE_TEX_V START_TEX_V+START_TEX_V
#define LIFE_TEX_V SCORE_TEX_V+START_TEX_V
#define POWER_TEX_V LIFE_TEX_V+FONT_H
#define BOSSLIFE_TEX_V POWER_TEX_V + FONT_H
#define BOSSLIFE2_TEX_X 79
#define BOSSLIFE2_TEX_Y BOSSLIFE_TEX_V + FONT_H
#define CLEARFONT_TEX_V BOSSLIFE_TEX_V + (FONT_H + 24)
#define GAMEOVER_TEX_V CLEARFONT_TEX_V + FONT_H
//テクスチャ数
#define MAX_TEX 6
//グローバルなインスタンスを宣言
extern LPDIRECT3D9 lpD3d;
extern LPDIRECT3DDEVICE9 lpDev;
extern LPDIRECT3DTEXTURE9 lpTex[MAX_TEX];
extern HWND hWndApp;
//--------------------------------------------
// Name:Draw()
// Desc:描画
//--------------------------------------------
VOID Draw()
{
//キーボード操作
ChkKey();
//弾の移動処理
MoveShot();
MoveGyorai();
MoveMissile();
MoveShiden();
//敵機の処理
CreateEnemy(); //新しい敵機を生成する
CreateBoss(); //ボスを生成する
MoveEnemy(); //移動処理
ShotEnemy(); //敵機の弾を生成する
MoveEnemyShot(); //敵機の弾の移動
//当たり判定
ChkBlast();
//アルファブレンドの設定
SetAlphablend(lpDev, TRUE);
// クリア
lpDev->Clear( 0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(64,64,64), 1.0f, 0 );
// 描画開始
if( SUCCEEDED( lpDev->BeginScene() ) )
{
//背景描画
DrawSprite( lpDev, lpTex[1],
0, 0,
GAME_WIDTH, GAME_HEIGHT,
GAME_WIDTH/2, GAME_HEIGHT/2,
1, 1,
(FLOAT)ScrollX, (FLOAT)ScrollY,
0, 0xFFFFFFFF);
//縦スクロール
ScrollY--;
//ボス描画
DrawBoss();
//自機描画
DrawChara();
//敵機の描画
DrawEnemy();
//敵機の弾の描画
DrawEnemyShot();
//アイテムの描画&落下
DrawItem();
//自機の弾描画
DrawShot();
DrawGyorai();
DrawMissile();
DrawShiden();
//ボスのライフ描画
BossLife();
//スコアの描画
Score();
//ライフの描画
DrawLife();
//パワーの描画
DrawPower();
//「GAME_CLEAR」描画
DrawClear();
//「GAME_OVER」描画
DrawGameOver();
//その他の描画が必要ならここで処理をすること
// 描画終了
lpDev->EndScene();
}
lpDev->Present( NULL, NULL, NULL, NULL );
}