敵の出現及び消滅処理について質問したいことが・・・

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

敵の出現及び消滅処理について質問したいことが・・・

#1

投稿記事 by the Doss » 12年前

自分が今行いたい事は何か
敵を出現(描画)させ、条件を満たした場合消えるという処理

どのように取り組んだか(プログラムコードがある場合記載)
指定した座標と一致した場合、敵の初期値を決め
その後一定の処理を繰り返すという関数を作成したのですが、
敵の体力(teki_S[n].HP)が0以下になった場合、敵の描画をやめる
という条件を満たしたにもかかわらず、敵が描画を続けるという事態に
なってしまい、解決が困難になったので、質問しようと思いました。
[code = C++]
void teki_ugoki(int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa){
static bool patan;
/*座標が一致科の確認*/
if(zahyo == haikei.sizeY)
if(patan == false)
patan = true;

for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == false && patan == true){
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize(teki_S[n].Graph,&teki_S[n].sizeX,&teki_S[n].sizeY);
teki_S[n].fulg = true;
patan = false;
}

for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == true){
if(teki_S[n].HP <= 0){
score += teki_S[n].score;
teki_S[n].fulg = false;
}
if(0-teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
|| 0-teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY)
teki_S[n].fulg = false;
teki_S[n].X += teki_S[n].idouX;
teki_S[n].Y += teki_S[n].idouY;
for(i=0; i<tama_kazu; i++)
if(atarisikaku(teki_S[n].X,teki_S[n].Y,teki_S[n].sizeX,teki_S[n].sizeY,
tama.X,tama.Y,tama.sizeX,tama.sizeY) == true
&& tama.boor == true){
teki_S[n].HP--;
tama.boor = false;
}
DrawGraph(teki_S[n].X,teki_S[n].Y,teki_S[n].Graph,true);
}
}
[/code]  

OS : Windows, Linux等々
 OSはwindow8です。

コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++ 2010です。

 ・どの程度C言語を理解しているか
C言語は何かを作れと言われた時に、困らないレベルには網羅していると思っています

 ・ライブラリを使っている場合は何を使っているか
使用ライブラリはDXLIB.h、math.hです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 敵の出現及び消滅処理について質問したいことが・・・

#2

投稿記事 by softya(ソフト屋) » 12年前

codeタグが失敗しています。必ずプレビューで確認してくださいね。

デバッガで追いかけてもわからないんでしょうか?
コードが見づらいので書き換えました。

コード:

