ページ 11

弾消しフラグ。

Posted: 2008年11月07日(金) 20:24
by situmon
シューティングの館で、
敵を倒しても弾が撃ち続けられる問題で、
if( (int)sqrt(x*x+y*y) < range+enemy.range){
                                                        if(enemy.hp <= 0){
                                                                enemy.flag=0;
													            if(enemy.flag==1)//その敵のショットが出現中なら
                                                                EnemyShot[j].flag==0;//弾を消す。

とすれば
敵が倒されるときに玉を消すことができるかと思ったのですが、実際には消えませんでした。
どのように指定すればいいのでしょうか?

追記 

自分の学校は前期 後期 だけですので期末ではなく中間になります。
回数が少ないのですがその分範囲が広いです。

Re:弾消しフラグ。

Posted: 2008年11月07日(金) 21:08
by 初級者
>EnemyShot[j].flag==0;//弾を消す。

0と比較しています。そうしたいのですか?

Re:弾消しフラグ。

Posted: 2008年11月08日(土) 02:14
by Dixq (管理人)
代入はイコール一つ。
比較はイコール二つです。

Re:弾消しフラグ。

Posted: 2008年11月08日(土) 09:59
by situmon
間違えました。ありがとうございました。
でも、敵を倒すと発射フラグを0にするとすれば、できるとおもったのですが
なんのフラグが発射フラグなのでしょう。
・・・略
if(enemy.hp <= 0){
enemy.flag=0;
EnemyShot.flag=0;
・・・
いろいろと試しましたが、上記は失敗でした。

Re:弾消しフラグ。

Posted: 2008年11月08日(土) 14:30
by Dixq (管理人)
発射フラグを0にしてしまうと現在計算中の弾も消えてしまいます。
ですから敵のフラグを一時的に2にするなど、それ以上登録しないようにして、
その敵が発射した弾が全て画面外へ出てから0にするべきです。

EnemyShotsの大元のフラグはEnemyShotの.flagです。

Re:弾消しフラグ。

Posted: 2008年11月08日(土) 15:00
by situmon
やはりできません。
敵が弾を発射している途中に倒したらそこで発射をやめる
という風にしたいのですが・・・
0は消す、1はあるというくらいならわかるのですが。

Re:弾消しフラグ。

Posted: 2008年11月08日(土) 17:40
by Dixq (管理人)
別にそれようの変数を作ってもいいですし、.flagを利用するなら
倒された瞬間敵の.flagを2にし、敵の.flagが2である時はそれ以上その敵から発射されている弾を登録しないで、
その敵から発射された弾が全て画面外に出たら.flagを0にすればいいと思いますよ。

Re:弾消しフラグ。

Posted: 2008年11月08日(土) 22:26
by situmon
では枠外を指定すればいいのでしょうが
枠外を指定する方法がわかりません。

Re:弾消しフラグ。

Posted: 2008年11月09日(日) 15:53
by Dixq (管理人)
枠外を指定するという意味がよくわからないですが、
弾が全部外にあるかどうかは、弾のフラグを全部調べて、全てオフだったら弾が全部外にあることがわかると思います。

Re:弾消しフラグ。

Posted: 2008年11月09日(日) 19:56
by situmon
全てオフだったら 

というのはif分を使えばいいのでしょうが、
すべてオフだったらとはどういう意味でしょう。

Re:弾消しフラグ。

Posted: 2008年11月09日(日) 20:37
by Dixq (管理人)
例えば

int a[100];

この配列に入っている要素が全て0かどうかは

for(i=0; i<100; i++){
  if(a[0]!=0){
    break;
  }
}
if(i==100){
  //この時全て0だったことがわかる。
} 

または

int flag = 0;

for(i=0; i<100; i++){
  if(a[0] != 0){
    flag = 1;
    break;
  }
}
if(flag == 0){
  //この時全て0だったことがわかる。
} 

で確認出来ますよね?

Re:弾消しフラグ。

Posted: 2008年11月09日(日) 21:06
by situmon
宣言 flagは0を代入。

繰り返す(iは0を代入。100回繰り返す。{iが100より小さい iをインクリメント(+1)}
もし(aが0と等しくないなら)
flagに1を代入。

もし(flag と 0 を比較){


こういう意味であっていますよね。
だからa[0]をEnemyShotに変えてやればいいのですか。

for(i=0; i<100; i++){
if(EnemyShot!=0){
break;
}
}
if(i==100){
EnemyShot.flag=1;
} 
ではないのですか?

Re:弾消しフラグ。

Posted: 2008年11月09日(日) 21:15
by Dixq (管理人)
EnemyShotは弾幕データですよね。
そして弾幕データの中に1つ1つの弾のデータが入っていますよね?
ですから、
EnemyShot[0]とEnemyShot[1]の弾幕データは別物です。
弾幕データが持つ全ての弾のフラグを確認すればいいのです。
今一度構造体の仕組みを確認して下さい。

Re:弾消しフラグ。

Posted: 2008年11月12日(水) 22:27
by situmon
宣言を見ればいいのですか?
int型など

Re:弾消しフラグ。

Posted: 2008年11月13日(木) 12:42
by Dixq (管理人)
もし構造体の構造を確認したいのであれば定義を見てください。
変数名を右クリックして「宣言に移動」「定義に移動」すると宣言や定義に移動しますから、
確認しやすいかと思います。

もし意味がよくわからない場合は、変数を最初から自分で作ってみてはどうでしょう。
自分にしっくりくる名前にしたほうが後々わかりやすいと思います。

Re:弾消しフラグ。

Posted: 2008年11月14日(金) 22:16
by situmon
やはり別物という意味がわからないのですが・・・

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 02:05
by 木霊
 situmonさん、一度今のゲーム製作を中断してC言語の基礎からやり直した方が良いのではないですか?
 問題にぶつかって質問をしても、自分で考える気が全く無いのであれば根本的に解決しません。
 確か、今作ってるゲームは「卒業制作」と記憶していますが、
管理人さんのコードを他ならぬ管理人さん自身に改変してもらってコピペしているだけ、
の製作方法(とは言えませんが)では完成までにあと何年掛かるか分かりません。
 それで間に合いますか?それを胸を張って自分の作品と言えますか?

 今のsitumonさんに一番必要なのは、自分の頭を使って考える事です。
 基礎を理解する為の努力をせず、文字通り全て教えてもらっているのでは力も付きません。
「弾を消す」それだけの事で既に一週間もやり取りをされていますが、situmonさん自身に
使われている変数(構造体等)を理解しようという気があれば、たった一日で解決している問題です。

「急がば回れ」「急いては事を仕損じる」という諺はご存知ですよね?
 現状のsitumonさんでしたら質問の回答待ちの時間の方が圧倒的に長いですから、しばらく中断して
学習しなおした方が有意義に時間を使えますし、その後の作業効率も比べ物にならない程に上がると思います。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 04:51
by Dixq (管理人)
あら、中学生って言ってませんでしたっけ? 違ったかな^^;

確かに基礎がしっかりしていないと逆に余計に遠回りになってしまいます。
一度C言語入門系のサイトを熟読して色んなサンプルをコンパイルしていって、
プログラムに慣れた方がいいかもしれません。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 14:17
by situmon
>あら、中学生って言ってませんでしたっけ? 違ったかな^^;

はい、そうです。中学1年です。

>C言語入門系のサイトを熟読

明快入門C++を見ながらやっていますが、その中のサンプルはif文ならif文だけfor文ならfor文だけにしてあって理解できるのですがゲームになるとたくさんの文を応用してあるのでわからなくなってしまうのです。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 14:48
by situmon
やっとなんとなくわかりました。

弾幕データが持つ全ての弾のフラグであるiとjを消せばいいので

EnemyShot.EnemyShots[j].flag=0;でしょうか?

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 17:29
by Dixq (管理人)
iとjを消したらだめです。
iは弾幕データです。jはそれに属する弾データです。
私が弾幕データといっているのは、
例えば敵Aが発射した弾幕があったとします。
その敵Aが発射した、弾の最大数分弾幕データは弾情報を持っています。
そのまとまりが弾幕データです。

ですから、消すのは弾幕データが持っている弾データつまりjです。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 20:30
by 木霊
>はい、そうです。中学1年です。

 そうでしたか。他の方と混同してしまっていたようです。すみません。

 質問内容を見ると今回が初めてのプログラミングのように思えるのですが、
改変していくには敷居が高過ぎるのではないかと思います。
 課題でないのならなおさら、前回のトピで他の方に紹介されたサイトでじっくりと
勉強された方がいいのではないでしょうか?
 それだけ若いのであれば吸収・理解が早いのでそんなに長く中断しなくても済みます。
 また、管理人さんがよく例に出される「じゃんけんゲーム」ぐらいの長さのコードを読んで
変数の意味を調べてみたり、別の値を入れてみてトライ&エラーで慣れていったほうがいいと思います。
 この先、改変を続けていくにしても変数一つ一つの意味を理解出来ずに続けては早晩行き詰ります。
(というか、既に詰まってますが・・・)その都度、質問するにしても限度があります。
 ゲーム製作に熱意があるのは分かりますが、今の製作状況では完成までその熱意が持つかも分かりません。
 まずは本当に小さなものから作り上げて(改変でも)「完成させる喜び」を感じて熱意を維持してください。

 それでは、再度の横槍失礼しました。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 21:13
by situmon
二人ともありがとうございました。
iがなにか理解できなかったのですが少しわかりました。
<課題でないのならなおさら、前回のトピで他の方に紹介されたサイトでじっくりと
 勉強された方がいいのではないでしょうか?

明快入門C++ビギナー編でもいいのでしょうか。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 21:19
by situmon
じゃんけんのコードなら理解できました。
簡単なことでも複雑になるとわからなくなってしまうのでよく読まなければいけませんね・・・

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 22:58
by situmon
あとこんどこそいろいろなことに気をつけて
タイトル画面
を作ることに挑戦したのですが
#include "DxLib.h"
#include "GlobalVariable.h"

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}

void char_disp(int White,int y){
        DrawString( 150 , y   , "⇒"            , White );
        DrawString( 170 , 100 , "NEW GAME"  , White );
        DrawString( 170 , 120 , "END" , White );
}


void message_box(){
        int flag;
        flag=MessageBox(
                NULL ,
                TEXT("ウィンドウモードで起動しますか? おすすめ") ,
                TEXT("スクリーン設定") , 
                MB_YESNO | MB_ICONQUESTION );
        if(flag==IDYES)
                ChangeWindowMode( TRUE );
}

int WINAPI WinMain( HINSTANCE hInstance, 
				   HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	
	extern void img_sound_load();
	extern void initialization();
	extern void SetColor();
	extern void Background();
	extern void PlayerShotCalc();
	extern void PlayerShotDisp();
	extern void PlayerControl();
	extern void EnemyControl();
	extern void EnemyCalcDisp();
	extern void EnemyShotControl();
	extern void EnemyShotCalcDisp();
	extern void CollisionDetection();
    extern void playerCollisionDetection();
	extern void Background2();
	extern void FpsTimeFanction();
	int RefreshTime=0;
    int White , y=100;                                       //色とy座標の宣言

    message_box();
	if( DxLib_Init() == -1 ) return -1; 

	SetDrawScreen( DX_SCREEN_BACK ) ;		   //裏画面を使用する。

	img_sound_load();
	initialization();
	SetColor();

    White = GetColor( 255 , 255 , 255 ) ;                    //色の取得

	while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
		RefreshTime = GetNowCount();		  //今の時間を取得
		ClearDrawScreen();					  //裏画面のデータを全て削除

SetMainWindowText( "悲しみの王女 ~ver 1.01~" ) ;

        if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
        // たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
            y+=20;                                           
            if(y==140)                            // y座標が260なら(選択が一番下なら)
                y=100;                        // 選択座標を一番上に
            if(y==120 && Key[KEY_INPUT_RETURN]== 1)
				goto End;
            if(y==100 && Key[KEY_INPUT_RETURN]== 1)
                goto Opening;
        } 

Opening:

		if(CheckSoundMem(sound_bgm[0])==0)
			PlaySoundMem(sound_bgm[0],DX_PLAYTYPE_BACK);

		Background();

		PlayerShotCalc();
	    
		PlayerShotDisp();

		PlayerControl();
		
		EnemyControl();

		EnemyCalcDisp();

		EnemyShotControl();

		EnemyShotCalcDisp();
		
		CollisionDetection();

		playerCollisionDetection();

		Background2();

		FpsTimeFanction();

		ScreenFlip() ;						  //裏画面データを表画面へ反映

		counter++;

		if(Key[KEY_INPUT_ESCAPE]==1)	break;  //Escapeが押されたら終了
		while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
	}
End:
	DxLib_End() ;
	return 0 ;
}

では表示されませんでした。
これであっているのではないですか?

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 23:27
by 木霊
 複雑になるなら、簡単にしてしまいましょう。
 中学生なら英語の授業で訳したりしますよね。
 その時に、文章をまとめて訳すのではなくて、単語ごとに分けて辞書を引きませんか?
 落ち着けばちゃんと理解できます。
 諦めるのが早すぎるので理解できないと思い込んでいるだけです。
 慣れるまではコードの横にコメントで何をしているのかを書いていけば混乱も少なくなるでしょうし、
変数の意味(何の為にあるのか)が分かれば、その変数の横にコメントを書いていけば時間が経っても
大丈夫でしょう。
 数が多いのであれば、現実のノートやメモ帳に書いておいて分からなくなった時に見返してみるのも
良いかもしれません。

 ただ、先にも伝えましたがシューティングの館のコードは分割もされていて、初心者が改変していくには
敷居が高すぎると思います。
 まずはその理解した「じゃんけんゲーム」を練習台として改変してみてはどうですか?
 例えば、
1・五回勝負にして、それぞれの手を出せる回数を限定する(手を出した回数をフラグで管理)
2・勝った時の手によって点数を変える
3・後出しを認めて、対戦相手によって後出しの出来る時間を変える(配列で時間を管理)
4・1対1ではなく3人以上同時参加(if文の総当りでは複雑になるので工夫が必要)
5・相手がフェイントを仕掛けてくる

 今situmonさんが作ろうとしているものに比べると完成した所で「ショボイ」かもしれません。
 ですが、1・3あたりをスムーズに作れるようになった頃にはきっと、前回や今回のような所では
躓かなくなるはずです。


>iがなにか理解できなかったのですが少しわかりました。

EnemyShot.EnemyShots[j].flagのiの事ですか?
 多分ここのi、jは何らかの数字が入る以外に意味は無いと思います。
 そもそもiやjは別の言語でループの際に使われていたから、というものですから
数学のa、b、xぐらいの意味だと思います。

>iは弾幕データです。jはそれに属する弾データです
 と言うのは、つまり
・弾幕データ[i番目].弾データ[j発目].画面にあるかのフラグ
と言う事だと思います。
弾幕データ1・・・弾データ1・・・画面にあるかのフラグ
                2・・・画面にあるかのフラグ
                3・・・画面にあるかのフラグ
                4・・・画面にあるかのフラグ(これが0なら画面には無い)

     2・・・弾データ1(上の「弾データ1」とは名前が同じだが住所が違うので別物)
     3
     4

 弾幕データと言うと言葉がかぶって分かりにくいかもしれませんので、
学校の「クラス」に置き換えると分かりやすいかも

1組・・・○○君・・・出席してるかのフラグ
     □□君・・・出席してるかのフラグ
     △△君・・・出席してるかのフラグ
     ××君・・・出席してるかのフラグ(0なら欠席)
2組・・・○○君(同じ名前だがクラスが違うので別人)
3組
4組

・・・あくまで管理人さんの書き込みからの理解ですので間違っているかもしれませんが、
多分こういうことです。
 situmonさんの考えと同じでしたか?
 自分の理解が違っていたらフォローお願いします。

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 23:37
by 木霊
 と、書き込みを推敲してる間にsitumonさんの投稿が・・・

 situmonさん、一度にあちこちやっていくのではなくて、一つ一つ問題を解決していきましょう。
 ある部分での理解も不十分なまま違う所をやってしまうとごちゃごちゃに混ざってしまいますよ?
 それこそNo24102の自分の投稿の様に・・・

>明快入門C++ビギナー編でもいいのでしょうか

 大丈夫だと思いますよ

Re:弾消しフラグ。

Posted: 2008年11月15日(土) 23:48
by Dixq (管理人)
あれ、今弾消しやってたのでは?それはもう解決して次に挑戦中ですか?

char_dispが追加されているのはわかりますが、どこにも呼ばれていませんよね?

あとオープニングにシューティングに必要な関数を呼ぶ必要は無いですよね。
スイッチ文を作るかまずそれらを消してオープニング処理だけ書いてみてはどうでしょう。

goto文は使わない方がいいです。
goto文の適切な使い方もありますが、ここでは使うべきではないでしょう。
しかもこのままではgoto文をせっかく書いているのに何度も素通りしていると思います。

また、SetMainWindowTextは何度も呼ばなくていいです。
最初だけにしましょう。

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 00:28
by situmon
<今弾消しやってたのでは?
EnemyShot[j].flag=2;
としたらできたのですがそれではないのでしょうか?
あとタイトル画面の問題は中断し
木霊さんのじゃんけんからがんばりたいです。

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 01:16
by 木霊
>EnemyShot[j].flag=2;
>としたらできたのですがそれではないのでしょうか?

 それだけだと、「なぜそうなったのか?」が分かっていませんよね?
 でたらめやってたら偶然出来た、のではそこにどんなバグが潜んでいるか分かりません。
 別の場所を改変していたら、強制終了するようになった・・・ってこともありえない話じゃないです。
 なぜ期待した通りに動くようになったのか、コードを追ってみて下さい。

>木霊さんのじゃんけんからがんばりたいです。

 そうですか、でしたら最初に十戦終わったら勝敗を表示するようにしてみてください。
 配列への代入と表示にfor文とif文(switch文)を使うので、それらの練習と復習を兼ねてます。
 そんなに難しくないので落ち着けばきっと大丈夫です。

 まずは使われている変数がどんな役割を持っているのか?
それを把握していかないと改変は難しいですよ。(と言うか、自分には無理です)

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 11:44
by situmon
< それだけだと、「なぜそうなったのか?」が分かっていませんよね?

1なら表示する、0なら消す。2はどちらでもないので表示されない。

だからフラグを2にすれば表示されない。

<  そんなに難しくないので落ち着けばきっと大丈夫です。

それがコツですね。

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 18:43
by situmon
今回は本当にありがとうございました。
 
弾消しフラグではない問題に移ったので別のスレに書き直そうと思ったのですが
迷惑をかけてしまったみたいですいません。
void syouhai(){
if(state==1)
y++; //やった回数をインクリメント。
if(state==2)
k++;  //勝った回数をインクリメント。
y++; //やった回数をインクリメント。
}
void kekka(){
if(y==10)//やった回数が10回ならば
DrawFormatString(150,50,GetColor(255,255,255),"%s","***勝負の結果は・・・***");//勝負の結果を表示
}
としたのですが表示されませんでした。

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 20:05
by array
いきなりですが
多分、上記のプログラム(消えてますが)だと、木霊さんの思う回答になっていないんじゃないかと思って

じゃんけんゲームのポイント
1.グー、チョキ、パー をどうやって入力するか
2.相手の、グー、チョキ、パー をどう決めるか
3.勝敗はどうやって判定するか(引き分けも含む)

大きく分けて、こういのが重要になってくると思います。
勝敗の判定は、言葉で、こうすれば出来るよ。と簡単に言えるかもしれません。

この3点を是非プログラムで考えてください。結果表示はその次だと思います。


------ 追記 ------

> 今回は本当にありがとうございました。

戻してとは言いませんが・・・。
レスが付いた後に大雑把に内容を変更するのは以後やめてほしいです^^;
精神的にショックですので。

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 22:49
by 木霊
>1なら表示する、0なら消す。2はどちらでもないので表示されない。
>だからフラグを2にすれば表示されない。

 元のコードを知らないので断言はできませんが、半分正解、半分間違いです。

 1なら表示、0なら消す。ここまでは大丈夫です。
 でも2は「何をするか決めていない」はずです。なぜなら「2になることは無い」という前提で
プログラムしているはずだからです。
 今回は、偶然期待した結果と同じ動作をしただけで、何が起こってもおかしくないと
考えておいた方がいいと思います。
 それこそ、使っているパソコンのハードディスクが初期化されるぐらいのことが起こっても仕方が無いぐらいです。(ある本での「未定義の動作について」の引用なので少し脅しすぎですけどw)

 それに2にして表示されないのであれば0にしたときも表示されないはずですが、そうなってないのならば
問題はまだそこにあるので解決はしてません。

Re:弾消しフラグ。

Posted: 2008年11月16日(日) 23:48
by situmon
0にしても表示されないのですが、
敵が新しくフラグを立てたときに
一度0にしたはずの画像がまたでてきてしまうので
2にしました。

Re:弾消しフラグ。

Posted: 2008年11月17日(月) 00:07
by 木霊
 それなら敵が新しくフラグを立てるところで問題があるという事です。
 この問題を解決しなければ2体以上の敵を同時に出現させる事ができないかもしれませんよ?

 そのやり方は、問題を解決するどころかさらに問題を増やす事になりかねません。
 夏休み明けの登校日に、宿題をやってもいないのに「持ってくるのを忘れました」と言ってその日を
乗り切ろうとしているのと同じ事です。
 「エラーが出ないバグを放置」しているだけ、と言えるかもしれません。

Re:弾消しフラグ。

Posted: 2008年11月17日(月) 15:46
by Dixq (管理人)
その「2」にしたフラグを0に戻す処理はしていますか?
前にも書きましたけど、2の時はそれ以上弾を登録しないようにし、弾の起動は計算します。
画面内の弾が全て無くなったら2にしたフラグを0にする必要があります。
こうしないと全部弾幕データが2になるとそれ以上弾幕データが登録できなくなります。

バグは見た目に見えるものだけではなく、内部にあるものも取り除かなくてはなりません。

Re:弾消しフラグ。

Posted: 2008年11月17日(月) 19:29
by situmon
じゃんけんゲームの元は一応できました。
あともう一度弾消しフラグ挑戦します。

Re:弾消しフラグ。

Posted: 2008年11月18日(火) 00:19
by 木霊
>前にも書きましたけど、2の時はそれ以上弾を登録しないようにし、弾の起動は計算します。

あ、そうでしたか・・・では2であっていたのですね。
管理人さん、situmonさん、申し訳ありません。

Re:弾消しフラグ。

Posted: 2008年11月18日(火) 01:01
by Dixq (管理人)
いや、話の流れからいくと、恐らく2を0に戻す処理は出来てないのではないかな?と思って書きました。
木霊さんがおっしゃっていることは特に間違っていないと思いましたがどうでしょう。
もし既に実装済みだったらごめんなさい。
まぁ改造が難しければ、少しずつDXライブラリになれて自分で作っていくのが一番ですね。

Re:弾消しフラグ。

Posted: 2008年11月18日(火) 01:37
by 木霊
>もし既に実装済みだったらごめんなさい。

 いえ、多分実装されて無いのではないかと・・・「2にしたらできた」と仰ってますから、
フラグの意味も割りと曖昧なままここまでやってきたように思います。

>まぁ改造が難しければ、少しずつDXライブラリになれて自分で作っていくのが一番ですね。

 最終的にはそうですけど、本人にやる気がありますから処理や変数を把握しないまま質問攻めに
する癖を控えれば、その(改変した)ゲームを遊べるのではないかと期待してます。
 それに他人のコードを読むのは一から作るよりも勉強になりますから。
 ただ、取り組み姿勢がちょっと・・・と思ったものですから。
 結果優先で過程への理解を疎かにしてる節が感じられましたので、口を出してしまいました。


 期待といえば四聖2が最近の一番なんで管理人さんにはもっと頑張ってもらわないとw
 自分のはこのままエターナりそうなんで・・・orz

Re:弾消しフラグ。

Posted: 2008年11月19日(水) 02:39
by Dixq (管理人)
う~ん、なかなか最近時間が無くて思うように製作出来ていません(´Д`;
とりあえずコードを公開出来るようなスキルを持ってないのに公開してるので、
可読性を上げる、変数命名規則にもっと明確な一貫性を持たせる、辺りをもうちょっとちゃんとしてみようかと思います・・。

Re:弾消しフラグ。

Posted: 2008年11月22日(土) 11:44
by situmon
がんばってみます。
あと四望の弾幕には驚かされてばかりです。
新作期待して待っています。

Re:弾消しフラグ。

Posted: 2008年11月23日(日) 17:59
by situmon
if(EnemyShot[j].flag!=0)//もし弾がまだ外じゃないなら
EnemyShot[j].flag=2; //2にする。
else if(EnemyShot[j].flag==2 && EnemyShot[j].flag==0) //フラグが2の弾でかつ全部外にあるなら
EnemyShot[j].flag=0; //フラグを2にしてフラグが2の弾をなくす。

ではだめなのでしょうか?
今回エラーが直接でず
バグなので、これがだめなのかどうかわかりません。
どうやって見分ければいいのでしょう。

Re:弾消しフラグ。

Posted: 2008年11月24日(月) 00:37
by 木霊
>else if(EnemyShot[j].flag==2 && EnemyShot[j].flag==0) //フラグが2の弾でかつ全部外にあるなら

 このif文ではEnemyShot[j].flagが0であり2の時にしかその後の処理をしません。
 このどちらかが間違っています。(多分後ろの条件の方が)

Re:弾消しフラグ。

Posted: 2008年11月27日(木) 19:02
by situmon
数だけで表せるのでしょうか?

Re:弾消しフラグ。

Posted: 2008年11月27日(木) 19:16
by situmon
あとシューティングゲームの館はもう更新を終了され
龍神録プログラミングの館が主となりました。
今はシューティングゲームの館で勉強しているので、
龍神録プログラミングの館のこの章の機能を
シューティングゲームの館のコードに取り入れたいと思うことがあります。
ですが龍神録プログラミングの館のコードの書き方とシューティングゲームの館のコードの書き方は
別物です(元は同じですが)。なのでどうしてもシューティングゲームの館のコードに取り入れることができません。それで質問ばかりで迷惑をかけてします。
いい方法はありませんか?

Re:弾消しフラグ。

Posted: 2008年11月27日(木) 21:26
by 通りすがり
フラグが0で無いなら2にするという書き方は意図した結果になるのでしょうか?

後、数だけで表せるのかという質問の意味がよくわかりませんね。

Re:弾消しフラグ。

Posted: 2008年11月27日(木) 21:47
by lbfuvab
宣伝ではありませんが、一度下記の本を読まれることを強くお薦めします。

「新版 明解C言語 入門編」
http://www.amazon.co.jp/%E6%96%B0%E7%89 ... Q1VNQ3HF3E

Re:弾消しフラグ。

Posted: 2008年11月27日(木) 23:23
by situmon
if文から考え直してみます。
ご返事ありがとうございます。
新版 明解C言語 入門編 のようなC言語の本はどれがいいのかと思い迷ってしまいます・・・