敵の出現

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
chunezu

敵の出現

#1

投稿記事 by chunezu » 17年前

flagを使って敵を出現させようとしているのですがなかなか上手く行きません。
質問しようにも聞くことが沢山ありすぎてしまいます。

そこで「test.gifがx320、y240に起動から3秒後に出てくる。」という設定で1つ例を示して頂けないでしょうか?この例を使って勉強したいと思います。すごく長くなっても分割しないで1ソース内に納めてくれてほしいです。

OSはXP、コンパイラはVisual C++2005です。

御回答よろしくお願いします。

管理人

Re:敵の出現

#2

投稿記事 by 管理人 » 17年前

敵の出現といっても、パターンが沢山ありすぎるのですが・・。
シューティングの敵やRPGの敵、他アクションの敵や格闘などの敵など・・。

RPGの敵の遭遇については、
http://dixq.net/g/#25
こちらで紹介していますが、コレではダメですか?

chunezu

Re:敵の出現

#3

投稿記事 by chunezu » 17年前

説明不足でした。シュ-ティングの敵です。

しりうす~

Re:敵の出現

#4

投稿記事 by しりうす~ » 17年前

シューティングでもRPGでも考え方は同じだと思うのだけれど。
敵構造体{
	x, y;	// 敵の座標
	flag;	// 存在フラグ
}

メインループ
{
	if( 起動からの時間 == 3秒 )
	{
		敵構造体.x = 320;
		敵構造体.y = 240;
		敵構造体.flag = 1;
	}
	
	//敵構造体.flag == 1 なら敵が存在するので描画したり当たり判定したり
}
こういうことが聞きたかったの?

管理人

Re:敵の出現

#5

投稿記事 by 管理人 » 17年前

またこれも方法は沢山あって、用途によって様々です。
もしお遊び程度でよければシューティングの館で紹介していますので、そちらをご覧下さい。

しかし、本格的におつくりになるのならこれではダメで、エクセルなどで表を作ることになります。
私が作っているシューティングを例に出しますと、敵1体が1回の出現で持つ情報は

・いつ
・どういう移動パターンで
・どういう種類の敵が
・どこで(x座標)
・どこで(y座標)
・移動スピードはいくらで
・発射時間はいくらで
・弾幕種類は何で
・弾の色は何で
・体力はいくつで
・落とすアイテム1は何で
・落とすアイテム2は何で
・落とすアイテム3は何で
・落とすアイテム4は何で
・落とすアイテム5は何で
・落とすアイテム6は何で
・弾の種類は何で
・待機時間はいくつで

という情報が必要になります。
1面で、これが1000個位。6面で6000個位必要なわけですから、switch文やif文で書いていられません。
基本、シューティングの館を参考に、値の代入はエクセルデータなどからとってくるようにしたほうがいいと思います。

chunezu

Re:敵の出現

#6

投稿記事 by chunezu » 17年前

ありがとうございます。
その雛型を参考に自分も作ってみました。

#include "DxLib.h"

typedef struct{
int x,y,flag,pattern;
double size;
}kou;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

int GHandle;
kou nz[10];
GHandle=LoadGraph("default.jpg");

int RefreshTime;
RefreshTime = GetNowCount();

ClearDrawScreen();

int i;
for(int i=0;i<100;i++)
if(nz.flag==1)
if(nz.pattern==1)
nz.y=1.5;

for(i=0;i<10;i++)
if(nz.flag==0)
break;

int counter=0;
counter=counter+1;

switch(counter){
case 60:
case 120:
case 180:
case 240:
nz.flag=1; //出現フラグ
counter=0;//出現して何カウント目か測るカウンター初期化
nz.pattern=1; //軌道
nz.size=0.5;//大きさ
nz.x=100; //xの初期座標
nz.y=100; //yの初期座標
break;
default:
break;
}


for(i=0;i<100;i++)
if(nz.flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}


ScreenFlip();

while(GetNowCount()-RefreshTime<17);


WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}

このプログラムだとエラーは出てきませんでしたが、画面にも何も出てきませんでした。
どのあたりがいけないか、ご指摘お願いします。

しりうす~

Re:敵の出現

#7

投稿記事 by しりうす~ » 17年前

DXLib使ったことないので、この実装が正しいのかはわかりませんけれど、
プログラムがきちっとループしていると仮定して、ループの中で

int counter = 0;

で宣言してるのでカウンターが増えてないんじゃないですか?
カウンターの数字をデバッガで追いかけるなり画面で表示するなりして確認してみてください。

やそ

Re:敵の出現

#8

