スポンサーサイト



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

今年最後の月が来ます

とびだせ どうぶつの森
明日から星座シリーズの家具の配信が始まります。
12月1日から21日まではいて座の「サジタリアスの矢」。10日までは自宅でしか受け取れないからご注意。
22日から1月の19日まではやぎ座です。
1日から10日まで「すれちがい通信中継所」できりかぶのスツールが貰えます。
去年も配信したアイテムです。
去年受け取り済みの人も貰えますよ。
更に10日から25日までいつの間に通信でブッシュ・ド・ノエルが来ます。
こちらも去年もらった人も貰えます。

12月はクリスマスと年越しカウントダウンが控えています。
体調管理に気を付けて楽しみましょう。

クリア記念晒し祭

ダンボール戦機WARS、クリアしたのでせっかくだから色々晒しちゃいます。各小隊メンバーとスカウトしたキャラたちの12月5日現在のレベルとか武器とか使用機体とか。せっかくだからツバサ君の必殺ファンクションも載せとく。
現在残りの拠点はロシウス8、グレンシュテイム3、ロンドニア2です。残りはハーネスとジェノックの領土。表ランキングがメタ沢四郎を倒したところです。ドロイドが倒せなくて制圧が進んでません。
残りスカウト枠は4。ユウヤ、ジン、ダイキとあと一人。誰にしようか。

第一小隊
ツバサ(アバター) Lv59
ドットブラスライザー
シーロードアンカー/スナイプアーバレスト
ラグナロクフェイズ、オーシャンブラスト、フルビットバースト、∞ドライブ、ニトロエアレイド

金箱スズネ Lv59
トライヴァインC
トリケラヘッド/レッドバズーカ改

乾カゲトラ Lv59
バル・ダイバー
ゼットソードU、ゼットシールドU

笹川ノゾミ Lv47
DCオフェンサーJ
レールガン/シーホースアンカー

第二小隊
吹野タダシ Lv44
DCブラストアーム
スナイプアーバレスト/レッドイーグル

皇アオイ Lv47
ヴェルネル
デュエルレイピア/イエローバズーカ

門倉アンナ Lv48
G・ユーグフラオ
ブレイズナックル/シューターSR34C

石川タケヒロ Lv47
エアライドス
シンセンコン/アバランチャー

第三小隊
木場カゲト Lv54
ドットブレイズ
鉄刀・鬼機丸、ソルジャーシールド/スナイプアーバレスト

バネッサ・ガラ Lv55
ガウンタ
武の剣、クインシールド/レッドバズーカ改

法条ムラク Lv55
マグナ・オルタス
マグナスブレード、マグナスシールド/改造サブマシンガン

星原ヒカル Lv50
バル・ダイバー
鉄刀・鬼機丸、セイヴァークロス/炎帝イグナイトエッジ

第四小隊
鴻森シスイ Lv55
DCブラストアーム
スナイプアーバレスト/ゴウターロン

渚リリカ Lv55
バル・スパロス
クレセントムーンU/ショットガンSG4C

エスティー・ベル Lv55
マリーフェイン
ミョルニル/ビビンバードガン

風陣カイト Lv50
バル・スパロス
四王ビャッコ/ビビンバードランチャー

星座

ちまちまとアイカツ!もしてます。

キングレオシリーズのトップス、ボトムス、シューズを手に入れたので、しし座カップをクリアしてきました。
トップスとボトムス手に入れたお店で昨日もやってきたんですが、そしたらミュージカルスコーピオンのトップスでました。ボトムスとシューズ出たらさそり座カップもしておきたいな。

次弾以降でロリゴシックの、多分やぎ座の星座ドレスがでたらなんとしてもゲットしたいです。ロリゴシック好きなんで。

ところで、おとめ座は美月さんですが、おとめ座の星座ドレスはラブクイーンなんですかね?

祝1年

とびだせ どうぶつの森、発売から1年。おめでとう!

しばらくやっていないうちに夏もハロウィンも過ぎて村長に就任してから1年がたちました。
今日からすれ違い中継所で「おちばチェア」がもらえます。

あと、今日から「いっしょにフォト」機能が付いたニンテンドープリペイドカードが発売されてます。
これは3DSのカメラで写すとしずえ、つぶまめ、とたけけが出て一緒に写真が撮れるみたいです。

もうすぐ収穫祭もありますし、2年目の森の生活も楽しんでいこう!

ダン戦プラモとゲームのお話

盛大にネタバレ?してます。

みごとにダンボール戦機にはまりました。無印もWもウォーズもみんないいです。
ってことでGO!

ドットブラスライザージー・エクスト買っちゃいました。
赤いドブスさん、とってもかっこいいです。
他にもジョーカーMk−2さんだとかイカロス・ゼロさんだとかマグナオルタスさんだとか色々買っちゃいました。
ゲームもやっています。いまだにクリアーできてないですけどね。
アバターはツバサです。藍色の髪の貴志部くん似の子です。
機体はドットブラスライザー、武器はハンマー(サイス)と狙撃銃です。
すれ違っていたらよろしくお願いします。

1月と2月にオーディンMとドットブレイズがでるみたいですね。ゲームにしか出てこない機体がプラモ化。他の、たとえばヴェスパーとかも期待していいでしょうか?
アニメが終わってもプラモが出続けてくれる、すごい嬉しいです。
来月にはディ・エゼルディも出ますし。

年が明けても楽しみがあって、本当にわくわくです。
あ、ダン戦フォトバトルに参加しています。目指せ、全機撃破!

(20)

 長引く戦いの中、新たな空母がこの激戦地へ配備されることとなった。その空母の名は鸞(らん)。新型空母・鸞の艦長となった君は、死地へと身を投じることとなる。艦載機に指示を出しこの死地を潜り抜け、多くの武勲を挙げよ

概要
  画面上部から出現する敵を主砲とミサイルと魚雷で討て!
かれーを取って残機1回復、瓶入り曹達を取って主砲のパワーアップ。

操作
移動 ←↑→ (後退など不要である)
砲弾の発射 Zキー(デフォルト1門、パワーアップ後2門)
ミサイルの発射 Xキー
魚雷の発射 Cキー
艦載機の発進 Vキー

モチーフ元
艦載機  紫電改
空母   翔鶴
敵戦艦  長門
敵駆逐艦 時雨

未実装
艦載機の攻撃発艦から一定時間経過後敵機に特攻若しくは爆撃していく
ミサイル、魚雷の当たり判定の追加
潜水艦の魚雷のみでの撃破

(19)

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

(18)

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_

(17)

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;  //画面外なので使用済みにする
}

(16)

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;  //画面外なので使用済みにする
  
 } 
}

(15)

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_

(14)

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_

(13)

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_

(12)

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

(11)

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;  //画面外なので使用済みにする
  }
 }
}

(10)

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

(9)

//--------------------------------------------
// 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_;
 }
}

(8)

     //メイン画面より右にいる敵は描画しない---------------------------------------------------------------
     //敵機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);
   }
  }
 }
}

(7)

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

(6)

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

←prev next