void teki_ugoki( int zahyo, double X, double Y,
                 double idouX, double idouY, int HP,
                 int Graph, int sukoa ) {
	static bool patan;
	/*座標が一致科の確認*/
	if( zahyo == haikei.sizeY ) {
		if( patan == false ) {
			patan = true;
		}
	}

	for( n = 0; n < teki_kazu; n++ )
		if( teki_S[n].fulg == false && patan == true ) {
			teki_S[n].X = X;
			teki_S[n].Y = Y;
			teki_S[n].idouX = idouX;
			teki_S[n].idouY = idouY;
			teki_S[n].count = 0;
			teki_S[n].HP = HP;
			teki_S[n].score = sukoa;
			teki_S[n].Graph = Graph;
			GetGraphSize( teki_S[n].Graph, &teki_S[n].sizeX, &teki_S[n].sizeY );
			teki_S[n].fulg = true;
			patan = false;
		}

	for( n = 0; n < teki_kazu; n++ )
		if( teki_S[n].fulg == true ) {
			if( teki_S[n].HP <= 0 ) {
				score += teki_S[n].score;
				teki_S[n].fulg = false;
			}
			if( 0 - teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
			    || 0 - teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY ) {
				teki_S[n].fulg = false;
			}
			teki_S[n].X += teki_S[n].idouX;
			teki_S[n].Y += teki_S[n].idouY;
			for( i = 0; i < tama_kazu; i++ ) {
				if( atarisikaku( teki_S[n].X, teki_S[n].Y, teki_S[n].sizeX, teki_S[n].sizeY, tama.X[i], tama.Y[i], tama.sizeX, tama.sizeY ) == true
				    &&  tama.boor[i] == true ) {
					teki_S[n].HP--;
					tama.boor[i] = false;
				}
			}
			DrawGraph( teki_S[n].X, teki_S[n].Y, teki_S[n].Graph, true );
		}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

the Doss

Re: 敵の出現及び消滅処理について質問したいことが・・・

#3

投稿記事 by the Doss » 12年前

softyaさん、書き換えありがとうございます。

一応、数値の確認はしたのですが、
出現している際には                 teki.fulg = 1; //敵が存在している
設定した体力をダメージの合計超えた際には teki.fulg = 0; //敵が存在していない
と表示されているにもかかわらず、敵が表示し続けているのです。
自分が書いた文のどこに不備があるのか、指摘していただけると
助かります。 お願いします。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 敵の出現及び消滅処理について質問したいことが・・・

#4

投稿記事 by taketoshi » 12年前

敵の初期化、残り体力判定、描写を全て一気にやっているところが怪しい気がします。

これでは敵が規定のダメージを超えても直ぐに初期化されて敵は復活しませんか?

the Doss

Re: 敵の出現及び消滅処理について質問したいことが・・・

#5

投稿記事 by the Doss » 12年前

>>これでは敵が規定のダメージを超えても直ぐに初期化されて敵は復活しませんか?
これについてを確かめようと思い、
teki_S[0].HP、teki_S[1].HP、teki_S[2].HP、teki_S[3].HPの数値を確認してみたころ
本来ならば、敵が出現した際には
teki_S[0].HP = 指定した体力
teki_S[1].HP = 0
teki_S[2].HP = 0
teki_S[3].HP = 0
になるはずなのですが、実際は
teki_S[0].HP = 指定した体力
teki_S[1].HP = 指定した体力
teki_S[2].HP = 指定した体力
teki_S[3].HP = 0
になっていたのです。

初期化ではないということが分かったのですが、また別の問題が出てきてしまいました。
なぜ、敵一体で三体分の体力を持っているのかわかりません。
解決にご協力お願いします。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 敵の出現及び消滅処理について質問したいことが・・・

#6

投稿記事 by taketoshi » 12年前

情報が不足しているので以下は推測になります
敵番号0を初期化したいにも関わらず、それ以上に敵が初期化されてしまう原因は

コード:

    for( n = 0; n < teki_kazu; n++ )
        if( teki_S[n].fulg == false && patan == true ) {
            teki_S[n].X = X;
            teki_S[n].Y = Y;
            teki_S[n].idouX = idouX;
            teki_S[n].idouY = idouY;
            teki_S[n].count = 0;
            teki_S[n].HP = HP;
            teki_S[n].score = sukoa;
            teki_S[n].Graph = Graph;
            GetGraphSize( teki_S[n].Graph, &teki_S[n].sizeX, &teki_S[n].sizeY );
            teki_S[n].fulg = true;
            patan = false;
       }
ここで条件式として用いているpatan変数が、敵1を初期化してもfalseにならず
何らかの原因で、ずっとtrueを返しているのだと思います。

patan変数の代入はその前の

コード:

    if( zahyo == haikei.sizeY ) {
        if( patan == false ) {
            patan = true;
        }
    }
ここで行われていますので、デバッカで期待通りに動作をしているか確認しては如何でしょうか。

the Doss

Re: 敵の出現及び消滅処理について質問したいことが・・・

#7

投稿記事 by the Doss » 12年前

コード:

void teki_ugoki( int zahyo, double X, double Y,
                 double idouX, double idouY, int HP,
                 int Graph, int sukoa ) {
    static bool patan;
    static int tasikame;
    /*座標が一致科の確認*/
    if( zahyo == haikei.sizeY ) {
        if( patan == false ) {
            tasikame++;
            patan = true;
        }
    }
と書いて数値を確かめたところ、
整数tasikameは1ではなく3になっていたのです。
ここでわかったことは、座標が一致したときに処理を三回も繰り返していたということです。
ここで問題になってくるのは、どうしたら一度行うだけで済むかということです。
ご協力お願いします。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 敵の出現及び消滅処理について質問したいことが・・・

#8

投稿記事 by へにっくす » 12年前

the Doss さんが書きました:ここでわかったことは、座標が一致したときに処理を三回も繰り返していたということです。
ここで問題になってくるのは、どうしたら一度行うだけで済むかということです。
teki_ugoki関数を呼び出しているコードを掲示してください。
taketoshiさんが情報が不足している、と投稿してるんですが、ちゃんと見てますか?
written by へにっくす

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 敵の出現及び消滅処理について質問したいことが・・・

#9

投稿記事 by taketoshi » 12年前

どうしたら一度で済むのかではなく、何故3回も呼ばれているのかを考えてはいかがでしょうか。
これ以上は情報が不足していますので、こちらも返答できません。

呼び出し元のコードも提示してみてください。

the Doss

Re: 敵の出現及び消滅処理について質問したいことが・・・

#10

投稿記事 by the Doss » 12年前

すみません、情報の不足の意味をはき違えてました。
どの範囲で提示したらいいのか判断がつかないので、現在のすべてのコードを提示しようと思います。

コード:

//宣言部
#include "DxLib.h"		//DXライブラリの使用
#include "stdlib.h"		//ランダム使用
#include "stdio.h"		//基本関数使用
#include "math.h"		//数学的関数使用
#include "windows.h"	//総合的な関数使用
#include "regex"		//正規表現使用
#include "string.h"		//文字列型使用
#include "iostream"		//クラス等オブジェクト使用
#define tama_kazu 16	 
#define PI 3.141592654f
#define teki_kazu 100
int suitti;
int i,n,nn,mod,tasikame;	//制御用変数
bool porse;
long score,highscore;
typedef struct{
	double X,Y,count,size,idouX,idouY;
	bool fulg,patan;
	int HP,sizeX,sizeY,Graph,kazu,score;
}teki_s;
bool atarisikaku(double X1, double Y1, int sizeX1, int sizeY1, 
			  double X2, double Y2, int sizeX2, int sizeY2){
//sizeXは横幅の意、sizeYは縦幅の意。
	if (abs((X1 + sizeX1 / 2) - (X2 + sizeX2 / 2)  ) <=  (sizeX1 + sizeX2) / 2) 
		if (abs((Y1 + sizeY1 / 2) - (Y2 + sizeY2 / 2)  ) <=  (sizeY1 + sizeY2) / 2) 
			return true; 
			else 
			return false;  
}
bool atarimaru(double X1,double X2,double Y1,double Y2,double R1,double R2){
	/*
	R1:円形1の半径
	R2:円形2の半径
	X1:円形1のx座標
	X2:円形2のx座標
	Y1:円形1のy座標
	Y2:円形2のy座標
	*/
	if((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2) <= (R1+R2)*(R1+R2)){
		return true;
	}else{
		return false;
	}
}
teki_s teki_S[teki_kazu];
struct{
	double X[tama_kazu] , Y[tama_kazu];
	int sizeX , sizeY ;
	int Graph;
	int boor[tama_kazu];
	int Leftboor[tama_kazu],Rightboor[tama_kazu];
	int Flag;
	double Up , Down , Left[tama_kazu] , Right[tama_kazu];
}tama;
struct{
	int count[500];
}damage;
struct{ 
	int sizeX[500] , sizeY[500];
	int Graph;
	double color;
	int kazu;
}teki;
struct main{
	//必要変数宣言部
	double X , Y; 
	int sizeX , sizeY;
	int Graph;
	double color;
	int boor[500];
	double bairitu;
	double gamen34;
}
haikei,ziki,gamen,
title,start,stop,sentaku,
hinanjo,titleS,zanki,zankiS,
bom,bomS; //struct main変数
void teki_ugoki(int zahyo, double X, double Y,
				double idouX, double idouY, int HP,
				int Graph, int sukoa){
	static bool patan;
	/*座標が一致科の確認*/
	if(zahyo == haikei.sizeY){
		if( patan == false ){
			patan = true;
		}
	}
	
	for(n=0; n<teki_kazu; n++)
		if(teki_S[n].fulg == false && patan == true){
			teki_S[n].X = X;
			teki_S[n].Y = Y;
			teki_S[n].idouX = idouX;
			teki_S[n].idouY = idouY;
			teki_S[n].count = 0;
			teki_S[n].HP = HP;
			teki_S[n].score = sukoa;
			teki_S[n].Graph = Graph;
			GetGraphSize(teki_S[n].Graph,&teki_S[n].sizeX,&teki_S[n].sizeY);
			patan = false;
			teki_S[n].fulg = true;			
			break;
		}

	for(n=0; n<teki_kazu; n++)
		if(teki_S[n].fulg == true){
			if(teki_S[n].HP <= 0){
				score += teki_S[n].score;
				teki_S[n].fulg = false;
			}
			if(0-teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
			|| 0-teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY)
				teki_S[n].fulg = false;
			teki_S[n].X += teki_S[n].idouX;
			teki_S[n].Y += teki_S[n].idouY;
			for(i=0; i<tama_kazu; i++)
				if(atarisikaku(teki_S[n].X,teki_S[n].Y,teki_S[n].sizeX,teki_S[n].sizeY,
				tama.X[i],tama.Y[i],tama.sizeX,tama.sizeY) == true
				&&  tama.boor[i] == true){
					teki_S[n].HP--;
					tama.boor[i] = false;
				}
			DrawGraph(teki_S[n].X,teki_S[n].Y,teki_S[n].Graph,true);
		}
}
void menyu(void){
	DrawGraph(title.X , title.Y , title.Graph , true);
	DrawGraph(start.X , start.Y , start.Graph , true);
	DrawGraph(stop.X , stop.Y , stop.Graph , true);
	DrawGraph(start.X , start.Y , start.Graph , true);
	DrawGraph(sentaku.X , sentaku.Y , sentaku.Graph , true);
	/*フルスクリーン処理
	ChangeWindowMode(false);*/
	if(CheckHitKey(KEY_INPUT_DOWN)&& suitti == 0)
		suitti = 1;
	if(CheckHitKey(KEY_INPUT_UP)&& suitti == 1)
		suitti = 0;
	switch(suitti){
	case 0 :
		sentaku.Y = start.Y + start.sizeY / 2 - sentaku.sizeY / 2;
	break;
	case 1 :
		sentaku.Y = stop.Y + stop.sizeY / 2 - sentaku.sizeY / 2;
	break;
	}
	WaitTimer(10);
}
void men1(void){
//内容
	//画面3 : 空白1
	//画面の中には背景、自機
	//空白の中には下から
	//現スコア、ハイスコア、ボム、残機、タイトル
	//自機の座標はX=画面の半分 Y=画面下
	char sukoa[10],haisukoa[10];
	sprintf(sukoa,"%d",score);
	sprintf(haisukoa,"%d",highscore);
	DrawExtendGraph(0,-haikei.sizeY,gamen.gamen34,haikei.Y,haikei.Graph,true);
	DrawGraph(ziki.X,ziki.Y,ziki.Graph,true);
	DrawString(gamen.sizeX - 140,gamen.sizeY -20 -45,sukoa,(255,255,255));
	DrawString(gamen.sizeX - 140,gamen.sizeY -20 -110,haisukoa,(255,255,255));
	DrawString(gamen.sizeX - 140,gamen.sizeY -20 -65,"今スコア",(255,255,255));
	DrawString(gamen.sizeX - 140,gamen.sizeY -20 -130,"ハイスコア",(255,255,255));
	DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60,bomS.Graph,true);
	DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60,zankiS.Graph,true);
	DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60 -20 -130,titleS.Graph,true);
  	mod++;
	if(mod == 120)
		mod = 0;
	if(haikei.sizeY > 0 && mod % 3 == 0){
	haikei.sizeY--;
	haikei.Y++;
	}
}
void syoki(void){
	//必要分の初期設定のサブルーチン
	
	//使用画像取得
	ziki.Graph = LoadGraph("ziki.png");
	ziki.Graph = LoadGraph("自機.png");
	teki.Graph = LoadGraph("teki.jpg");
	tama.Graph = LoadGraph("tama.png");
	haikei.Graph = LoadGraph("背景.jpg");
	title.Graph = LoadGraph("タイトル.jpg");
	bomS.Graph = LoadGraph("tama.png");
	zankiS.Graph = LoadGraph("tama.png");
	titleS.Graph = LoadGraph("tama.png");
	start.Graph = LoadGraph("スタート.bmp");
	stop.Graph = LoadGraph("終わり.bmp");
	sentaku.Graph = LoadGraph("やじるし.png");

	//画像のサイズ取得
	gamen.sizeX = 640;
	gamen.sizeY = 480;
	gamen.color = 32;
	GetGraphSize(ziki.Graph,&ziki.sizeX,&ziki.sizeY);
	for(i=0; i<500; i++)
	GetGraphSize(teki.Graph,&teki.sizeX[i],&teki.sizeY[i]);
	GetGraphSize(tama.Graph,&tama.sizeX,&tama.sizeY);
	GetGraphSize(haikei.Graph,&haikei.sizeX,&haikei.sizeY);
	GetGraphSize(title.Graph,&title.sizeX,&title.sizeY);
	GetGraphSize(start.Graph,&start.sizeX,&start.sizeY);
	GetGraphSize(stop.Graph,&stop.sizeX,&stop.sizeY);
	GetGraphSize(sentaku.Graph,&sentaku.sizeX,&sentaku.sizeY);

	//自由計算場(コメントで説明を書いてね)
	gamen.gamen34 = gamen.sizeX * 3 / 4; //画面の3分の4の大きさの取得
	haikei.Y = gamen.sizeY;
	gamen.bairitu = gamen.gamen34 / haikei.sizeX;

	//画像の座標取得
	ziki.X = gamen.gamen34 / 2 - ziki.sizeX / 2;
	ziki.Y = gamen.sizeY - ziki.sizeY - 10;
	title.X = gamen.sizeX / 2 - title.sizeX / 2;
	title.Y = gamen.sizeY / 4 - title.sizeY / 2;
	start.X = gamen.sizeX / 2 - start.sizeX / 2;
	start.Y = gamen.sizeY / 2;
	stop.X = gamen.sizeX / 2 - stop.sizeX / 2;
	stop.Y = start.Y + start.sizeY + 20;
	sentaku.X = start.X - sentaku.sizeX - 10;
	for(i=0;i>tama_kazu;i++){
		tama.X[i] = ziki.X + ziki.sizeX / 2 - tama.sizeX / 2;
		tama.Y[i] = ziki.Y + 15;
		tama.boor[i] = 0;
	}
	//倍率
	//内容
	//画面3 : 空白1
	//画面の中には背景、自機
	//空白の中には下から
	//現スコア、ハイスコア、ボム、残機、タイトル
	//自機の座標はX=画面の半分 Y=一番下から登場時に+10
	
}
void player(void){
	//自機の移動用サブルーチン
	if(!CheckHitKey(KEY_INPUT_LSHIFT)){
		if( CheckHitKey(KEY_INPUT_UP) == 1 &&
			ziki.Y > 0){
			ziki.Y -= 3;
		}
		if( CheckHitKey(KEY_INPUT_DOWN) == 1 &&
			ziki.Y < gamen.sizeY - ziki.sizeY){
			ziki.Y += 3;
		}
		if( CheckHitKey(KEY_INPUT_LEFT) == 1 &&
			ziki.X > 0){
			ziki.X -= 3;
		}
		if( CheckHitKey(KEY_INPUT_RIGHT) && 
			ziki.X < gamen.gamen34 - ziki.sizeX){
			ziki.X += 3;
		}
	
	}else if(CheckHitKey(KEY_INPUT_LSHIFT)){
		if( CheckHitKey(KEY_INPUT_UP) == 1 &&
			ziki.Y > 0){
			ziki.Y--;
		}
		if( CheckHitKey(KEY_INPUT_DOWN) == 1 &&
			ziki.Y < gamen.sizeY - ziki.sizeY){
			ziki.Y++;
		}
		if( CheckHitKey(KEY_INPUT_LEFT) == 1 &&
			ziki.X > 0){
			ziki.X--;
		}
		if( CheckHitKey(KEY_INPUT_RIGHT) && 
			ziki.X < gamen.gamen34 - ziki.sizeX){
			ziki.X++;
		}
	}
}
void syotto(void){
	// Zキーを押した場合は処理を分岐
	if( CheckHitKey( KEY_INPUT_Z ) ){	
		// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
		for( i = 0 ; i < tama_kazu ; i ++ ){
			// 弾iが画面上にでていない場合はその弾を画面に出す
			if( tama.boor[i] == 0 ){
				// 弾iの位置をセット、位置はボール君の中心にする
				tama.X[i]     = ( ziki.X + ziki.sizeX / 2 - tama.sizeX / 2);
				tama.Y[i]     = ( ziki.Y + 15);
				// 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する
				tama.boor[i] = 1 ;					
				// 一つ弾を出したので弾を出すループから抜けます
				break ;
			}
		}
	}
	// 弾の数だけ弾を動かす処理を繰り返す
	for( i = 0 ; i < tama_kazu ; i ++ )
	{
		// 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
		if( tama.boor[i] == 1 ){
			// 弾iを5ドット上に移動させる
			tama.Y[i] -= 20 ;
		// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
		if( tama.Y[i] < 0 ){
			tama.boor[i] = 0 ;
		}	
		// 画面に弾iを描画する
		DrawGraph( tama.X[i] , tama.Y[i] , tama.Graph , true ) ;
		}
	}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(true);
	SetGraphMode(gamen.sizeX , gamen.sizeY , gamen.color);
	DxLib_Init();	// DXライブラリ初期化処理
	syoki();
	while(1){
		if(CheckHitKey(KEY_INPUT_Z)&& suitti == 0)
			break;
		if(CheckHitKey(KEY_INPUT_Z)&& suitti == 1)
			goto a;
		ClearDrawScreen(); // 画面を消す
		menyu();
	}
	while(1){
		if(porse == false){
			if(CheckHitKey(KEY_INPUT_RETURN)){
				//Enter二回で強制終了
				break;
			}
			if(CheckHitKey(KEY_INPUT_ESCAPE) && porse == false){
				WaitTimer(100);
				porse = true;
			}
			highscore = score;
			//数値確認
			printfDx("%d\n%d\n%d\n%d\n%d\n%d\n"
				,haikei.sizeY , tasikame , teki_S[4].HP , teki_S[0].fulg , teki_S[1].fulg , teki_S[2].fulg);
			ClearDrawScreen(); // 画面を消す
			men1();
			player();
			syotto();
			/*敵の出現座標は一面の初期値:haikei.sizeY(1525)から引いて計算する
			例)haikei.sizeY == 1525 : 最初っから出てくる
			haikei.sizeY == 775  : 一面が半分まで言ったら出てくる
			haikei.sizeY == 0    : 最後で出てくる*/
			teki_ugoki(1500,0,0,1,1,50,teki.Graph,50);
			DrawGraph(ziki.X , ziki.Y, ziki.Graph ,true);
			ScreenFlip(); //裏画面を表画面に反映
		}
		if( porse == true ){
			ClearDrawScreen(); // 画面を消す
			DrawString(240,240,"一時停止中",(255,255,255));
			if(CheckHitKey(KEY_INPUT_ESCAPE) && porse == true){
				WaitTimer(100);
				porse = false;
			}
			ScreenFlip(); //裏画面を表画面に反映
		}
	}
	a:;
	DxLib_End();	// DXライブラリ終了処理
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 敵の出現及び消滅処理について質問したいことが・・・

#11

投稿記事 by softya(ソフト屋) » 12年前

最新のコードではpatan = false;にしているようですが、これではダメですか?
あと自機の座標を基準にしているようですが、前後に動くと何回も同じ座標を指しませんか? 大丈夫なら良いのですが。
デバッガでちゃんと追いかけきれていないなら、printfデバッグ法をおすすめします。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2

【補足】画像データがないので、動作は確認できておりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 敵の出現及び消滅処理について質問したいことが・・・

#12

投稿記事 by taketoshi » 12年前

苦言になりますがコードが非常に読みにくいです。
menyu等のローマ字表示は止め、menuと誰が見ても判るように書くべきだと思います。
後々、自分で読み返しても解読が困難になると思います。

3回も呼ばれているのを考えてはどうかと書きましたが、何故3回呼ばれているか考えたでしょうか?

コード:

    if(zahyo == haikei.sizeY){ 
       if( patan == false ){
            patan = true;        
       }
    }
このteki_ugoki関数を呼び出しているwhileループの中でここの条件式内の
数値が変化していないループがあるので3回呼ばれているのです。
今回提示いただいたコードではzahyoは1500固定なので、怪しいのはhaikei.sizeYの数値です。
この変数を増減させている箇所があるはずです。


men1関数内に怪しいウェイトありませんか。


*誤字修正

the Doss

Re: 敵の出現及び消滅処理について質問したいことが・・・

#13

投稿記事 by the Doss » 12年前

>>最新のコードではpatan = false;にしているようですが、これではダメですか?
・特に変化は見られませんでした、、、

>>あと自機の座標を基準にしているようですが、前後に動くと何回も同じ座標を指しませんか? 大丈夫なら良いのですが。
・前後に動く分には特に問題はありませんでした。

>>苦言になりますがコードが非常に読みにくいです。
menyu等のローマ字表示は止め、menuと誰が見ても判るように書くべきだと思います。
後々、自分で読み返しても解読が困難になると思います。
・これについては個人で制作していたものなので、気にかけていませんでした、これから修正していきたいと思います。

>>3回も呼ばれているのを考えてはどうかと書きましたが、何故3回呼ばれているか考えたでしょうか?
このteki_ugoki関数を呼び出しているwhileループの中でここの条件式内の
数値が変化していないループがあるので3回呼ばれているのです。
今回提示いただいたコードではzahyoは1500固定なので、怪しいのはhaikei.sizeYの数値です。
この変数を増減させている箇所があるはずです。
men1関数内に怪しいウェイトありませんか。
・この意見が気になり、調べてみたところ、見事に解決できました。
どうやら原因は、

コード:

void men1(void){
//内容
    //画面3 : 空白1
    //画面の中には背景、自機
    //空白の中には下から
    //現スコア、ハイスコア、ボム、残機、タイトル
    //自機の座標はX=画面の半分 Y=画面下
    char sukoa[10],haisukoa[10];
    sprintf(sukoa,"%d",score);
    sprintf(haisukoa,"%d",highscore);
    DrawExtendGraph(0,-haikei.sizeY,gamen.gamen34,haikei.Y,haikei.Graph,true);
    DrawGraph(ziki.X,ziki.Y,ziki.Graph,true);
    DrawString(gamen.sizeX - 140,gamen.sizeY -20 -45,sukoa,(255,255,255));
    DrawString(gamen.sizeX - 140,gamen.sizeY -20 -110,haisukoa,(255,255,255));
    DrawString(gamen.sizeX - 140,gamen.sizeY -20 -65,"今スコア",(255,255,255));
    DrawString(gamen.sizeX - 140,gamen.sizeY -20 -130,"ハイスコア",(255,255,255));
    DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60,bomS.Graph,true);
    DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60,zankiS.Graph,true);
    DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60 -20 -130,titleS.Graph,true);
    mod++;
    if(mod == 120)
        mod = 0;
    if(haikei.sizeY > 0 && mod % 3 == 0){
    haikei.sizeY--;
    haikei.Y++;
    }
}
の3で割った余りの時のみ動かしていた部分だったようです。
ご協力ありがとうございました。

閉鎖

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