投稿記事 by やそ » 17年前

んー、ループしてますか、これ?
int counter=0; 
counter=counter+1; 

switch(counter){ 
case 60: 
case 120: 
case 180: 
case 240: 
nz.flag=1; //出現フラグ 
counter=0;//出現して何カウント目か測るカウンター初期化 
nz.pattern=1; //軌道




ですが、しりうすさんの指摘どおり、counterが回っていないようです。

chunezu

Re:敵の出現

#9

投稿記事 by chunezu » 17年前

ご指摘ありがとうございます。たしかにループもしてないし、カウンターも回ってませんでした。


#include "DxLib.h"

typedef struct{
int x,y,flag,pattern;
double size;
}kou;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

int GHandle;
int counter=0;
kou nz[10];
GHandle=LoadGraph("default.jpg");
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

int RefreshTime;

while(!ProcessMessage() && !ClearDrawScreen()){

RefreshTime = GetNowCount();

counter=counter+1;
DrawFormatString( 0, 0, White , "%d" , counter );//文字列表示



int i;
for(int i=0;i<100;i++)
if(nz.flag==1)
if(nz.pattern==1)
nz.y=1.5;

for(i=0;i<10;i++)
if(nz.flag==0)
break;

switch(counter){
case 60:
nz.flag=1; //出現フラグを立てる
counter=0;//出現して何カウント目か測るカウンター初期化
nz.pattern=1; //どういう軌道を描くか
nz.size=1;//敵の大きさ
nz.x=100; //xの初期座標
nz.y=100; //yの初期座標
break;
default:
break;
}


for(i=0;i<100;i++)
if(nz.flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}


ScreenFlip();

while(GetNowCount()-RefreshTime<17);
}


WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}

ちゃんとループをして、カウンターが回るようにしました。
DrawFormatString( 0, 0, White , "%d" , counter );ぐるぐると回っておりました。
しかし、またしたも肝心の画像が出てきません。

ご指摘お願いします。

バグ

Re:敵の出現

#10

投稿記事 by バグ » 17年前

一応、動くように修正しましたが、構造体の配列が10個しか用意されていないのに、ループを100回している箇所がありますね。危険ですので、注意した方がいいですよ。

あと、どのループがどの処理をしているのか分かりにくいですね。メンテナンスが容易になるので、きちんと{}で括るべきです。ちなみに、この修正ソースでは、ループは1つにまとめてみました。

ただし、私の勝手な解釈で適当に修正してあるので、必要に応じて再修正を加えてください。
#include "DxLib.h"

typedef struct
{
	int flag;
	int pattern;
	double x;
	double y;
	double size;
}kou;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1)
	{
		return -1;
	}

	SetDrawScreen(DX_SCREEN_BACK);

	int GHandle = LoadGraph("default.jpg"); 
	int counter=0; 
	kou nz[10];			// 構造体の中身が初期化されていないまま使用されていますが大丈夫ですか??????

	while (!ProcessMessage() && !ClearDrawScreen())
	{
		counter++;
		DrawFormatString(0, 0, GetColor(255, 255, 255), "%d", counter);

		for(int i=0;i<10;i++)
		{
			// このif文は何を判定しているのでしょう??????
			if (nz.flag == 1 && nz.pattern == 1)
			{
				// メンバ変数のyはint型ですが、代入されている値がdouble型です。(修正済み)
				nz.y = 1.5; 
			}

			// 構造体が初期化されていないので、countが60になる以前の中身が不定となりますが大丈夫でしょうか??????
			// というか、この判定は必要ですか?下記のswitch~caseで充分だとおもいますが…??????
			if (nz.flag == 0)
			{
				break;
			}

			switch (counter)
			{
			case 60: 
				counter = 0;		//出現して何カウント目か測るカウンター初期化 
				nz.flag = 1;		//出現フラグを立てる 
				nz.pattern = 1;	//どういう軌道を描くか 
				nz.x = 100.0;	//xの初期座標 
				nz.y = 100.0;	//yの初期座標 
				nz.size = 1.0;	//敵の大きさ 
				break; 
			default:
				break;
			}

			if (nz.flag == 1)
			{
				// int型をint型にキャストしてますね。意味がありません(修正済み)
				DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );
			} 
		}

		ScreenFlip();
	}

	WaitKey(); // 何かキー入力があるまで待つ 
	DxLib_End(); // DXライブラリ使用の終了処理 
	return 0; // ソフトの終了 
}

chunezu

Re:敵の出現

#11

投稿記事 by chunezu » 17年前

じぶんなりの形にまとめ上げることができました。

みなさん本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る