シューティングゲーム 上手く出来ない! Part-2
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
シューティングゲーム 上手く出来ない! Part-2
長期休み中、返事を投稿することが出来なかったので、閉鎖したかもしれませんが、
まだ続くので新たに作らせていただきました。
ゴールデンウィーク中に新たな問題も発生したため、続きという形で立たせていただきました。
まだ続くので新たに作らせていただきました。
ゴールデンウィーク中に新たな問題も発生したため、続きという形で立たせていただきました。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
4月27日からの続き。
弾が表示されていない場合、弾を表示させ、フレーム数を関数に代入させる。
そして、弾が発射されている間は、フレーム数を減らし、フレーム数が0になったら次の弾を発射させる。
フレーム数は弾の発射させる時間の代わりになるもの
20という数値分、弾と弾との間があく。
つまり、僕のプログラムの場合、画面の外に弾が消えたら次の弾を出現させていました。
でも、フレーム数という一定の数値を管理する変数を作り、
たとえ一つの弾が画面の外にいかなくても、フレーム数が20から0になった時、次の弾が出るように修正した
ということですか?
配列の添字は
「em」=ENEMY_MAX
「eb」=ENEMY_BLT_MAX
「b」=BULLET_MAX
「i」=MYSHIP
ですね。
はもしかして、敵1体1体毎に、敵の座標などを入れたという処理に修正したということですか?
それで、《enemyとenemy_blt配列はひとつにマトメました。》ということですね。
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 30;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
そして、弾が発射されている間は、フレーム数を減らし、フレーム数が0になったら次の弾を発射させる。
フレーム数は弾の発射させる時間の代わりになるもの
20という数値分、弾と弾との間があく。
つまり、僕のプログラムの場合、画面の外に弾が消えたら次の弾を出現させていました。
でも、フレーム数という一定の数値を管理する変数を作り、
たとえ一つの弾が画面の外にいかなくても、フレーム数が20から0になった時、次の弾が出るように修正した
ということですか?
配列の添字は
「em」=ENEMY_MAX
「eb」=ENEMY_BLT_MAX
「b」=BULLET_MAX
「i」=MYSHIP
ですね。
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
enemy_blt[em][eb].active = 0;
enemy_blt[em][eb].type = 0;
}
}
それで、《enemyとenemy_blt配列はひとつにマトメました。》ということですね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
前回の続きですね? どうやら期間経過で自動閉鎖された様です。
http://dixq.net/forum/viewtopic.php?f=3&t=8105
つねに一発しか飛ばないならENEMY_BLT_MAXは1で良いはずですが、それではシューティングに成らないんと思うのでshot_waitで一定間隔で弾を発射させる事にしました。
ちなみに、下記のコードは enemy_blt。つまり敵の弾の処理です。
敵の位置の初期化はこちらです。
enemy[].typeをつかって右向きと左向きの処理を分けています。
http://dixq.net/forum/viewtopic.php?f=3&t=8105
元のプログラムを見ると、enemy_blt[0]しか見てないのでENEMY_BLT_MAXが意味をなしてませんでした。STAR_HARUKI さんが書きました:弾が表示されていない場合、弾を表示させ、フレーム数を関数に代入させる。
そして、弾が発射されている間は、フレーム数を減らし、フレーム数が0になったら次の弾を発射させる。
フレーム数は弾の発射させる時間の代わりになるもの
20という数値分、弾と弾との間があく。
つまり、僕のプログラムの場合、画面の外に弾が消えたら次の弾を出現させていました。
でも、フレーム数という一定の数値を管理する変数を作り、
たとえ一つの弾が画面の外にいかなくても、フレーム数が20から0になった時、次の弾が出るように修正した
ということですか?
つねに一発しか飛ばないならENEMY_BLT_MAXは1で良いはずですが、それではシューティングに成らないんと思うのでshot_waitで一定間隔で弾を発射させる事にしました。
すこし私の説明が悪かったので再度説明すると、2つあったenemyと2つあったenemy_blt配列は、それぞれ1つにまとめたってことになります。STAR_HARUKI さんが書きました:はもしかして、敵1体1体毎に、敵の座標などを入れたという処理に修正したということですか?
それで、《enemyとenemy_blt配列はひとつにマトメました。》ということですね。
ちなみに、下記のコードは enemy_blt。つまり敵の弾の処理です。
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
enemy_blt[em][eb].active = 0;
enemy_blt[em][eb].type = 0;
}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
何もコメントがありませんが、理解できこれまでのところ迄問題なしと考えて良いですね?
勘で書くと1枚目と-480の座標に座標を初期設定してください。
画面端で
gPos_map.y = -480*2;
とすれば1枚目と2枚目がうま交互に表示されます。
そもそも元のソースに2枚目の画像処理は無い様ですが、いつ追加されてました?
勘で書くと1枚目と-480の座標に座標を初期設定してください。
画面端で
gPos_map.y = -480*2;
とすれば1枚目と2枚目がうま交互に表示されます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
2枚目の画像処理(ということは、表示や移動、matrix関数などひっくるめて?)
を加えないと、スクロールという動作が動かないということですか?
また、2枚目の画像処理の場合はどうすればいいですか?
追記:
はい。複数の敵を表示させるには、敵と弾の処理を別々に書くのではなくて、ひとまとめにしないと後が変になるということですね。
でも、自分では思いつかないですねm(__)m
きっと、別々で書いちゃいます・・・・・・。
それと、今までのソースにはその処理はありません。
今追加しようと思っていました。
すみません。なのでソースにはありません。
を加えないと、スクロールという動作が動かないということですか?
また、2枚目の画像処理の場合はどうすればいいですか?
追記:
はい。複数の敵を表示させるには、敵と弾の処理を別々に書くのではなくて、ひとまとめにしないと後が変になるということですね。
でも、自分では思いつかないですねm(__)m
きっと、別々で書いちゃいます・・・・・・。
それと、今までのソースにはその処理はありません。
今追加しようと思っていました。
すみません。なのでソースにはありません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
2枚目の背景という話題が出たので作ったのかと思ったのですが、まだなのですね。
簡単にするには、2枚目の背景画像を使うのではなく一枚で済ませたほうが良いと思います。
背景の縦の長さを例えば画面の縦の長さの3倍以上にしてください。
気をつけることは一定周期で座標を戻す場合に背景画像が継続しているように見える必要があります。
つまり、
A ・・・ 1画面サイズの背景画像A
B ・・・ 1画面サイズの背景画像B
A ・・・ 1画面サイズの背景画像A
と背景画像Bが背景画像Aにサンドイッチされた形で縦に並んでいる画像を作ります。
初期位置は、
gPos_map.y = -480*2;
で次のように制御します。
簡単にするには、2枚目の背景画像を使うのではなく一枚で済ませたほうが良いと思います。
背景の縦の長さを例えば画面の縦の長さの3倍以上にしてください。
気をつけることは一定周期で座標を戻す場合に背景画像が継続しているように見える必要があります。
つまり、
A ・・・ 1画面サイズの背景画像A
B ・・・ 1画面サイズの背景画像B
A ・・・ 1画面サイズの背景画像A
と背景画像Bが背景画像Aにサンドイッチされた形で縦に並んでいる画像を作ります。
初期位置は、
gPos_map.y = -480*2;
で次のように制御します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
//--------------------------------------------------------------------------------------
// 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 2 //敵の最大数
#define ENEMY_SPEED 3 //敵の動く最大速度
#define ENEMY_SPEED_B 4 //敵の動く最大速度パターンB
/*敵用の弾*/
#define ENEMY_BLT_MAX 20 //敵の弾の最大数
#define ENEMY_BLT_SPEED 6 //敵用弾の移動速度
/*中ボス*/
#define ENEMY_BOSS 1 //ボス最大数
//--------------------------------------------------------------------------------------
//関数
//-------------------------------
int gamemode = 0;//ゲームモード管理変数『0:タイトル 1:ゲーム画面 2:ゲームクリア 3:ゲームオーバー』
int times = 60,ti = 0,te = 0,ts = 0;//制限時間管理用変数
int i;
int score;//得点
int Hi_score;//最高得点
int Life = 50;//体力
int count_e;//倒した敵の数
int map[2];//背景画像をループさせるため
//--------------------------------------------------------------------------------------
//テクスチャ関数
//-------------------------------
LPDIRECT3DTEXTURE9 pTexture;//自機用
LPDIRECT3DTEXTURE9 pText_tama;//自弾用
LPDIRECT3DTEXTURE9 pText_teki;//敵用
LPDIRECT3DTEXTURE9 pText_teta;//敵弾用
LPDIRECT3DTEXTURE9 pText_icon;//アイテム用
LPDIRECT3DTEXTURE9 pText_back;//背景用
LPDIRECT3DTEXTURE9 pText_back_a;//背景用
LPDIRECT3DTEXTURE9 pText_back_sc;//得点背景用
LPDIRECT3DTEXTURE9 pText_boss;//中ボス
//LPDIRECT3DTEXTURE9 pText_logo_a;//ロゴ001用
//LPDIRECT3DTEXTURE9 pText_life;//自機ライフ用
//スプライトの作成
LPD3DXSPRITE pSprite;
//--------------------------------------------------------------------------------------
//座標関数
//-------------------------------
D3DXVECTOR3 gPos_map = D3DXVECTOR3(0,0,0);//背景画像用の画像指定位置
D3DXVECTOR3 gPos_map_a = D3DXVECTOR3(0,-480,0);//背景画像用の画像指定位置
D3DXVECTOR3 gPos_sc = D3DXVECTOR3(384,-30,0);//背景画像用の画像指定位置
//D3DXVECTOR3 gPos_logo_a = D3DXVECTOR3(150,420,0);//ロゴ001画像用の画像指定位置
//--------------------------------------------------------------------------------------
//マトリクス
//-------------------------
D3DXMATRIX matrix_ji;//自機
D3DXMATRIX matrix_back;//背景
D3DXMATRIX matrix_back_a;//背景
D3DXMATRIX matrix_back_sc;//ハイスコア背景画像
//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 shot_wait;//発車待ち
int type;//敵の種類
D3DXMATRIX matrix_te;//敵の行列
};
_enemy enemy[ENEMY_MAX];//敵構造体の宣言
//---------------------------------------------
//敵の弾の構造体
//------------------
typedef struct _enemy_blt
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_enemy_blt enemy_blt[ENEMY_MAX][ENEMY_BLT_MAX];//弾構造体の宣言
//---------------------------------------------
//敵の弾の構造体 中ボス
//------------------
typedef struct _enemy_boss
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_enemy_boss enemy_boss[ENEMY_BOSS];//弾構造体の宣言
//--------------------------------------------------------------------------------------
//フォント作成 変数宣言
//--------------------------------
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
//--------------------------------------------------------------------------------------
#ifdef DXUTD3D9 /*新しいDXUT対応のため*/
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
#else
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
#endif
{
// キー状態を調べる関数
keycheck( );
switch(gamemode)
{
case 0://【タイトル画面】
if(gamemode == 0)
{
if(KEY_S == PUSH)//Sキーが押されたら下記の処理を実行!
{
gamemode = 1;//タイトル画面からゲーム画面へ移動
}
}
//ハイスコア得点の背景画像
D3DXMatrixTranslation( &matrix_back_sc,0,0,0);
//<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_SPACE == PUSH)//スペースキーが押されたら
{
for (int b = 0; b < BULLET_MAX; b++)
{
if(bullets[b].active == 0)
{
bullets[b].active = 1;//弾の表示
//自機の中央に表示させる
bullets[b].gPos_tm.x = myship[0].gPos.x + 29;
bullets[b].gPos_tm.y = myship[0].gPos.y + 15;
break;//処理を抜け出す
}
}
}
//--------------------------------------------------------------------------------------
//自弾の移動
//----------------------------------
// for文で弾の数だけやる
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)//弾が有効
{
switch(bullets[b].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
bullets[b].gPos_tm.y -= BULLET_SPEED;//弾の座標を減らす
if(bullets[b].gPos_tm.y < 0)
{
bullets[b].gPos_tm.y = myship[0].gPos.y;
bullets[b].active = 0;
}
break;
case 1://
break;
}
}
}
//--------------------------------------------------------------------------------------
//自機用の弾と敵の当たり判定
//-------------------------------------------
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)//弾がないのに当たり判定させないため
{
for(int em = 0;em < ENEMY_MAX;em++)
{
if( enemy[em].active_te == 1 ) //敵が有効
{
if(bullets[b].gPos_tm.x >= enemy[em].gPos_te.x)
{
if(bullets[b].gPos_tm.x <= enemy[em].gPos_te.x + 70)//画像の中心部が初期設定になっているので半分の値を代入
{
if(bullets[b].gPos_tm.y >= enemy[em].gPos_te.y)
{
if(bullets[b].gPos_tm.y <= enemy[em].gPos_te.y + 35)//画像の中心部が初期設定になっているので半分の値を代入
{
//弾が当たったら、フラグをOFFにする
enemy[em].active_te = 0;
bullets[b].active = 0;
score += 150;//敵を倒すことが出来たら得点UP!
count_e++;//倒せたら1プラス
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵の再発生
//-------------------------------------------
for(int em = 0;em < ENEMY_MAX;em++)
{
if( enemy[em].active_te == 0 ) //敵が無効
{
enemy[em].active_te = 1;
if( enemy[em].type==0 )
{
enemy[em].gPos_te.x = -100;
}
else
{
enemy[em].gPos_te.x = 710;
}
}
}
//--------------------------------------------------------------------------------------
//敵の動き
//------------------------------------------
//敵の動き
for(int em = 0;em< ENEMY_MAX;em++)
{
if(enemy[em].active_te == 1)
{
if( enemy[em].type==0 )
{
enemy[em].gPos_te.x += ENEMY_SPEED;
if(enemy[em].gPos_te.x > 640)
{
enemy[em].gPos_te.x = -100;
}
}
else
{
enemy[em].gPos_te.x -= ENEMY_SPEED_B;
if(enemy[em].gPos_te.x < -70)
{
enemy[em].gPos_te.x = 680;
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 30;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 1)
{
switch(enemy_blt[em][eb].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
enemy_blt[em][eb].gPos.y += ENEMY_BLT_SPEED;//弾の座標を増やす
if(enemy_blt[em][eb].gPos.y > 640)
{
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y;
enemy_blt[em][eb].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用の弾と自機の当たり判定
//-----------------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、敵用の弾と自機を消す
if(enemy_blt[em][eb].gPos.x > myship[0].gPos.x + 5)
{
if(enemy_blt[em][eb].gPos.x < myship[0].gPos.x + 55)
{
if(enemy_blt[em][eb].gPos.y > myship[0].gPos.y + 15)
{
if(enemy_blt[em][eb].gPos.y < myship[0].gPos.y + 50)
{
enemy_blt[em][eb].active = 0;//敵用の弾を非表示
Life -= 5;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;
}
}
}
}
}
}
}
}
}
}
//敵の弾が自機に当たって自機が消えたら今までの弾も非表示
for(int eb = 0; eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(myship[0].active == 0 && enemy_blt[em][eb].active == 0)
{
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[b].active = 0;//弾を非表示
}
}
}
}
//--------------------------------------------------------------------------------------
//背景のスクロール
//---------------------------------------
//(これが無いとシューティングっぽくは見えないので、追加させる)
gPos_map.y++;
if(gPos_map.y >= 480)
{
gPos_map.y = -480;
}
gPos_map_a.y++;
if(gPos_map_a.y >= 480)
{
gPos_map_a.y = -480;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score > Hi_score)
{
Hi_score = score;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score >= 5000)//ある一定の得点を超えたらクリア画面にする
{
gamemode = 2;
}
//--------------------------------------------------------------------------------------
//マトリクスを作成
//---------------------------------------
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back,0,0,0);
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back_a,0,0,0);
// for文で弾の数だけまとめてMatrix計算する
for(int b = 0;b < BULLET_MAX; b++)
{
//<matrix用=弾>
//移動行列を作成
D3DXMatrixTranslation( &bullets[b].matrix,bullets[b].gPos_tm.x,bullets[b].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 em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy[em].matrix_te,enemy[em].gPos_te.x,enemy[em].gPos_te.y,0);
}
//敵の弾を敵弾の数だけ
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_blt[em][eb].matrix,enemy_blt[em][eb].gPos.x,enemy_blt[em][eb].gPos.y,0);
}
}
break;
case 2://【ゲームクリア画面】
if(gamemode == 2)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
}
}
//体力(ライフ)
Life = 50;
}
}
}
break;
case 3://【ゲームオーバー画面】
if(gamemode == 3)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].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));*/
//ハイスコア背面画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_sc;
SetRect(&rect_back_sc,0,0,270,100);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_sc);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_sc,&rect_back_sc,NULL,&gPos_sc,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));
//背景画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_a;
SetRect(&rect_back_a,0,0,640,480);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_a);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_a,&rect_back_a,NULL,&gPos_map_a,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 b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)
{
//弾
//テクスチャの表示領域
RECT rect_tex_ta;
SetRect(&rect_tex_ta,0,0,10,10);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&bullets[b].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 em = 0;em < ENEMY_MAX; em++)
{
if( enemy[em].active_te == 1)
{
//敵
//テクスチャの表示領域
RECT rect_tex_te;
SetRect(&rect_tex_te,0,0,70,35);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy[em].matrix_te);
//スプライトで2D描画=敵
pSprite->Draw( pText_teki,&rect_tex_te,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_teta;
SetRect(&rect_tex_teta,0,0,12,12);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_blt[em][eb].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_teta,&rect_tex_teta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
for(int ebs = 0;ebs < 10; ebs++)
{
if( enemy_boss[ebs].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_boss;
SetRect(&rect_tex_boss,0,0,100,140);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_boss[ebs].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_boss,&rect_tex_boss,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,180,0));
break;
case 1://【ゲーム画面】
//フォント
RECT rect_ef; //フォント位置を保持する構造体変数
SetRect ( &rect_ef,480,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("BREAK"), //表示文字列
-1, //表示文字数
&rect_ef, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//変数内容の表示
TCHAR str_e[255];
_stprintf(str_e,_T("%02d"),count_e);
RECT rect_e;
SetRect(&rect_e,590,30,640,480);
pFontc->DrawText(NULL,str_e,-1,&rect_e,NULL,D3DCOLOR_ARGB(255,0,180,0));
//----------------------
//得点(スコア)
//---------------
//フォント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_back_a);//背景
SAFE_RELEASE(pText_back_sc);//得点背景
SAFE_RELEASE(pText_boss);//中ボス
//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
#ifdef DXUTD3D9 /*新しいDXUT対応のため*/
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application
DXUTInit( true, true ); // Parse the command line and show msgboxes
DXUTSetHotkeyHandling( true, true, true ); // handle the default hotkeys
DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
DXUTCreateWindow( L"EmptyProject" );
DXUTCreateDevice( true, 640, 480 );
#else
// 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);
#endif
//スプライトの作成
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\\back.png"),&pText_back_a);//背景(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\shiro.png"),&pText_back_sc);//得点背景(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\teki01.png"),&pText_boss);//中ボス(画像)
//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 < MYSHIP;i++)
{
myship[i].gPos.x = 280;
myship[i].gPos.y = 420;
myship[i].active = 1;
}
//------------------------------------------------
//弾の構造体に関する処理
//-------------------------------
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[b].gPos_tm.x = 280;
bullets[b].gPos_tm.y = 430;
bullets[b].active = 0;
bullets[b].type = 0;
}
//------------------------------------------------
//敵の構造体に関する処理
//-------------------------------
enemy[0].gPos_te.x = -80;
enemy[0].gPos_te.y = 50;
enemy[0].active_te = 1;
enemy[1].shot_wait = 0;
enemy[0].type = 0;
enemy[1].gPos_te.x = 690;
enemy[1].gPos_te.y = 90;
enemy[1].active_te = 1;
enemy[1].shot_wait = 0;
enemy[1].type = 1;
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
enemy_blt[em][eb].active = 0;
enemy_blt[em][eb].type = 0;
}
}
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(int ebs = 0;ebs < ENEMY_BOSS;ebs++)
{
enemy_boss[ebs].gPos.x = 0;
enemy_boss[ebs].gPos.y = 0;
enemy_boss[ebs].active = 0;
enemy_boss[ebs].type = 0;
}
//--------------------------------------------------------------------------------------
//初期化
//-----------------------------
bullets[i].gPos_tm = D3DXVECTOR3(280,430,0);
score = 0;
Hi_score = 12500;
count_e = 0;
// Start the render loop
DXUTMainLoop();
// TODO: Perform any application-level cleanup here
return DXUTGetExitCode();
}
返事が来る前に出来てしまいました。
問題解決しました。
で、次の問題は、ボス的な存在を表示させて、シューティングで言うステージっぽいものを作ろうと考えているのですが・・・。
というよりも、ステージ風じゃないと変な感じがするので。
基本的な要素でもあるステージ風に近づけようと思い、
ボス的な画像を用意したのはいいのですが、肝心な画像の表示がうまくいかなくなり、結局、その処理を削除し、背景画像のスクロールに変更しました。
ある程度敵を倒したらボスが出てくるようにするにはどのようにしたらいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
STAR_HARUKIさんの考える「ステージっぽいもの」と言うのは具体的にどんな物なのでしょうか?STAR_HARUKI さんが書きました:で、次の問題は、ボス的な存在を表示させて、シューティングで言うステージっぽいものを作ろうと考えているのですが・・・。
というよりも、ステージ風じゃないと変な感じがするので。
基本的な要素でもあるステージ風に近づけようと思い、
ボス的な画像を用意したのはいいのですが、肝心な画像の表示がうまくいかなくなり、結局、その処理を削除し、背景画像のスクロールに変更しました。
ある程度敵を倒したらボスが出てくるようにするにはどのようにしたらいいですか?
これを具体的に説明してもらわないと私にはアドバイスしようがありません。
今言えるのは、ある程度敵を倒したらボスが出てくれば良いのであれば、敵の倒された処理の中で敵の倒された数をカウントして一定数に達したらボスの座標や生存フラグを有効にすれば良いのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
ステージ構成は、本当に単純ですが、softya(ソフト屋) さんが書きました: STAR_HARUKIさんの考える「ステージっぽいもの」と言うのは具体的にどんな物なのでしょう?
まずは、いわゆるザコ敵(と呼ばれる?)みたいな自機用の弾が1や2発で倒せる敵がある程度の条件(ステージに応じて変化する。例えば、ステージ1では10体。ステージ2では20体とか)になったら、ボスが出現してきて、ボスを倒せたらステージクリアーという基本的な構造です。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
前の質問と合わせて。
一応、ボス的な画像と一つだけ弾が発射出来るようになりました。
やはり、もう2つ弾を発射させる場合は、2つ新たに処理を加えないといけないのでしょうか?
//--------------------------------------------------------------------------------------
// 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 2 //敵の最大数
#define ENEMY_SPEED 3 //敵の動く最大速度
#define ENEMY_SPEED_B 4 //敵の動く最大速度パターンB
/*敵用の弾*/
#define ENEMY_BLT_MAX 20 //敵の弾の最大数
#define ENEMY_BLT_SPEED 6 //敵用弾の移動速度
/*中ボス*/
#define BOSS_MAX 1 //ボス最大数
#define BOSS_SPEED 3 //ボスの移動速度
#define BOSS_BLT_MAX 10 //ボスの弾の最大数
#define BOSS_BLT_SPEED 6 //ボスの移動速度
//--------------------------------------------------------------------------------------
//関数
//-------------------------------
int gamemode = 0;//ゲームモード管理変数『0:タイトル 1:ゲーム画面 2:ゲームクリア 3:ゲームオーバー』
int times = 60,ti = 0,te = 0,ts = 0;//制限時間管理用変数
int i;
int score;//得点
int Hi_score;//最高得点
int Life = 50;//体力
int count_e;//倒した敵の数
//--------------------------------------------------------------------------------------
//テクスチャ関数
//-------------------------------
LPDIRECT3DTEXTURE9 pTexture;//自機用
LPDIRECT3DTEXTURE9 pText_tama;//自弾用
LPDIRECT3DTEXTURE9 pText_teki;//敵用
LPDIRECT3DTEXTURE9 pText_teta;//敵弾用
LPDIRECT3DTEXTURE9 pText_icon;//アイテム用
LPDIRECT3DTEXTURE9 pText_back;//背景用
LPDIRECT3DTEXTURE9 pText_back_a;//背景用
LPDIRECT3DTEXTURE9 pText_back_sc;//得点背景用
LPDIRECT3DTEXTURE9 pText_boss;//中ボス
LPDIRECT3DTEXTURE9 pText_boss_ta;//中ボス用弾
//LPDIRECT3DTEXTURE9 pText_logo_a;//ロゴ001用
//LPDIRECT3DTEXTURE9 pText_life;//自機ライフ用
//スプライトの作成
LPD3DXSPRITE pSprite;
//--------------------------------------------------------------------------------------
//座標関数
//-------------------------------
D3DXVECTOR3 gPos_map = D3DXVECTOR3(0,0,0);//背景画像用の画像指定位置
D3DXVECTOR3 gPos_map_a = D3DXVECTOR3(0,-480,0);//背景画像用の画像指定位置
D3DXVECTOR3 gPos_sc = D3DXVECTOR3(384,-30,0);//背景画像用の画像指定位置
//D3DXVECTOR3 gPos_logo_a = D3DXVECTOR3(150,420,0);//ロゴ001画像用の画像指定位置
//--------------------------------------------------------------------------------------
//マトリクス
//-------------------------
D3DXMATRIX matrix_ji;//自機
D3DXMATRIX matrix_back;//背景
D3DXMATRIX matrix_back_a;//背景
D3DXMATRIX matrix_back_sc;//ハイスコア背景画像
//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 shot_wait;//発車待ち
int type;//敵の種類
D3DXMATRIX matrix_te;//敵の行列
};
_enemy enemy[ENEMY_MAX];//敵構造体の宣言
//---------------------------------------------
//敵の弾の構造体
//------------------
typedef struct _enemy_blt
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_enemy_blt enemy_blt[ENEMY_MAX][ENEMY_BLT_MAX];//弾構造体の宣言
//---------------------------------------------
//敵の弾の構造体 中ボス
//------------------
typedef struct _enemy_boss
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int shot_wait;//発車待ち
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_enemy_boss enemy_boss[BOSS_MAX];//弾構造体の宣言
//---------------------------------------------
//敵の弾の構造体
//------------------
typedef struct _boss_blt
{
D3DXVECTOR3 gPos;//敵用の画像指定位置
int active;//有効フラグ 0:OFF 1:ON
int type;//弾の種類
D3DXMATRIX matrix;//行列
};
_boss_blt boss_blt[BOSS_BLT_MAX][BOSS_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
//--------------------------------------------------------------------------------------
#ifdef DXUTD3D9 /*新しいDXUT対応のため*/
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
#else
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
#endif
{
// キー状態を調べる関数
keycheck( );
switch(gamemode)
{
case 0://【タイトル画面】
if(gamemode == 0)
{
if(KEY_S == PUSH)//Sキーが押されたら下記の処理を実行!
{
gamemode = 1;//タイトル画面からゲーム画面へ移動
}
}
//ハイスコア得点の背景画像
D3DXMatrixTranslation( &matrix_back_sc,0,0,0);
//<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_SPACE == PUSH)//スペースキーが押されたら
{
for (int b = 0; b < BULLET_MAX; b++)
{
if(bullets[b].active == 0)
{
bullets[b].active = 1;//弾の表示
//自機の中央に表示させる
bullets[b].gPos_tm.x = myship[0].gPos.x + 29;
bullets[b].gPos_tm.y = myship[0].gPos.y + 15;
break;//処理を抜け出す
}
}
}
//--------------------------------------------------------------------------------------
//自弾の移動
//----------------------------------
// for文で弾の数だけやる
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)//弾が有効
{
switch(bullets[b].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
bullets[b].gPos_tm.y -= BULLET_SPEED;//弾の座標を減らす
if(bullets[b].gPos_tm.y < 0)
{
bullets[b].gPos_tm.y = myship[0].gPos.y;
bullets[b].active = 0;
}
break;
case 1://
break;
}
}
}
//--------------------------------------------------------------------------------------
//自機用の弾と敵の当たり判定
//-------------------------------------------
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)//弾がないのに当たり判定させないため
{
for(int em = 0;em < ENEMY_MAX;em++)
{
if( enemy[em].active_te == 1 ) //敵が有効
{
if(bullets[b].gPos_tm.x >= enemy[em].gPos_te.x)
{
if(bullets[b].gPos_tm.x <= enemy[em].gPos_te.x + 70)//画像の中心部が初期設定になっているので半分の値を代入
{
if(bullets[b].gPos_tm.y >= enemy[em].gPos_te.y)
{
if(bullets[b].gPos_tm.y <= enemy[em].gPos_te.y + 35)//画像の中心部が初期設定になっているので半分の値を代入
{
//弾が当たったら、フラグをOFFにする
enemy[em].active_te = 0;
bullets[b].active = 0;
score += 150;//敵を倒すことが出来たら得点UP!
count_e++;//倒せたら1プラス
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵の再発生
//-------------------------------------------
for(int em = 0;em < ENEMY_MAX;em++)
{
if( enemy[em].active_te == 0 ) //敵が無効
{
enemy[em].active_te = 1;
if( enemy[em].type==0 )
{
enemy[em].gPos_te.x = -100;
}
else
{
enemy[em].gPos_te.x = 710;
}
}
}
//--------------------------------------------------------------------------------------
//敵の動き
//------------------------------------------
//敵の動き
for(int em = 0;em< ENEMY_MAX;em++)
{
if(enemy[em].active_te == 1)
{
if( enemy[em].type==0 )
{
enemy[em].gPos_te.x += ENEMY_SPEED;
if(enemy[em].gPos_te.x > 640)
{
enemy[em].gPos_te.x = -100;
}
}
else
{
enemy[em].gPos_te.x -= ENEMY_SPEED_B;
if(enemy[em].gPos_te.x < -70)
{
enemy[em].gPos_te.x = 680;
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 30;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 1)
{
switch(enemy_blt[em][eb].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
enemy_blt[em][eb].gPos.y += ENEMY_BLT_SPEED;//弾の座標を増やす
if(enemy_blt[em][eb].gPos.y > 640)
{
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y;
enemy_blt[em][eb].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用の弾と自機の当たり判定
//-----------------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、敵用の弾と自機を消す
if(enemy_blt[em][eb].gPos.x > myship[0].gPos.x + 5)
{
if(enemy_blt[em][eb].gPos.x < myship[0].gPos.x + 55)
{
if(enemy_blt[em][eb].gPos.y > myship[0].gPos.y + 15)
{
if(enemy_blt[em][eb].gPos.y < myship[0].gPos.y + 50)
{
enemy_blt[em][eb].active = 0;//敵用の弾を非表示
Life -= 5;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;
}
}
}
}
}
}
}
}
}
}
//敵の弾が自機に当たって自機が消えたら今までの弾も非表示
for(int eb = 0; eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(myship[0].active == 0 && enemy_blt[em][eb].active == 0)
{
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[b].active = 0;//弾を非表示
}
}
}
}
//--------------------------------------------------------------------------------------
//ボスの出現
//---------------------------------------
if(count_e >= 2)
{
for(int em = 0;em< ENEMY_MAX;em++)
{
enemy[em].active_te = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
enemy_blt[em][eb].active = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 1;
enemy_boss[bm].gPos.x = 260;
enemy_boss[bm].gPos.y = 5;
}
}
}
//--------------------------------------------------------------------------------------
//ボス用弾の発射
//-----------------------------------------
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if(enemy_boss[bm].active == 1)
{
// 弾の発射待ち?
if( enemy_boss[bm].shot_wait > 0 )
{
enemy_boss[bm].shot_wait--;//発射しない
}
else
{
for (int bb = 0; bb < BOSS_BLT_MAX; bb++)
{
if(boss_blt[bb][bm].active == 0)//無効な弾
{
boss_blt[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 15;
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 100;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 25;//発射を抑制するフレーム数
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if(enemy_boss[bm].active == 1)
{
for (int bb = 0; bb < BOSS_BLT_MAX; bb++)
{
if(boss_blt[bb][bm].active == 1)
{
switch(boss_blt[bb][bm].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
boss_blt[bb][bm].gPos.y += BOSS_BLT_SPEED;//弾の座標を増やす
if(boss_blt[bb][bm].gPos.y > 640)
{
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt[bb][bm].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 1;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//背景のスクロール
//---------------------------------------
//(これが無いとシューティングっぽくは見えないので、追加させる)
gPos_map.y++;
if(gPos_map.y >= 480)
{
gPos_map.y = -480;
}
gPos_map_a.y++;
if(gPos_map_a.y >= 480)
{
gPos_map_a.y = -480;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score > Hi_score)
{
Hi_score = score;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score >= 5000)//ある一定の得点を超えたらクリア画面にする
{
gamemode = 2;
}
//--------------------------------------------------------------------------------------
//マトリクスを作成
//---------------------------------------
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back,0,0,0);
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back_a,0,0,0);
// for文で弾の数だけまとめてMatrix計算する
for(int b = 0;b < BULLET_MAX; b++)
{
//<matrix用=弾>
//移動行列を作成
D3DXMatrixTranslation( &bullets[b].matrix,bullets[b].gPos_tm.x,bullets[b].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 em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy[em].matrix_te,enemy[em].gPos_te.x,enemy[em].gPos_te.y,0);
}
//敵の弾を敵弾の数だけ
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_blt[em][eb].matrix,enemy_blt[em][eb].gPos.x,enemy_blt[em][eb].gPos.y,0);
}
}
//ボス的な存在
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_boss[bm].matrix,enemy_boss[bm].gPos.x,enemy_boss[bm].gPos.y,0);
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt[bb][bm].matrix,boss_blt[bb][bm].gPos.x,boss_blt[bb][bm].gPos.y,0);
}
}
break;
case 2://【ゲームクリア画面】
if(gamemode == 2)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
}
}
//体力(ライフ)
Life = 50;
}
}
}
break;
case 3://【ゲームオーバー画面】
if(gamemode == 3)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].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));*/
//ハイスコア背面画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_sc;
SetRect(&rect_back_sc,0,0,270,100);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_sc);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_sc,&rect_back_sc,NULL,&gPos_sc,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));
//背景画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_a;
SetRect(&rect_back_a,0,0,640,480);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_a);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_a,&rect_back_a,NULL,&gPos_map_a,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 b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)
{
//弾
//テクスチャの表示領域
RECT rect_tex_ta;
SetRect(&rect_tex_ta,0,0,10,10);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&bullets[b].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 em = 0;em < ENEMY_MAX; em++)
{
if( enemy[em].active_te == 1)
{
//敵
//テクスチャの表示領域
RECT rect_tex_te;
SetRect(&rect_tex_te,0,0,70,35);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy[em].matrix_te);
//スプライトで2D描画=敵
pSprite->Draw( pText_teki,&rect_tex_te,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_teta;
SetRect(&rect_tex_teta,0,0,12,12);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_blt[em][eb].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_teta,&rect_tex_teta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( enemy_boss[bm].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_boss;
SetRect(&rect_tex_boss,0,0,100,150);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_boss[bm].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_boss,&rect_tex_boss,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt[bb][bm].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_boss_ta;
SetRect(&rect_boss_ta,0,0,11,21);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt[bb][bm].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_boss_ta,&rect_boss_ta,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,180,0));
break;
case 1://【ゲーム画面】
//フォント
RECT rect_ef; //フォント位置を保持する構造体変数
SetRect ( &rect_ef,480,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("BREAK"), //表示文字列
-1, //表示文字数
&rect_ef, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//変数内容の表示
TCHAR str_e[255];
_stprintf(str_e,_T("%02d"),count_e);
RECT rect_e;
SetRect(&rect_e,590,30,640,480);
pFontc->DrawText(NULL,str_e,-1,&rect_e,NULL,D3DCOLOR_ARGB(255,0,180,0));
//----------------------
//得点(スコア)
//---------------
//フォント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_back_a);//背景
SAFE_RELEASE(pText_back_sc);//得点背景
SAFE_RELEASE(pText_boss);//中ボス
SAFE_RELEASE(pText_boss_ta);//中ボス
//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
#ifdef DXUTD3D9 /*新しいDXUT対応のため*/
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application
DXUTInit( true, true ); // Parse the command line and show msgboxes
DXUTSetHotkeyHandling( true, true, true ); // handle the default hotkeys
DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
DXUTCreateWindow( L"EmptyProject" );
DXUTCreateDevice( true, 640, 480 );
#else
// 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"HUNTER(仮)" );
DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480);
#endif
//スプライトの作成
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\\back.png"),&pText_back_a);//背景(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\shiro.png"),&pText_back_sc);//得点背景(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\teki01.png"),&pText_boss);//中ボス(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\tama002.png"),&pText_boss_ta);//中ボス用弾(画像)
//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 < MYSHIP;i++)
{
myship[i].gPos.x = 280;
myship[i].gPos.y = 420;
myship[i].active = 1;
}
//------------------------------------------------
//弾の構造体に関する処理
//-------------------------------
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[b].gPos_tm.x = 280;
bullets[b].gPos_tm.y = 430;
bullets[b].active = 0;
bullets[b].type = 0;
}
//------------------------------------------------
//敵の構造体に関する処理
//-------------------------------
enemy[0].gPos_te.x = -80;
enemy[0].gPos_te.y = 50;
enemy[0].active_te = 1;
enemy[1].shot_wait = 0;
enemy[0].type = 0;
enemy[1].gPos_te.x = 690;
enemy[1].gPos_te.y = 90;
enemy[1].active_te = 1;
enemy[1].shot_wait = 0;
enemy[1].type = 1;
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
enemy_blt[em][eb].active = 0;
enemy_blt[em][eb].type = 0;
}
}
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].gPos.x = 0;
enemy_boss[bm].gPos.y = 0;
enemy_boss[bm].shot_wait = 0;
enemy_boss[bm].active = 0;
enemy_boss[bm].type = 0;
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].gPos.x = 0;
boss_blt[bb][bm].gPos.y = 0;
boss_blt[bb][bm].active = 0;
boss_blt[bb][bm].type = 0;
}
}
//--------------------------------------------------------------------------------------
//初期化
//-----------------------------
bullets[i].gPos_tm = D3DXVECTOR3(280,430,0);
score = 0;
Hi_score = 12500;
count_e = 0;
// Start the render loop
DXUTMainLoop();
// TODO: Perform any application-level cleanup here
return DXUTGetExitCode();
}
やはり、もう2つ弾を発射させる場合は、2つ新たに処理を加えないといけないのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
前の質問とは何の事でしょうか?STAR_HARUKI さんが書きました:前の質問と合わせて。
もう2つ弾とは、ボスが何らかの状況で出す弾のことでしょうか?STAR_HARUKIさんの頭の中にはイメージがあるみたいですが言わないと伝わらない事なんですね。STAR_HARUKI さんが書きました:一応、ボス的な画像と一つだけ弾が発射出来るようになりました。
やはり、もう2つ弾を発射させる場合は、2つ新たに処理を加えないといけないのでしょうか?
弾の正確な仕様を明らかにしてください。発射タイミング・発射パターン・生存条件・弾の移動パターンなどわからない事だらけなので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
⇒確認したら、スクロールのことでした。⇒自分なりに解決したので、勘違いでした。softya(ソフト屋) さんが書きました: 前の質問
ごめんなさい。softya(ソフト屋) さんが書きました: もう2つ弾とは、ボスが何らかの状況で出す弾のことでしょうか?STAR_HARUKIさんの頭の中にはイメージがあるみたいですが言わないと伝わらない事なんですね。
弾の正確な仕様を明らかにしてください。発射タイミング・発射パターン・生存条件・弾の移動パターンなどわからない事だらけなので。
下記にまとめ。
発射タイミング⇒ボスが出現したら、画像には3か所発射出来そうな画像なので、左右には四角い形の弾を、真ん中には丸い弾を表示したいと考えています。タイミングは真ん中は一定時間が経過したら弾を表示。
発射パターン⇒真ん中から出る弾は放射線状。
生存条件⇒ボスは体力があって自機の弾が当たると-1。ボスの体力は20~30程度。
弾の移動パターン⇒一直線。
- 添付ファイル
-
- ボスの画像です(大きさは2乗の比率に設定)。
- teki01.png (26.14 KiB) 閲覧数: 11231 回
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
まだ、情報として不足しています。STAR_HARUKI さんが書きました:発射タイミング⇒ボスが出現したら、画像には3か所発射出来そうな画像なので、左右には四角い形の弾を、真ん中には丸い弾を表示したいと考えています。タイミングは真ん中は一定時間が経過したら弾を表示。
発射パターン⇒真ん中から出る弾は放射線状。
生存条件⇒ボスは体力があって自機の弾が当たると-1。ボスの体力は20~30程度。
弾の移動パターン⇒一直線。
真ん中は放射状に弾を発射するそうですが、何度置きの角度で同時に何発の弾を発射するのでしょうか?
例えば、5度置きで360度の方位に発射すると同時に72個の弾が発生します。
それと、その発射周期(フレーム数)です。これで画面に同時存在しうる弾の数を計算しなくてはいけません。
これを検討してみてください。
で、時間がもったいないので、とりあえず同時に左右真ん中の弾を真下に発射するプログラムを組んでみてください。
弾の種類は弾のtypeが折角あるので、これを使って下さいね。
[ヒント] ループで3回す。 発射位置やtypeはループ番号で変更する。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
ループをするには、for分でした方がいいですか?
たぶん、僕が悪いんですけど、左の弾しか速くなってしまい、
3つの場所に設定しても真ん中と右は出なくて・・・・・・。
もう少しヒント、お願いできませんか?
たぶん、僕が悪いんですけど、左の弾しか速くなってしまい、
3つの場所に設定しても真ん中と右は出なくて・・・・・・。
もう少しヒント、お願いできませんか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
1.forループが必要なのは、弾の発射の時だけです。STAR_HARUKI さんが書きました:ループをするには、for分でした方がいいですか?
たぶん、僕が悪いんですけど、左の弾しか速くなってしまい、
3つの場所に設定しても真ん中と右は出なくて・・・・・・。
もう少しヒント、お願いできませんか?
2.ちゃんと動作しているか、デバッガで確認して下さい。
※ 目的のコードの位置の通過と適切な値が代入されているか、下記の方法で確認します。
http://cvwww.ee.ous.ac.jp/vc08prog.html#6
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
やっぱり弾を複数表示はやめました。
一つ表示する方向で進みたいと思います。
一応5月30日まで2週間しないので、
ゲームとして完成するようにします。
一つ表示する方向で進みたいと思います。
一応5月30日まで2週間しないので、
ゲームとして完成するようにします。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
敵を倒したら、宝っぽいアイテムを落とすようにしたいのですが、
どうやってプログラムしたらいいでしょうか?
if分やfor、switch、whileなどで出来るのでしょうか?
どうやってプログラムしたらいいでしょうか?
if分やfor、switch、whileなどで出来るのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
弾の発射と同じです。敵が死んだ時に発射する弾がアイテムだと思ってもらえば良いです。STAR_HARUKI さんが書きました:敵を倒したら、宝っぽいアイテムを落とすようにしたいのですが、
どうやってプログラムしたらいいでしょうか?
if分やfor、switch、whileなどで出来るのでしょうか?
弾と違いアイテムが自機と衝突した場合はダメージではなく、何かの効果を自機にもたらします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
case 1://【ゲーム画面】
switch(Stage_S)
{
case 1://
//--------------------------------------------------------------------------------------
//自機用の弾とボスの当たり判定
//-------------------------------------------
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets.active == 1)//弾がないのに当たり判定させないため
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
if( enemy_boss[bm].active == 1 ) //敵が有効
{
if(bullets.gPos_tm.x >= enemy_boss[bm].gPos.x + 12)
{
if(bullets.gPos_tm.x <= enemy_boss[bm].gPos.x + 90)
{
if(bullets.gPos_tm.y >= enemy_boss[bm].gPos.y + 28)
{
if(bullets.gPos_tm.y <= enemy_boss[bm].gPos.y + 105)
{
Boss_L -= 1;
bullets.active = 0;
score += 15;//敵を倒すことが出来たら得点UP!
if(Boss_L <= 0)
{
//弾が当たったら、フラグをOFFにする
enemy_boss[bm].active = 0;
gamemode = 4;//ステージクリア画面に移動!
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵の再発生
//-------------------------------------------
for(int em = 0;em < ENEMY_MAX;em++)
{
if( enemy[em].active_te == 0 ) //敵が無効
{
enemy[em].active_te = 1;
if( enemy[em].type == 0 )
{
enemy[em].gPos_te.x = -100;
}
else
{
enemy[em].gPos_te.x = 710;
}
}
}
//--------------------------------------------------------------------------------------
//敵の動き
//------------------------------------------
//敵の動き
for(int em = 0;em< ENEMY_MAX;em++)
{
if(enemy[em].active_te == 1)
{
if( enemy[em].type==0 )
{
enemy[em].gPos_te.x += ENEMY_SPEED;
if(enemy[em].gPos_te.x > 640)
{
enemy[em].gPos_te.x = -100;
}
}
else
{
enemy[em].gPos_te.x -= ENEMY_SPEED_B;
if(enemy[em].gPos_te.x < -70)
{
enemy[em].gPos_te.x = 680;
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 30;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
//////////////////////////
//ステージ2
if(Stage == 2)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1 || enemy[em + 1].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
enemy_blt[em][eb + 1].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 15;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
enemy_blt[em][eb + 1].gPos.x = enemy[em].gPos_te.x + 45;
enemy_blt[em][eb + 1].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
}
//////////////////////////
//ステージ3以降
if(Stage >= 3)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1 || enemy[em + 1].active_te == 1 || enemy[em + 2].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
enemy_blt[em][eb + 1].active = 1;//弾の表示
enemy_blt[em][eb + 2].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 10;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
enemy_blt[em][eb + 1].gPos.x = enemy[em].gPos_te.x + 40;
enemy_blt[em][eb + 1].gPos.y = enemy[em].gPos_te.y + 20;
enemy_blt[em][eb + 2].gPos.x = enemy[em].gPos_te.x + 70;
enemy_blt[em][eb + 2].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 1)
{
switch(enemy_blt[em][eb].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
enemy_blt[em][eb].gPos.y += ENEMY_BLT_SPEED;//弾の座標を増やす
if(enemy_blt[em][eb].gPos.y > 640)
{
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y;
enemy_blt[em][eb].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用の弾と自機の当たり判定
//-----------------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、敵用の弾と自機を消す
if(enemy_blt[em][eb].gPos.x > myship[0].gPos.x + 5)
{
if(enemy_blt[em][eb].gPos.x < myship[0].gPos.x + 55)
{
if(enemy_blt[em][eb].gPos.y > myship[0].gPos.y + 15)
{
if(enemy_blt[em][eb].gPos.y < myship[0].gPos.y + 50)
{
enemy_blt[em][eb].active = 0;//敵用の弾を非表示
Life -= 2;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;
}
}
}
}
}
}
}
}
}
}
//敵の弾が自機に当たって自機が消えたら今までの弾も非表示
for(int eb = 0; eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(myship[0].active == 0 && enemy_blt[em][eb].active == 0)
{
for(int b = 0;b < BULLET_MAX;b++)
{
bullets.active = 0;//弾を非表示
}
}
}
}
//--------------------------------------------------------------------------------------
//ボスの出現
//---------------------------------------
if(count_e >= Stage * 4)
{
for(int em = 0;em< ENEMY_MAX;em++)
{
enemy[em].active_te = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
enemy_blt[em][eb].active = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 1;
enemy_boss[bm].type = 0;
}
}
}
//ボスの移動処理
for(int bm = 0;bm < BOSS_MAX;bm++)
{
if(enemy_boss[bm].active == 1)
{
//一定値をマイナスし、座標を移動させる。
enemy_boss[bm].gPos.x -= BOSS_SPEED;
if(enemy_boss[bm].gPos.x <= -100)
{
//画面外に出たら、右の位置に戻してあげる(画像の大きさに合わせて少し多め)
enemy_boss[bm].gPos.x = 700;
}
}
}
//--------------------------------------------------------------------------------------
//ボス用弾の発射
//-----------------------------------------
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if(enemy_boss[bm].active == 1)
{
// 弾の発射待ち?
if( enemy_boss[bm].shot_wait > 0 )
{
enemy_boss[bm].shot_wait--;//発射しない
}
else
{
for (int bb = 0; bb < BOSS_BLT_MAX; bb++)
{
if(boss_blt[bb][bm].active == 0)//無効な弾
{
boss_blt[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 45;
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 130;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 20;//発射を抑制するフレーム数
break;
}
if(boss_blt2[bb][bm].active == 0)//無効な弾
{
boss_blt2[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt2[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 15;
boss_blt2[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 110;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 20;//発射を抑制するフレーム数
break;
}
if(boss_blt3[bb][bm].active == 0)//無効な弾
{
boss_blt3[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt3[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 75;
boss_blt3[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 110;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if(enemy_boss[bm].active == 1)
{
for (int bb = 0; bb < BOSS_BLT_MAX; bb++)
{
if(boss_blt[bb][bm].active == 1)
{
switch(boss_blt[bb][bm].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
boss_blt[bb][bm].gPos.y += BOSS_BLT_SPEED + Stage;//弾の座標を増やす
if(boss_blt[bb][bm].gPos.y > 640)
{
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt[bb][bm].active = 0;
}
// 弾の座標はbullet構造体の中に入れる
boss_blt2[bb][bm].gPos.y += BOSS_BLT_B_SPEED;//弾の座標を増やす
if(boss_blt2[bb][bm].gPos.y > 640)
{
boss_blt2[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt2[bb][bm].active = 0;
}
// 弾の座標はbullet構造体の中に入れる
boss_blt3[bb][bm].gPos.y += BOSS_BLT_C_SPEED;//弾の座標を増やす
if(boss_blt3[bb][bm].gPos.y > 640)
{
boss_blt3[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt3[bb][bm].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 4;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt2[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt2[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt2[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt2[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt2[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt2[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 2;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt3[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt3[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt3[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt3[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt3[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt3[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 1;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//お宝、出現条件処理
//--------------------------------------
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
for(int em = 0;em < ENEMY_MAX;em++)
{
if(takara2[tm][tb].active == 1)//無効な弾
{
//takara2[tm][tb].active = 1;//弾の表示
//敵の中央に表示させる
takara2[tm][tb].gPos.x = enemy[em].gPos_te.x + 25;
//takara2[tm][tb].gPos.y = enemy[em].gPos_te.y + 20;
//takara2[tm][tb].active = 0;
}
}
}
}
//--------------------------------------------------------------------------------------
//お宝落下移動
//----------------------------------
// for文で弾の数だけやる
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
if(takara2[tm][tb].active == 1)//弾が有効
{
switch(takara2[tm][tb].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
takara2[tm][tb].gPos.y += TKR_SPEED;//弾の座標を減らす
takara2[tm][tb].gPos.x;//弾の座標を減らす
if(takara2[tm][tb].gPos.y > 640)
{
takara2[tm][tb].active = 0;
}
break;
case 1://
break;
}
}
}
}
//--------------------------------------------------------------------------------------
//宝と自機の当たり判定
//-----------------------------------------
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
if( takara2[tm][tb].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、敵用の弾と自機を消す
if(takara2[tm][tb].gPos.x > myship[0].gPos.x + 5)
{
if(takara2[tm][tb].gPos.x < myship[0].gPos.x + 55)
{
if(takara2[tm][tb].gPos.y > myship[0].gPos.y + 15)
{
if(takara2[tm][tb].gPos.y < myship[0].gPos.y + 50)
{
takara2[tm][tb].active = 0;//敵用の弾を非表示
count_T += 1;//お宝の数をカウント+1
}
}
}
}
}
}
}
}
}
/*if(gamemode == 4)
{
for(int tm = 0;tm < TAKARA_MAX;tm++)
{
if(Life >= 40)
{
switch(takara[tm].type)
{
case 0://
takara[tm].active = 1;
takara2[tm].active = 1;
break;
}
}
if(Life < 40 && Life > 30)
{
switch(takara[tm].type)
{
case 0://
takara[tm].active = 1;
break;
}
}
if(Life <= 29)
{
switch(takara[tm].type)
{
case 0://
takara[tm].active = 1;
break;
}
}
}
}*/
//--------------------------------------------------------------------------------------
//背景のスクロール
//---------------------------------------
//(これが無いとシューティングっぽくは見えないので、追加させる)
gPos_map.y++;
if(gPos_map.y >= 480)
{
gPos_map.y = -480;
}
gPos_map_a.y++;
if(gPos_map_a.y >= 480)
{
gPos_map_a.y = -480;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score > Hi_score)
{
Hi_score = score;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
/*if(score >= 2000)//ある一定の得点を超えたらクリア画面にする
{
gamemode = 2;
}*/
//--------------------------------------------------------------------------------------
//ゲームクリア判定
//---------------------------------------
if(Stage >= 4 && gamemode == 4)
{
gamemode = 2;
}
//--------------------------------------------------------------------------------------
//マトリクスを作成
//---------------------------------------
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back,0,0,0);
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back_a,0,0,0);
//宝
for(int tm = 0;tm < TAKARA_MAX;tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX; tb++)
{
if(takara2[tm][tb].active == 1)
{
//移動行列を作成
D3DXMatrixTranslation( &takara2[tm][tb].matrix,takara2[tm][tb].gPos.x,takara2[tm][tb].gPos.y,0);
}
}
}
// for文で弾の数だけまとめてMatrix計算する
for(int b = 0;b < BULLET_MAX; b++)
{
//<matrix用=弾>
//移動行列を作成
D3DXMatrixTranslation( &bullets.matrix,bullets.gPos_tm.x,bullets.gPos_tm.y,0);
}
for(int i = 0;i < MYSHIP;i++)
{
//<matrix_ji用=自機>
//移動行列を作成
D3DXMatrixTranslation( &myship.matrix,myship.gPos.x,myship.gPos.y,0);
}
for(int em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy[em].matrix_te,enemy[em].gPos_te.x,enemy[em].gPos_te.y,0);
}
//敵の弾を敵弾の数だけ
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_blt[em][eb].matrix,enemy_blt[em][eb].gPos.x,enemy_blt[em][eb].gPos.y,0);
}
}
//ボス的な存在
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_boss[bm].matrix,enemy_boss[bm].gPos.x,enemy_boss[bm].gPos.y,0);
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt[bb][bm].matrix,boss_blt[bb][bm].gPos.x,boss_blt[bb][bm].gPos.y,0);
}
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt2[bb][bm].matrix,boss_blt2[bb][bm].gPos.x,boss_blt2[bb][bm].gPos.y,0);
}
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt3[bb][bm].matrix,boss_blt3[bb][bm].gPos.x,boss_blt3[bb][bm].gPos.y,0);
}
}
}
break;
case 2://【ゲームクリア画面】
if(gamemode == 2)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[em].active = 0;
}
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].active = 0;
boss_blt2[bb][bm].active = 0;
boss_blt3[bb][bm].active = 0;
}
}
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 0;
}
//体力(ライフ)
Life = 50;
Boss_L = 20;
gPos_map.x = 0;
gPos_map.y = 0;
gPos_map_a.x = 0;
gPos_map_a.y = -480;
count_e = 0;
score = 0;
}
}
}
break;
case 3://【ゲームオーバー画面】
if(gamemode == 3)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[em].active = 0;
}
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].active = 0;
boss_blt2[bb][bm].active = 0;
boss_blt3[bb][bm].active = 0;
}
}
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 0;
}
//体力(ライフ)
Life = 50;
Boss_L = 20;
gPos_map.x = 0;
gPos_map.y = 0;
gPos_map_a.x = 0;
gPos_map_a.y = -480;
count_e = 0;
score = 0;
}
}
}
break;
case 4://【ステージクリア画面】
if(gamemode == 4)
{
//宝
/*for(int tm = 0;tm < TAKARA_MAX; tm++)
{
switch(takara[tm].type)
{
case 0://
//移動行列を作成
D3DXMatrixTranslation( &takara[tm].matrix,430,380,0);
//移動行列を作成
D3DXMatrixTranslation( &takara2[tm].matrix,470,380,0);
break;
case 1://
//移動行列を作成
D3DXMatrixTranslation( &takara[tm].matrix,450,380,0);
break;
case 2://
//移動行列を作成
D3DXMatrixTranslation( &takara[tm].matrix,takara[tm].gPos.x,takara[tm].gPos.y,0);
break;
}
}*/
if(KEY_RETURN == PUSH)
{
//ネクスト画面に移動
gamemode = 5;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[em].active = 0;
}
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].active = 0;
boss_blt2[bb][bm].active = 0;
boss_blt3[bb][bm].active = 0;
}
}
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 0;
}
}
}
break;
case 5://
if(KEY_RETURN == PUSH)
{
//ゲーム画面に移動
gamemode = 1;
//ステージクリアのため初期化設定ではスコアは除く。
Life = 50 + (Stage * 10);//ライフを回復+ステージクリアボーナスとして一定数値増加
Boss_L = 20;//ボスの体力
gPos_map.x = 0;
gPos_map.y = 0;
gPos_map_a.x = 0;
gPos_map_a.y = -480;
Stage += 1;//ステージ数増加
}
break;
case 6://
break;
case 7://
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://【タイトル画面】
//タイトル画像
//テクスチャの表示領域
RECT rect_title_back;
SetRect(&rect_title_back,0,0,512,256);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_title_back);
//スプライトで2D描画=背景
pSprite->Draw( pText_title_back,&rect_title_back,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
//タイトル画像
//テクスチャの表示領域
RECT rect_title;
SetRect(&rect_title,0,0,355,215);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_title);
//スプライトで2D描画=背景
pSprite->Draw( pText_title,&rect_title,NULL,&gPos_title,D3DCOLOR_ARGB(255,255,255,255));
/*//ロゴ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));*/
//ハイスコア背面画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_sc;
SetRect(&rect_back_sc,0,0,270,100);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_sc);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_sc,&rect_back_sc,NULL,&gPos_sc,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));
//背景画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_a;
SetRect(&rect_back_a,0,0,640,480);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_a);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_a,&rect_back_a,NULL,&gPos_map_a,D3DCOLOR_ARGB(255,255,255,255));
////////////////////////////////////////////
//自機用
for(int i = 0;i < MYSHIP;i++)
{
if(myship.active == 1)
{
//自機
//テクスチャの表示領域
RECT rect_tex;
SetRect(&rect_tex,0,0,60,60);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&myship.matrix);
//スプライトで2D描画=自機
pSprite->Draw( pTexture,&rect_tex,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
////////////////////////////////////////////
//自機用の弾
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)
{
//弾
//テクスチャの表示領域
RECT rect_tex_ta;
SetRect(&rect_tex_ta,0,0,10,10);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&bullets[b].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 em = 0;em < ENEMY_MAX; em++)
{
if( enemy[em].active_te == 1)
{
//敵
//テクスチャの表示領域
RECT rect_tex_te;
SetRect(&rect_tex_te,0,0,70,35);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy[em].matrix_te);
//スプライトで2D描画=敵
pSprite->Draw( pText_teki,&rect_tex_te,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
////////////////////////////////////////////
//敵用の弾 3
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_teta;
SetRect(&rect_tex_teta,0,0,12,12);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_blt[em][eb].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_teta,&rect_tex_teta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
////////////////////////////////////////////
//ボス用
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( enemy_boss[bm].active == 1)
{
//ボス用
//テクスチャの表示領域
RECT rect_tex_boss;
SetRect(&rect_tex_boss,0,0,100,150);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_boss[bm].matrix);
//スプライトで2D描画=ボス
pSprite->Draw( pText_boss,&rect_tex_boss,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
////////////////////////////////////////////
//ボス用の弾 1
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt[bb][bm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_boss_ta;
SetRect(&rect_boss_ta,0,0,12,22);/*(14,14)*/
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt[bb][bm].matrix);
//スプライトで2D描画=ボス弾
pSprite->Draw( pText_boss_ta,&rect_boss_ta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
////////////////////////////////////////////
//ボス用の弾 2
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt2[bb][bm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_boss_ta2;
SetRect(&rect_boss_ta2,0,0,12,22);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt2[bb][bm].matrix);
//スプライトで2D描画=ボス弾2
pSprite->Draw( pText_boss_ta2,&rect_boss_ta2,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
////////////////////////////////////////////
//ボス用の弾 3
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt3[bb][bm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_boss_ta2;
SetRect(&rect_boss_ta2,0,0,12,22);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt3[bb][bm].matrix);
//スプライトで2D描画=ボス弾3
pSprite->Draw( pText_boss_ta2,&rect_boss_ta2,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
//アイテム
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX; tb++)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,36,27);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara2[tm][tb].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara1,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
break;
case 2://【ゲームクリア画面】
break;
case 3://【ゲームオーバー画面】
break;
case 4://【ステージクリア画面】
//アイテム
/*for(int tm = 0;tm < TAKARA_MAX; tm++)
{
switch(takara[tm].type)
{
case 0://
if( takara[tm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,36,27);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara[tm].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara1,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
//ボス用の弾
//テクスチャの表示領域
//RECT rect_takara1;
SetRect(&rect_takara1,0,0,36,27);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara2[tm][tb].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara1,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
break;
case 1://
if( takara[tm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,19,19);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara[tm].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara2,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
break;
case 2://
if( takara[tm].active == 1)
{
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,18,13);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara[tm].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara3,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
break;
}
}*/
break;
case 5://【ネクストステージ画面】
break;
}
//スプライトの終了
pSprite->End();
switch(gamemode)
{
case 0://【タイトル画面】
//========================================
//各フォント
//========================================
/*//フォント1
RECT rectf; //フォント位置を保持する構造体変数
SetRect ( &rectf,10,100,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ここにタイトル画面が入ります!!"),//表示文字列
-1, //表示文字数
&rectf, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色*/
//フォント1
RECT rectq; //フォント位置を保持する構造体変数
SetRect ( &rectq,120,380,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔S〕キーで GAME START!!"), //表示文字列
-1, //表示文字数
&rectq, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,0)); //表示色
//フォント1
RECT recti; //フォント位置を保持する構造体変数
SetRect ( &recti,10,250,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("操作方法\n〔↑↓→←〕キーで自機の移動\n〔SPACE〕キーで弾が発射出来ます。\nあとは、敵の弾を交わしながら、ステージを進むだけ(^^♪"), //表示文字列
-1, //表示文字数
&recti, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,0,0,0)); //表示色
/*//フォント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,0,0,0)); //表示色
//変数内容の表示
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,180,0));
break;
case 1://【ゲーム画面】
if(enemy_boss[0].active == 0)
{
//フォント
RECT rect_ef; //フォント位置を保持する構造体変数
SetRect ( &rect_ef,480,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("BREAK"), //表示文字列
-1, //表示文字数
&rect_ef, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//変数内容の表示
TCHAR str_e[255];
_stprintf(str_e,_T("%02d"),count_e);
RECT rect_e;
SetRect(&rect_e,590,27,640,480);
pFontc->DrawText(NULL,str_e,-1,&rect_e,NULL,D3DCOLOR_ARGB(255,0,180,0));
}
//----------------------
//得点(スコア)
//---------------
//フォント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));
/*==========現在のStage数==========*/
//フォント1
RECT rect_st; //フォント位置を保持する構造体変数
SetRect ( &rect_st,10,2,640,480); //変数への位置セット
//フォントの描画
pFontb -> DrawText(NULL, //標準機能で描画
_T("STAGE"), //表示文字列
-1, //表示文字数
&rect_st, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,0)); //表示
//フォント1
//変数内容の表示
TCHAR str_st[255];
_stprintf(str_st,_T("%02d"),Stage);
RECT rect_st1;
SetRect(&rect_st1,100,0,640,480);
pFontd->DrawText(NULL,str_st,-1,&rect_st1,NULL,D3DCOLOR_ARGB(255,0,255,100));
/*==========自機用のライフ==========*/
//フォント1
RECT rect; //フォント位置を保持する構造体変数
SetRect ( &rect,10,28,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("HP"), //表示文字列
-1, //表示文字数
&rect, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示
//フォント1
//変数内容の表示
TCHAR str_la[255];
_stprintf(str_la,_T("%04d"),Life);
RECT rect_la;
SetRect(&rect_la,60,28,640,480);
pFont->DrawText(NULL,str_la,-1,&rect_la,NULL,D3DCOLOR_ARGB(255,0,255,255));
/*==========ボス用のライフ==========*/
if(enemy_boss[0].active == 1)
{
//フォント1
RECT rect_b; //フォント位置を保持する構造体変数
SetRect ( &rect_b,510,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("LIFE"), //表示文字列
-1, //表示文字数
&rect_b, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示
//フォント1
//変数内容の表示
TCHAR str_b[255];
_stprintf(str_b,_T("%02d"),Boss_L);
RECT rect_bf;
SetRect(&rect_bf,590,26,640,480);
pFonta->DrawText(NULL,str_b,-1,&rect_bf,NULL,D3DCOLOR_ARGB(255,255,100,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://【ステージクリア画面】
//フォント1
//変数内容の表示
TCHAR str_sta[255];
_stprintf(str_sta,_T("STAGE %d CLEAR"),Stage);
RECT rect_sta;
SetRect(&rect_sta,190,215,640,480);
pFonta->DrawText(NULL,str_sta,-1,&rect_sta,NULL,D3DCOLOR_ARGB(255,255,255,0));
//フォント
//RECT recten; //フォント位置を保持する構造体変数
SetRect ( &recten,10,80,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔Enter←〕でタイトル画面に!"), //表示文字列
-1, //表示文字数
&recten, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
break;
case 5://【ネクストステージ画面】
//フォント1
//変数内容の表示
TCHAR str_nex[255];
_stprintf(str_nex,_T("NEXT… STAGE %d"),Stage);
RECT rect_nex;
SetRect(&rect_nex,100,80,640,480);
pFonta->DrawText(NULL,str_nex,-1,&rect_nex,NULL,D3DCOLOR_ARGB(255,0,0,255));
//フォント
RECT rectlc; //フォント位置を保持する構造体変数
SetRect ( &rectlc,150,180,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ライフ全回復♪\nCLEAR BONUS ライフ最大値UP!!"), //表示文字列
-1, //表示文字数
&rectlc, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,0)); //表示色
//フォント
//RECT recten; //フォント位置を保持する構造体変数
SetRect ( &recten,150,230,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔Enter←〕PUSH GO!!"), //表示文字列
-1, //表示文字数
&recten, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,0)); //表示色
break;
case 6://
break;
case 7://
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 )
{
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\dia01.png"),&pText_takara1);//宝箱(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\icon01.png"),&pText_takara2);//宝箱(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\"),&pText_takara3);//宝箱(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\title0-4-1.png"),&pText_title);//タイトル(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\title-back.png"),&pText_title_back);//タイトル(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\tama011.png"),&pText_boss_tam);//中ボス用弾2(画像)
//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 < MYSHIP;i++)
{
myship.gPos.x = 280;
myship.gPos.y = 420;
myship.active = 1;
}
//------------------------------------------------
//弾の構造体に関する処理
//-------------------------------
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[b].gPos_tm.x = 280;
bullets[b].gPos_tm.y = 430;
bullets[b].active = 0;
bullets[b].type = 0;
}
//------------------------------------------------
//敵の構造体に関する処理
//-------------------------------
enemy[0].gPos_te.x = -80;
enemy[0].gPos_te.y = 50;
enemy[0].active_te = 1;
enemy[1].shot_wait = 0;
enemy[0].type = 0;
enemy[1].gPos_te.x = 690;
enemy[1].gPos_te.y = 90;
enemy[1].active_te = 1;
enemy[1].shot_wait = 0;
enemy[1].type = 1;
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
enemy_blt[em][eb].active = 0;
enemy_blt[em][eb].type = 0;
}
}
//------------------------------------------------
//ボスに関する処理
//-------------------------------
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].gPos.x = 260;
enemy_boss[bm].gPos.y = 5;
enemy_boss[bm].shot_wait = 0;
enemy_boss[bm].active = 0;
enemy_boss[bm].type = 0;
}
//------------------------------------------------
//ボスの弾に関する処理
//-------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].gPos.x = 0;
boss_blt[bb][bm].gPos.y = 0;
boss_blt[bb][bm].active = 0;
boss_blt[bb][bm].type = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt2[bb][bm].gPos.x = 0;
boss_blt2[bb][bm].gPos.y = 0;
boss_blt2[bb][bm].active = 0;
boss_blt2[bb][bm].type = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt3[bb][bm].gPos.x = 0;
boss_blt3[bb][bm].gPos.y = 0;
boss_blt3[bb][bm].active = 0;
boss_blt3[bb][bm].type = 0;
}
}
//------------------------------------------------
//お宝の構造体による初期化
//-------------------------------
/*for(int tm = 0;tm < TAKARA_MAX;tm++)
{
takara[tm].gPos.x = 0;
takara[tm].gPos.y = 0;
takara[tm].active = 0;
takara[tm].type = 0;
}*/
//------------------------------------------------
//お宝の構造体による初期化
//-------------------------------
for(int tm = 0;tm < TAKARA_MAX;tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
takara2[tm][tb].gPos.x = 0;
takara2[tm][tb].gPos.y = 0;
takara2[tm][tb].active = 0;
takara2[tm][tb].type = 0;
}
}
//--------------------------------------------------------------------------------------
//初期化
//-----------------------------
bullets.gPos_tm = D3DXVECTOR3(280,430,0);
score = 0;
Hi_score = 12500;
count_e = 0;
Boss_L = 1;
// Start the render loop
DXUTMainLoop();
// TODO: Perform any application-level cleanup here
return DXUTGetExitCode();
}
[/code]
一応、敵が倒せたら、アイテム(一応ダイアの画像)を表示させてみました。
switch(Stage_S)
{
case 1://
//--------------------------------------------------------------------------------------
//自機用の弾とボスの当たり判定
//-------------------------------------------
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets.active == 1)//弾がないのに当たり判定させないため
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
if( enemy_boss[bm].active == 1 ) //敵が有効
{
if(bullets.gPos_tm.x >= enemy_boss[bm].gPos.x + 12)
{
if(bullets.gPos_tm.x <= enemy_boss[bm].gPos.x + 90)
{
if(bullets.gPos_tm.y >= enemy_boss[bm].gPos.y + 28)
{
if(bullets.gPos_tm.y <= enemy_boss[bm].gPos.y + 105)
{
Boss_L -= 1;
bullets.active = 0;
score += 15;//敵を倒すことが出来たら得点UP!
if(Boss_L <= 0)
{
//弾が当たったら、フラグをOFFにする
enemy_boss[bm].active = 0;
gamemode = 4;//ステージクリア画面に移動!
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵の再発生
//-------------------------------------------
for(int em = 0;em < ENEMY_MAX;em++)
{
if( enemy[em].active_te == 0 ) //敵が無効
{
enemy[em].active_te = 1;
if( enemy[em].type == 0 )
{
enemy[em].gPos_te.x = -100;
}
else
{
enemy[em].gPos_te.x = 710;
}
}
}
//--------------------------------------------------------------------------------------
//敵の動き
//------------------------------------------
//敵の動き
for(int em = 0;em< ENEMY_MAX;em++)
{
if(enemy[em].active_te == 1)
{
if( enemy[em].type==0 )
{
enemy[em].gPos_te.x += ENEMY_SPEED;
if(enemy[em].gPos_te.x > 640)
{
enemy[em].gPos_te.x = -100;
}
}
else
{
enemy[em].gPos_te.x -= ENEMY_SPEED_B;
if(enemy[em].gPos_te.x < -70)
{
enemy[em].gPos_te.x = 680;
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 30;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
//////////////////////////
//ステージ2
if(Stage == 2)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1 || enemy[em + 1].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
enemy_blt[em][eb + 1].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 15;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
enemy_blt[em][eb + 1].gPos.x = enemy[em].gPos_te.x + 45;
enemy_blt[em][eb + 1].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
}
//////////////////////////
//ステージ3以降
if(Stage >= 3)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1 || enemy[em + 1].active_te == 1 || enemy[em + 2].active_te == 1)
{
// 弾の発射待ち?
if( enemy[em].shot_wait > 0 )
{
enemy[em].shot_wait--;//発射しない
}
else
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 0)//無効な弾
{
enemy_blt[em][eb].active = 1;//弾の表示
enemy_blt[em][eb + 1].active = 1;//弾の表示
enemy_blt[em][eb + 2].active = 1;//弾の表示
//敵の中央に表示させる
enemy_blt[em][eb].gPos.x = enemy[em].gPos_te.x + 10;
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y + 20;
enemy_blt[em][eb + 1].gPos.x = enemy[em].gPos_te.x + 40;
enemy_blt[em][eb + 1].gPos.y = enemy[em].gPos_te.y + 20;
enemy_blt[em][eb + 2].gPos.x = enemy[em].gPos_te.x + 70;
enemy_blt[em][eb + 2].gPos.y = enemy[em].gPos_te.y + 20;
//敵の弾の発射を抑制
enemy[em].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int em = 0;em < ENEMY_MAX; em++)
{
if(enemy[em].active_te == 1)
{
for (int eb = 0; eb < ENEMY_BLT_MAX; eb++)
{
if(enemy_blt[em][eb].active == 1)
{
switch(enemy_blt[em][eb].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
enemy_blt[em][eb].gPos.y += ENEMY_BLT_SPEED;//弾の座標を増やす
if(enemy_blt[em][eb].gPos.y > 640)
{
enemy_blt[em][eb].gPos.y = enemy[em].gPos_te.y;
enemy_blt[em][eb].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//敵用の弾と自機の当たり判定
//-----------------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、敵用の弾と自機を消す
if(enemy_blt[em][eb].gPos.x > myship[0].gPos.x + 5)
{
if(enemy_blt[em][eb].gPos.x < myship[0].gPos.x + 55)
{
if(enemy_blt[em][eb].gPos.y > myship[0].gPos.y + 15)
{
if(enemy_blt[em][eb].gPos.y < myship[0].gPos.y + 50)
{
enemy_blt[em][eb].active = 0;//敵用の弾を非表示
Life -= 2;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;
}
}
}
}
}
}
}
}
}
}
//敵の弾が自機に当たって自機が消えたら今までの弾も非表示
for(int eb = 0; eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if(myship[0].active == 0 && enemy_blt[em][eb].active == 0)
{
for(int b = 0;b < BULLET_MAX;b++)
{
bullets.active = 0;//弾を非表示
}
}
}
}
//--------------------------------------------------------------------------------------
//ボスの出現
//---------------------------------------
if(count_e >= Stage * 4)
{
for(int em = 0;em< ENEMY_MAX;em++)
{
enemy[em].active_te = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
enemy_blt[em][eb].active = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 1;
enemy_boss[bm].type = 0;
}
}
}
//ボスの移動処理
for(int bm = 0;bm < BOSS_MAX;bm++)
{
if(enemy_boss[bm].active == 1)
{
//一定値をマイナスし、座標を移動させる。
enemy_boss[bm].gPos.x -= BOSS_SPEED;
if(enemy_boss[bm].gPos.x <= -100)
{
//画面外に出たら、右の位置に戻してあげる(画像の大きさに合わせて少し多め)
enemy_boss[bm].gPos.x = 700;
}
}
}
//--------------------------------------------------------------------------------------
//ボス用弾の発射
//-----------------------------------------
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if(enemy_boss[bm].active == 1)
{
// 弾の発射待ち?
if( enemy_boss[bm].shot_wait > 0 )
{
enemy_boss[bm].shot_wait--;//発射しない
}
else
{
for (int bb = 0; bb < BOSS_BLT_MAX; bb++)
{
if(boss_blt[bb][bm].active == 0)//無効な弾
{
boss_blt[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 45;
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 130;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 20;//発射を抑制するフレーム数
break;
}
if(boss_blt2[bb][bm].active == 0)//無効な弾
{
boss_blt2[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt2[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 15;
boss_blt2[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 110;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 20;//発射を抑制するフレーム数
break;
}
if(boss_blt3[bb][bm].active == 0)//無効な弾
{
boss_blt3[bb][bm].active = 1;//弾の表示
//敵の中央に表示させる
boss_blt3[bb][bm].gPos.x = enemy_boss[bm].gPos.x + 75;
boss_blt3[bb][bm].gPos.y = enemy_boss[bm].gPos.y + 110;
//敵の弾の発射を抑制
enemy_boss[bm].shot_wait = 20;//発射を抑制するフレーム数
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用弾の移動
//-----------------------------------------
// for文で弾の数だけやる
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if(enemy_boss[bm].active == 1)
{
for (int bb = 0; bb < BOSS_BLT_MAX; bb++)
{
if(boss_blt[bb][bm].active == 1)
{
switch(boss_blt[bb][bm].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
boss_blt[bb][bm].gPos.y += BOSS_BLT_SPEED + Stage;//弾の座標を増やす
if(boss_blt[bb][bm].gPos.y > 640)
{
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt[bb][bm].active = 0;
}
// 弾の座標はbullet構造体の中に入れる
boss_blt2[bb][bm].gPos.y += BOSS_BLT_B_SPEED;//弾の座標を増やす
if(boss_blt2[bb][bm].gPos.y > 640)
{
boss_blt2[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt2[bb][bm].active = 0;
}
// 弾の座標はbullet構造体の中に入れる
boss_blt3[bb][bm].gPos.y += BOSS_BLT_C_SPEED;//弾の座標を増やす
if(boss_blt3[bb][bm].gPos.y > 640)
{
boss_blt3[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt3[bb][bm].active = 0;
}
break;
case 1://
break;
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 4;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt2[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt2[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt2[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt2[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt2[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt2[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 2;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//ボス用の弾と自機の当たり判定
//-----------------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt3[bb][bm].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、ボス用の弾と自機を消す
if(boss_blt3[bb][bm].gPos.x > myship[0].gPos.x + 5)
{
if(boss_blt3[bb][bm].gPos.x < myship[0].gPos.x + 55)
{
if(boss_blt3[bb][bm].gPos.y > myship[0].gPos.y + 15)
{
if(boss_blt3[bb][bm].gPos.y < myship[0].gPos.y + 50)
{
boss_blt3[bb][bm].active = 0;//ボス用の弾を非表示
Life -= 1;//自機の体力から一定の数値を引く
if(Life <= 0)
{
gamemode = 3;//体力が無くなったらゲームオーバー画面に移動させる
}
}
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------
//お宝、出現条件処理
//--------------------------------------
//--------------------------------------------------------------------------------------
//敵用弾の発射
//-----------------------------------------
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
for(int em = 0;em < ENEMY_MAX;em++)
{
if(takara2[tm][tb].active == 1)//無効な弾
{
//takara2[tm][tb].active = 1;//弾の表示
//敵の中央に表示させる
takara2[tm][tb].gPos.x = enemy[em].gPos_te.x + 25;
//takara2[tm][tb].gPos.y = enemy[em].gPos_te.y + 20;
//takara2[tm][tb].active = 0;
}
}
}
}
//--------------------------------------------------------------------------------------
//お宝落下移動
//----------------------------------
// for文で弾の数だけやる
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
if(takara2[tm][tb].active == 1)//弾が有効
{
switch(takara2[tm][tb].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
takara2[tm][tb].gPos.y += TKR_SPEED;//弾の座標を減らす
takara2[tm][tb].gPos.x;//弾の座標を減らす
if(takara2[tm][tb].gPos.y > 640)
{
takara2[tm][tb].active = 0;
}
break;
case 1://
break;
}
}
}
}
//--------------------------------------------------------------------------------------
//宝と自機の当たり判定
//-----------------------------------------
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
if( takara2[tm][tb].active == 1)//有効な弾だけ
{
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
//自機に当たったら、敵用の弾と自機を消す
if(takara2[tm][tb].gPos.x > myship[0].gPos.x + 5)
{
if(takara2[tm][tb].gPos.x < myship[0].gPos.x + 55)
{
if(takara2[tm][tb].gPos.y > myship[0].gPos.y + 15)
{
if(takara2[tm][tb].gPos.y < myship[0].gPos.y + 50)
{
takara2[tm][tb].active = 0;//敵用の弾を非表示
count_T += 1;//お宝の数をカウント+1
}
}
}
}
}
}
}
}
}
/*if(gamemode == 4)
{
for(int tm = 0;tm < TAKARA_MAX;tm++)
{
if(Life >= 40)
{
switch(takara[tm].type)
{
case 0://
takara[tm].active = 1;
takara2[tm].active = 1;
break;
}
}
if(Life < 40 && Life > 30)
{
switch(takara[tm].type)
{
case 0://
takara[tm].active = 1;
break;
}
}
if(Life <= 29)
{
switch(takara[tm].type)
{
case 0://
takara[tm].active = 1;
break;
}
}
}
}*/
//--------------------------------------------------------------------------------------
//背景のスクロール
//---------------------------------------
//(これが無いとシューティングっぽくは見えないので、追加させる)
gPos_map.y++;
if(gPos_map.y >= 480)
{
gPos_map.y = -480;
}
gPos_map_a.y++;
if(gPos_map_a.y >= 480)
{
gPos_map_a.y = -480;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
if(score > Hi_score)
{
Hi_score = score;
}
//--------------------------------------------------------------------------------------
//得点
//---------------------------------------
/*if(score >= 2000)//ある一定の得点を超えたらクリア画面にする
{
gamemode = 2;
}*/
//--------------------------------------------------------------------------------------
//ゲームクリア判定
//---------------------------------------
if(Stage >= 4 && gamemode == 4)
{
gamemode = 2;
}
//--------------------------------------------------------------------------------------
//マトリクスを作成
//---------------------------------------
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back,0,0,0);
//背景画像も動かないようにMatrix関数で固定させる。
//<matrix_te用=背景画像>
//移動行列を作成
D3DXMatrixTranslation( &matrix_back_a,0,0,0);
//宝
for(int tm = 0;tm < TAKARA_MAX;tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX; tb++)
{
if(takara2[tm][tb].active == 1)
{
//移動行列を作成
D3DXMatrixTranslation( &takara2[tm][tb].matrix,takara2[tm][tb].gPos.x,takara2[tm][tb].gPos.y,0);
}
}
}
// for文で弾の数だけまとめてMatrix計算する
for(int b = 0;b < BULLET_MAX; b++)
{
//<matrix用=弾>
//移動行列を作成
D3DXMatrixTranslation( &bullets.matrix,bullets.gPos_tm.x,bullets.gPos_tm.y,0);
}
for(int i = 0;i < MYSHIP;i++)
{
//<matrix_ji用=自機>
//移動行列を作成
D3DXMatrixTranslation( &myship.matrix,myship.gPos.x,myship.gPos.y,0);
}
for(int em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy[em].matrix_te,enemy[em].gPos_te.x,enemy[em].gPos_te.y,0);
}
//敵の弾を敵弾の数だけ
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_blt[em][eb].matrix,enemy_blt[em][eb].gPos.x,enemy_blt[em][eb].gPos.y,0);
}
}
//ボス的な存在
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &enemy_boss[bm].matrix,enemy_boss[bm].gPos.x,enemy_boss[bm].gPos.y,0);
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt[bb][bm].matrix,boss_blt[bb][bm].gPos.x,boss_blt[bb][bm].gPos.y,0);
}
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt2[bb][bm].matrix,boss_blt2[bb][bm].gPos.x,boss_blt2[bb][bm].gPos.y,0);
}
}
//ボス用の弾
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
//<matrix_te用=敵>
//移動行列を作成
D3DXMatrixTranslation( &boss_blt3[bb][bm].matrix,boss_blt3[bb][bm].gPos.x,boss_blt3[bb][bm].gPos.y,0);
}
}
}
break;
case 2://【ゲームクリア画面】
if(gamemode == 2)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[em].active = 0;
}
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].active = 0;
boss_blt2[bb][bm].active = 0;
boss_blt3[bb][bm].active = 0;
}
}
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 0;
}
//体力(ライフ)
Life = 50;
Boss_L = 20;
gPos_map.x = 0;
gPos_map.y = 0;
gPos_map_a.x = 0;
gPos_map_a.y = -480;
count_e = 0;
score = 0;
}
}
}
break;
case 3://【ゲームオーバー画面】
if(gamemode == 3)
{
score = 0;
for(int em = 0;em < ENEMY_MAX;em++)
{
if(KEY_RETURN == PUSH)
{
//タイトル画面に戻す
gamemode = 0;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[em].active = 0;
}
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].active = 0;
boss_blt2[bb][bm].active = 0;
boss_blt3[bb][bm].active = 0;
}
}
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 0;
}
//体力(ライフ)
Life = 50;
Boss_L = 20;
gPos_map.x = 0;
gPos_map.y = 0;
gPos_map_a.x = 0;
gPos_map_a.y = -480;
count_e = 0;
score = 0;
}
}
}
break;
case 4://【ステージクリア画面】
if(gamemode == 4)
{
//宝
/*for(int tm = 0;tm < TAKARA_MAX; tm++)
{
switch(takara[tm].type)
{
case 0://
//移動行列を作成
D3DXMatrixTranslation( &takara[tm].matrix,430,380,0);
//移動行列を作成
D3DXMatrixTranslation( &takara2[tm].matrix,470,380,0);
break;
case 1://
//移動行列を作成
D3DXMatrixTranslation( &takara[tm].matrix,450,380,0);
break;
case 2://
//移動行列を作成
D3DXMatrixTranslation( &takara[tm].matrix,takara[tm].gPos.x,takara[tm].gPos.y,0);
break;
}
}*/
if(KEY_RETURN == PUSH)
{
//ネクスト画面に移動
gamemode = 5;
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
//初期設定に戻す
//敵1
enemy[em].gPos_te.x = -80;
enemy[em].gPos_te.y = 50;
//敵用の弾
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
//自機
myship[em].gPos.x = 280;
myship[em].gPos.y = 420;
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[em].active = 0;
}
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].active = 0;
boss_blt2[bb][bm].active = 0;
boss_blt3[bb][bm].active = 0;
}
}
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].active = 0;
}
}
}
break;
case 5://
if(KEY_RETURN == PUSH)
{
//ゲーム画面に移動
gamemode = 1;
//ステージクリアのため初期化設定ではスコアは除く。
Life = 50 + (Stage * 10);//ライフを回復+ステージクリアボーナスとして一定数値増加
Boss_L = 20;//ボスの体力
gPos_map.x = 0;
gPos_map.y = 0;
gPos_map_a.x = 0;
gPos_map_a.y = -480;
Stage += 1;//ステージ数増加
}
break;
case 6://
break;
case 7://
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://【タイトル画面】
//タイトル画像
//テクスチャの表示領域
RECT rect_title_back;
SetRect(&rect_title_back,0,0,512,256);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_title_back);
//スプライトで2D描画=背景
pSprite->Draw( pText_title_back,&rect_title_back,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
//タイトル画像
//テクスチャの表示領域
RECT rect_title;
SetRect(&rect_title,0,0,355,215);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_title);
//スプライトで2D描画=背景
pSprite->Draw( pText_title,&rect_title,NULL,&gPos_title,D3DCOLOR_ARGB(255,255,255,255));
/*//ロゴ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));*/
//ハイスコア背面画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_sc;
SetRect(&rect_back_sc,0,0,270,100);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_sc);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_sc,&rect_back_sc,NULL,&gPos_sc,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));
//背景画像(1枚しかないので、if文で指定しない)
//テクスチャの表示領域
RECT rect_back_a;
SetRect(&rect_back_a,0,0,640,480);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&matrix_back_a);
//スプライトで2D描画=背景
pSprite->Draw( pText_back_a,&rect_back_a,NULL,&gPos_map_a,D3DCOLOR_ARGB(255,255,255,255));
////////////////////////////////////////////
//自機用
for(int i = 0;i < MYSHIP;i++)
{
if(myship.active == 1)
{
//自機
//テクスチャの表示領域
RECT rect_tex;
SetRect(&rect_tex,0,0,60,60);
//テクスチャの描画前に行列をセットする
pSprite->SetTransform(&myship.matrix);
//スプライトで2D描画=自機
pSprite->Draw( pTexture,&rect_tex,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
////////////////////////////////////////////
//自機用の弾
for(int b = 0;b < BULLET_MAX; b++)
{
if(bullets[b].active == 1)
{
//弾
//テクスチャの表示領域
RECT rect_tex_ta;
SetRect(&rect_tex_ta,0,0,10,10);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&bullets[b].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 em = 0;em < ENEMY_MAX; em++)
{
if( enemy[em].active_te == 1)
{
//敵
//テクスチャの表示領域
RECT rect_tex_te;
SetRect(&rect_tex_te,0,0,70,35);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy[em].matrix_te);
//スプライトで2D描画=敵
pSprite->Draw( pText_teki,&rect_tex_te,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
////////////////////////////////////////////
//敵用の弾 3
for(int eb = 0;eb < ENEMY_BLT_MAX; eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
if( enemy_blt[em][eb].active == 1)
{
//敵用の弾
//テクスチャの表示領域
RECT rect_tex_teta;
SetRect(&rect_tex_teta,0,0,12,12);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_blt[em][eb].matrix);
//スプライトで2D描画=敵の弾
pSprite->Draw( pText_teta,&rect_tex_teta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
////////////////////////////////////////////
//ボス用
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( enemy_boss[bm].active == 1)
{
//ボス用
//テクスチャの表示領域
RECT rect_tex_boss;
SetRect(&rect_tex_boss,0,0,100,150);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&enemy_boss[bm].matrix);
//スプライトで2D描画=ボス
pSprite->Draw( pText_boss,&rect_tex_boss,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
////////////////////////////////////////////
//ボス用の弾 1
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt[bb][bm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_boss_ta;
SetRect(&rect_boss_ta,0,0,12,22);/*(14,14)*/
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt[bb][bm].matrix);
//スプライトで2D描画=ボス弾
pSprite->Draw( pText_boss_ta,&rect_boss_ta,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
////////////////////////////////////////////
//ボス用の弾 2
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt2[bb][bm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_boss_ta2;
SetRect(&rect_boss_ta2,0,0,12,22);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt2[bb][bm].matrix);
//スプライトで2D描画=ボス弾2
pSprite->Draw( pText_boss_ta2,&rect_boss_ta2,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
////////////////////////////////////////////
//ボス用の弾 3
for(int bb = 0;bb < BOSS_BLT_MAX; bb++)
{
for(int bm = 0;bm < BOSS_MAX; bm++)
{
if( boss_blt3[bb][bm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_boss_ta2;
SetRect(&rect_boss_ta2,0,0,12,22);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&boss_blt3[bb][bm].matrix);
//スプライトで2D描画=ボス弾3
pSprite->Draw( pText_boss_ta2,&rect_boss_ta2,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
}
//アイテム
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX; tb++)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,36,27);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara2[tm][tb].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara1,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
}
break;
case 2://【ゲームクリア画面】
break;
case 3://【ゲームオーバー画面】
break;
case 4://【ステージクリア画面】
//アイテム
/*for(int tm = 0;tm < TAKARA_MAX; tm++)
{
switch(takara[tm].type)
{
case 0://
if( takara[tm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,36,27);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara[tm].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara1,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
//ボス用の弾
//テクスチャの表示領域
//RECT rect_takara1;
SetRect(&rect_takara1,0,0,36,27);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara2[tm][tb].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara1,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
break;
case 1://
if( takara[tm].active == 1)
{
//ボス用の弾
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,19,19);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara[tm].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara2,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
break;
case 2://
if( takara[tm].active == 1)
{
//テクスチャの表示領域
RECT rect_takara1;
SetRect(&rect_takara1,0,0,18,13);
//テクスチャの描画前に行列にセットする
pSprite->SetTransform(&takara[tm].matrix);
//スプライトで2D描画=宝
pSprite->Draw( pText_takara3,&rect_takara1,NULL,NULL,D3DCOLOR_ARGB(255,255,255,255));
}
break;
}
}*/
break;
case 5://【ネクストステージ画面】
break;
}
//スプライトの終了
pSprite->End();
switch(gamemode)
{
case 0://【タイトル画面】
//========================================
//各フォント
//========================================
/*//フォント1
RECT rectf; //フォント位置を保持する構造体変数
SetRect ( &rectf,10,100,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ここにタイトル画面が入ります!!"),//表示文字列
-1, //表示文字数
&rectf, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色*/
//フォント1
RECT rectq; //フォント位置を保持する構造体変数
SetRect ( &rectq,120,380,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔S〕キーで GAME START!!"), //表示文字列
-1, //表示文字数
&rectq, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,0)); //表示色
//フォント1
RECT recti; //フォント位置を保持する構造体変数
SetRect ( &recti,10,250,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("操作方法\n〔↑↓→←〕キーで自機の移動\n〔SPACE〕キーで弾が発射出来ます。\nあとは、敵の弾を交わしながら、ステージを進むだけ(^^♪"), //表示文字列
-1, //表示文字数
&recti, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,0,0,0)); //表示色
/*//フォント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,0,0,0)); //表示色
//変数内容の表示
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,180,0));
break;
case 1://【ゲーム画面】
if(enemy_boss[0].active == 0)
{
//フォント
RECT rect_ef; //フォント位置を保持する構造体変数
SetRect ( &rect_ef,480,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("BREAK"), //表示文字列
-1, //表示文字数
&rect_ef, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
//変数内容の表示
TCHAR str_e[255];
_stprintf(str_e,_T("%02d"),count_e);
RECT rect_e;
SetRect(&rect_e,590,27,640,480);
pFontc->DrawText(NULL,str_e,-1,&rect_e,NULL,D3DCOLOR_ARGB(255,0,180,0));
}
//----------------------
//得点(スコア)
//---------------
//フォント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));
/*==========現在のStage数==========*/
//フォント1
RECT rect_st; //フォント位置を保持する構造体変数
SetRect ( &rect_st,10,2,640,480); //変数への位置セット
//フォントの描画
pFontb -> DrawText(NULL, //標準機能で描画
_T("STAGE"), //表示文字列
-1, //表示文字数
&rect_st, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,0)); //表示
//フォント1
//変数内容の表示
TCHAR str_st[255];
_stprintf(str_st,_T("%02d"),Stage);
RECT rect_st1;
SetRect(&rect_st1,100,0,640,480);
pFontd->DrawText(NULL,str_st,-1,&rect_st1,NULL,D3DCOLOR_ARGB(255,0,255,100));
/*==========自機用のライフ==========*/
//フォント1
RECT rect; //フォント位置を保持する構造体変数
SetRect ( &rect,10,28,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("HP"), //表示文字列
-1, //表示文字数
&rect, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示
//フォント1
//変数内容の表示
TCHAR str_la[255];
_stprintf(str_la,_T("%04d"),Life);
RECT rect_la;
SetRect(&rect_la,60,28,640,480);
pFont->DrawText(NULL,str_la,-1,&rect_la,NULL,D3DCOLOR_ARGB(255,0,255,255));
/*==========ボス用のライフ==========*/
if(enemy_boss[0].active == 1)
{
//フォント1
RECT rect_b; //フォント位置を保持する構造体変数
SetRect ( &rect_b,510,30,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("LIFE"), //表示文字列
-1, //表示文字数
&rect_b, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示
//フォント1
//変数内容の表示
TCHAR str_b[255];
_stprintf(str_b,_T("%02d"),Boss_L);
RECT rect_bf;
SetRect(&rect_bf,590,26,640,480);
pFonta->DrawText(NULL,str_b,-1,&rect_bf,NULL,D3DCOLOR_ARGB(255,255,100,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://【ステージクリア画面】
//フォント1
//変数内容の表示
TCHAR str_sta[255];
_stprintf(str_sta,_T("STAGE %d CLEAR"),Stage);
RECT rect_sta;
SetRect(&rect_sta,190,215,640,480);
pFonta->DrawText(NULL,str_sta,-1,&rect_sta,NULL,D3DCOLOR_ARGB(255,255,255,0));
//フォント
//RECT recten; //フォント位置を保持する構造体変数
SetRect ( &recten,10,80,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔Enter←〕でタイトル画面に!"), //表示文字列
-1, //表示文字数
&recten, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,255,255)); //表示色
break;
case 5://【ネクストステージ画面】
//フォント1
//変数内容の表示
TCHAR str_nex[255];
_stprintf(str_nex,_T("NEXT… STAGE %d"),Stage);
RECT rect_nex;
SetRect(&rect_nex,100,80,640,480);
pFonta->DrawText(NULL,str_nex,-1,&rect_nex,NULL,D3DCOLOR_ARGB(255,0,0,255));
//フォント
RECT rectlc; //フォント位置を保持する構造体変数
SetRect ( &rectlc,150,180,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("ライフ全回復♪\nCLEAR BONUS ライフ最大値UP!!"), //表示文字列
-1, //表示文字数
&rectlc, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,0)); //表示色
//フォント
//RECT recten; //フォント位置を保持する構造体変数
SetRect ( &recten,150,230,640,480); //変数への位置セット
//フォントの描画
pFont -> DrawText(NULL, //標準機能で描画
_T("〔Enter←〕PUSH GO!!"), //表示文字列
-1, //表示文字数
&recten, //表示位置
NULL, //表示スタイル
D3DCOLOR_ARGB(255,255,0,0)); //表示色
break;
case 6://
break;
case 7://
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 )
{
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\dia01.png"),&pText_takara1);//宝箱(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\icon01.png"),&pText_takara2);//宝箱(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\"),&pText_takara3);//宝箱(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\title0-4-1.png"),&pText_title);//タイトル(画像)
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\title-back.png"),&pText_title_back);//タイトル(画像)
//D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("image\\tama011.png"),&pText_boss_tam);//中ボス用弾2(画像)
//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 < MYSHIP;i++)
{
myship.gPos.x = 280;
myship.gPos.y = 420;
myship.active = 1;
}
//------------------------------------------------
//弾の構造体に関する処理
//-------------------------------
for(int b = 0;b < BULLET_MAX;b++)
{
bullets[b].gPos_tm.x = 280;
bullets[b].gPos_tm.y = 430;
bullets[b].active = 0;
bullets[b].type = 0;
}
//------------------------------------------------
//敵の構造体に関する処理
//-------------------------------
enemy[0].gPos_te.x = -80;
enemy[0].gPos_te.y = 50;
enemy[0].active_te = 1;
enemy[1].shot_wait = 0;
enemy[0].type = 0;
enemy[1].gPos_te.x = 690;
enemy[1].gPos_te.y = 90;
enemy[1].active_te = 1;
enemy[1].shot_wait = 0;
enemy[1].type = 1;
//------------------------------------------------
//敵の弾に関する処理
//-------------------------------
for(int eb = 0;eb < ENEMY_BLT_MAX;eb++)
{
for(int em = 0;em < ENEMY_MAX; em++)
{
enemy_blt[em][eb].gPos.x = 280;
enemy_blt[em][eb].gPos.y = 430;
enemy_blt[em][eb].active = 0;
enemy_blt[em][eb].type = 0;
}
}
//------------------------------------------------
//ボスに関する処理
//-------------------------------
for(int bm = 0;bm < BOSS_MAX;bm++)
{
enemy_boss[bm].gPos.x = 260;
enemy_boss[bm].gPos.y = 5;
enemy_boss[bm].shot_wait = 0;
enemy_boss[bm].active = 0;
enemy_boss[bm].type = 0;
}
//------------------------------------------------
//ボスの弾に関する処理
//-------------------------------
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt[bb][bm].gPos.x = 0;
boss_blt[bb][bm].gPos.y = 0;
boss_blt[bb][bm].active = 0;
boss_blt[bb][bm].type = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt2[bb][bm].gPos.x = 0;
boss_blt2[bb][bm].gPos.y = 0;
boss_blt2[bb][bm].active = 0;
boss_blt2[bb][bm].type = 0;
}
}
for(int bb = 0;bb < BOSS_BLT_MAX;bb++)
{
for(int bm = 0;bm < BOSS_MAX;bm++)
{
boss_blt3[bb][bm].gPos.x = 0;
boss_blt3[bb][bm].gPos.y = 0;
boss_blt3[bb][bm].active = 0;
boss_blt3[bb][bm].type = 0;
}
}
//------------------------------------------------
//お宝の構造体による初期化
//-------------------------------
/*for(int tm = 0;tm < TAKARA_MAX;tm++)
{
takara[tm].gPos.x = 0;
takara[tm].gPos.y = 0;
takara[tm].active = 0;
takara[tm].type = 0;
}*/
//------------------------------------------------
//お宝の構造体による初期化
//-------------------------------
for(int tm = 0;tm < TAKARA_MAX;tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
takara2[tm][tb].gPos.x = 0;
takara2[tm][tb].gPos.y = 0;
takara2[tm][tb].active = 0;
takara2[tm][tb].type = 0;
}
}
//--------------------------------------------------------------------------------------
//初期化
//-----------------------------
bullets.gPos_tm = D3DXVECTOR3(280,430,0);
score = 0;
Hi_score = 12500;
count_e = 0;
Boss_L = 1;
// Start the render loop
DXUTMainLoop();
// TODO: Perform any application-level cleanup here
return DXUTGetExitCode();
}
[/code]
一応、敵が倒せたら、アイテム(一応ダイアの画像)を表示させてみました。
- 添付ファイル
-
EmptyProject.cpp
- (80.45 KiB) ダウンロード数: 140 回
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
ボスの弾を3つ設定したのですが、弾の動きがイマイチで。
ときどき止まってしまう事があります。
どうしたらいいでしょうか?
ときどき止まってしまう事があります。
どうしたらいいでしょうか?
- 添付ファイル
-
EmptyProject.cpp
- (95.6 KiB) ダウンロード数: 120 回
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
申し訳ないですが、zipでまとめて画像データもらえませんか?
こちらでデータを毎回作るの大変なので。
[追記]
あと、「弾の動きがイマイチで。」の部分をもっと具体的に説明してください・
STAR_HARUKIさんの思っているイメージが良く分かりませんので。
こちらでデータを毎回作るの大変なので。
[追記]
あと、「弾の動きがイマイチで。」の部分をもっと具体的に説明してください・
STAR_HARUKIさんの思っているイメージが良く分かりませんので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
添付ファイルの中に、画像データを追加しました。
ボスが撃ってくる弾は真っすぐに動いてほしいんですが
ときどき、ピタっと止まって、しばらくすると、動く。
また、止まった弾と一緒になって動いたりします。
ボスが撃ってくる弾は真っすぐに動いてほしいんですが
ときどき、ピタっと止まって、しばらくすると、動く。
また、止まった弾と一緒になって動いたりします。
- 添付ファイル
-
- image.zip
- (1.84 MiB) ダウンロード数: 155 回
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
分かりました。
boss_blt[bb][bm].active == 1の条件で移動しているので、boss_blt[bb][bm].active == 1じゃないときはboss_blt2とboss_blt3は移動しません。
まとめてやるのではなく、boss_blt,boss_blt2,boss_blt3を同様の処理で3つ別に行ってください。
boss_blt[bb][bm].active == 1の条件で移動しているので、boss_blt[bb][bm].active == 1じゃないときはboss_blt2とboss_blt3は移動しません。
まとめてやるのではなく、boss_blt,boss_blt2,boss_blt3を同様の処理で3つ別に行ってください。
if(boss_blt[bb][bm].active == 1)
{
switch(boss_blt[bb][bm].type)
{
case 0://
// 弾の座標はbullet構造体の中に入れる
boss_blt[bb][bm].gPos.y += BOSS_BLT_SPEED + Stage;//弾の座標を増やす
if(boss_blt[bb][bm].gPos.y > 640)
{
boss_blt[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt[bb][bm].active = 0;
}
// 弾の座標はbullet構造体の中に入れる
boss_blt2[bb][bm].gPos.y += BOSS_BLT_B_SPEED;//弾の座標を増やす
if(boss_blt2[bb][bm].gPos.y > 640)
{
boss_blt2[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt2[bb][bm].active = 0;
}
// 弾の座標はbullet構造体の中に入れる
boss_blt3[bb][bm].gPos.y += BOSS_BLT_C_SPEED;//弾の座標を増やす
if(boss_blt3[bb][bm].gPos.y > 640)
{
boss_blt3[bb][bm].gPos.y = enemy_boss[bm].gPos.y;
boss_blt3[bb][bm].active = 0;
}
break;
case 1://
break;
}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
分かりました。
確かに、ボスの弾は3つあるのに1つにまとめてしていました。
一つの弾が当たっても止まる事は無くなりました。
お宝を落下させる(落とす)処理を作ったはいいのですが、
処理では、敵を倒したら、お宝を表示させています。
しかし、お宝を落下させている途中で次の敵を倒してしまうと、
今出ていたお宝が消えてしまい、次の敵を倒した時にお宝が表示してしまいます。
例えば、1番目の敵を倒したら、お宝が表示される。
お宝を自機に触れて取ろうとするが、2番目の敵を倒すと1番目の敵を倒した時に出たお宝が消えて、2番目の敵を倒した時、お宝が表示される。
まあ、処理がそうなっているんでそうなるんですが。
お宝が落下中に次の敵を倒しても、前のも次のも表示させておくには、どうしたらいいでしょうか?
確かに、ボスの弾は3つあるのに1つにまとめてしていました。
一つの弾が当たっても止まる事は無くなりました。
お宝を落下させる(落とす)処理を作ったはいいのですが、
処理では、敵を倒したら、お宝を表示させています。
しかし、お宝を落下させている途中で次の敵を倒してしまうと、
今出ていたお宝が消えてしまい、次の敵を倒した時にお宝が表示してしまいます。
例えば、1番目の敵を倒したら、お宝が表示される。
お宝を自機に触れて取ろうとするが、2番目の敵を倒すと1番目の敵を倒した時に出たお宝が消えて、2番目の敵を倒した時、お宝が表示される。
まあ、処理がそうなっているんでそうなるんですが。
お宝が落下中に次の敵を倒しても、前のも次のも表示させておくには、どうしたらいいでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
TAKARA_MAXが1なのと、お宝の発生時に既にアクティブかを判定していないことなどが問題です。
弾の処理と同じなので、弾の処理をちゃんと理解すれば解決するはずです。
弾の処理と同じなので、弾の処理をちゃんと理解すれば解決するはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
TAKARA_MAXを1にしないと、カウントを数えるとき、3なら、12。4なら16と、倍に計算されてしまうので、1にしています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
それは敵弾の発生のように同時発生を抑制していないからではないですか?STAR_HARUKI さんが書きました:TAKARA_MAXを1にしないと、カウントを数えるとき、3なら、12。4なら16と、倍に計算されてしまうので、1にしています。
敵弾の発生と同じようにactiveのチェックを入れてみてください。
原因を考えずにねじ伏せても望む結果は得られませんので、そもそもなぜそうなるのかを考えるようにしないとプログラムは思い通りに動いてくれいませんよ。もう少し粘ってみてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
for(int j = 0;j < MYSHIP;j++)
{
if(myship[0].active == 1)//有効な自機
{
for(int tm = 0;tm < TAKARA_MAX; tm++)
{
for(int tb = 0;tb < TKR_BLT_MAX;tb++)
{
if( takara2[tm][tb].active == 1)//有効な弾だけ
{
//自機に当たったら、敵用の弾と自機を消す
if(takara2[tm][tb].gPos.x > myship[0].gPos.x + 5)
{
if(takara2[tm][tb].gPos.x < myship[0].gPos.x + 55)
{
if(takara2[tm][tb].gPos.y > myship[0].gPos.y + 15)
{
if(takara2[tm][tb].gPos.y < myship[0].gPos.y + 50)
{
takara2[tm][tb].active = 0;//敵用の弾を非表示
score += 700;//ボーナスとしてスコアに加算
if(takara2[tm][tb].active == 0)
{
count_C++;//カウント
}
}
}
}
}
}
}
}
}
}
前に書いた内容で、
=====================================================
お宝を落下させる(落とす)処理を作ったはいいのですが、
処理では、敵を倒したら、お宝を表示させています。
しかし、お宝を落下させている途中で次の敵を倒してしまうと、
今出ていたお宝が消えてしまい、次の敵を倒した時にお宝が表示してしまいます。
例えば、1番目の敵を倒したら、お宝が表示される。
お宝を自機に触れて取ろうとするが、2番目の敵を倒すと1番目の敵を倒した時に出たお宝が消えて、2番目の敵を倒した時、お宝が表示される。
まあ、処理がそうなっているんでそうなるんですが。
お宝が落下中に次の敵を倒しても、前のも次のも表示させておくには、どうしたらいいでしょうか?
=====================================================
も、似たようなことですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
ちなみにコメントが弾のままでコメントとしてはお宝じゃないでしょうか?
activeな"お宝"は今現在自機に向かって飛んでいる"お宝"なので触らずに置いておいて、activeでない"お宝"を新しい"お宝"として発生させなければいけません。
それは今現在activeな"お宝"の座標を書き換えてしまうからでしょう。STAR_HARUKI さんが書きました:=====================================================
お宝を落下させる(落とす)処理を作ったはいいのですが、
処理では、敵を倒したら、お宝を表示させています。
しかし、お宝を落下させている途中で次の敵を倒してしまうと、
今出ていたお宝が消えてしまい、次の敵を倒した時にお宝が表示してしまいます。
例えば、1番目の敵を倒したら、お宝が表示される。
お宝を自機に触れて取ろうとするが、2番目の敵を倒すと1番目の敵を倒した時に出たお宝が消えて、2番目の敵を倒した時、お宝が表示される。
まあ、処理がそうなっているんでそうなるんですが。
お宝が落下中に次の敵を倒しても、前のも次のも表示させておくには、どうしたらいいでしょうか?
=====================================================
activeな"お宝"は今現在自機に向かって飛んでいる"お宝"なので触らずに置いておいて、activeでない"お宝"を新しい"お宝"として発生させなければいけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
activeでない"お宝"というのは、お宝の構造体の中の2番目をってことでしょか?softya(ソフト屋) さんが書きました: それは今現在activeな"お宝"の座標を書き換えてしまうからでしょう。
activeな"お宝"は今現在自機に向かって飛んでいる"お宝"なので触らずに置いておいて、activeでない"お宝"を新しい"お宝"として発生させなければいけません。
その2番目の構造体を新しいお宝として、座標を代入させ、発生させるという事で良いのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
2番目と決め打ちしてはいけません。STAR_HARUKI さんが書きました:activeでない"お宝"というのは、お宝の構造体の中の2番目をってことでしょか?softya(ソフト屋) さんが書きました: それは今現在activeな"お宝"の座標を書き換えてしまうからでしょう。
activeな"お宝"は今現在自機に向かって飛んでいる"お宝"なので触らずに置いておいて、activeでない"お宝"を新しい"お宝"として発生させなければいけません。
その2番目の構造体を新しいお宝として、座標を代入させ、発生させるという事で良いのでしょうか?
あくまでも、activeではないお宝です。
それが1番目でも3番目でもちゃんと動作しないといけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
自分でも分からないので、諦めます。
効果音を付けて、最終段階へ持っていきます。
効果音を付けて、最終段階へ持っていきます。
-
- 記事: 36
- 登録日時: 14年前
- 住所: 新潟県新潟市
- 連絡を取る:
Re: シューティングゲーム 上手く出来ない! Part-2
いろいろと、出来なかったり、説明不足で迷惑をかけてしまったりと、
あわただしい約3ヶ月でした。
と言う事で、無事なんとか簡潔に完成させたので間に合いました。
と言うわけで、教えていただきありがとうございましたm(__)m
では、また質問があった時に利用しようと思います。
あわただしい約3ヶ月でした。
と言う事で、無事なんとか簡潔に完成させたので間に合いました。
と言うわけで、教えていただきありがとうございましたm(__)m
では、また質問があった時に利用しようと思います。