助けてください、スクロールとオブジェクト発生について

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

助けてください、スクロールとオブジェクト発生について

#1

投稿記事 by きりた » 9年前

スクロールに合わせて、オブジェクトを生成させる処理を
作ったつもりです。しかし八方ふさがりというか、
どうしても解決出来ないことが起きています。
どうかお助け下さい。

構造体
int x、y;\\座標
int No;\\オブジェクト判別数値
bool flg://発生フラグ

↑これを要素とした二次元配列「object配列」を作っています。
(一次元配列でもいいはずですが、他の処理の流用ということで二次元でやっております)

ステージは強制横スクロールのシューティングで
毎フレームのスクロール量が+0.6
左にスクロールしています。

考え方はシンプルで、その画面のスクロールに合わせ、
総スクロール量と、二次元配列の各要素内のオブジェクトのX座標を比較し、
今、画面の中に入っていると判断出来たオブジェクトをインスタンス化させる、といった感じです。

コード:

	for(int i=0; i<m_line; i++){
		for(int j=0; j<m_col; j++){
          if(object配列[i][j].x - 総スクロール量 > 画面サイズ)
          {continue;}//まだ必要ないobjectということでループ抜ける

		   if(object配列[i][j].birth_flg==false)//発生させていないobjectか?
           {
             発生処理 インスタンス化→割愛します
             object配列[i][j].birth_flg=true;//発生
			}
		}
	}
最大のポイントは if(object配列[j].x - 総スクロール量 > 画面サイズ)の部分だと思っていまして、
continueを使わず、if(object配列[j].x - 総スクロール量 < 画面サイズ)で
画面内に入ったら発生させる、も試しています。

で、肝心の質問なんですが、
実行後、最初は狙い通りうまくいってるんです。
設定した画面サイズ、仮で100とすると、スクロール量がX座標100を超えるまで
オブジェクトが発生しませんし、そのX座標100をラインとしてポンポン発生します。
で、成功してると思ったら、その発生するラインがどんどんどんどん先に行ってしまうんです。
結果、先の方にあるobjectが次々インスタンス化されてしまう。
毎フレームのスクロール量は+0.6で不変のはずなのに
なぜこのような事態になるのでしょうか????
もちろん、目視によるスクロールも一定で、異常はありません。

if(object配列[j].x - 総スクロール量 < 画面サイズ)
という式自体、なにか問題ありますか?

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: 助けてください、スクロールとオブジェクト発生について

#2

投稿記事 by zxc » 9年前

発生するラインがどんどんどんどん先に行ってしまう
  「発生が考えているよりも早まってしまっている」だけではなく、「オブジェクトを発生させる条件の一つである発生ラインがどんどん先に進んでいる」と既に何らかの方法(例えば時間経過でのラインのx値の出力等)でわかっているのですか?それともそうらしいと考えられるだけでしょうか?

  仮に既にラインのx値の増大が原因と考えられるのならば、そのラインのx値に手を加える部分で正しい値が加算されているのかどうか、その値を利用する部分で不要な書き換えを行っていないか、がわかるようなコードを示さないと原因は分からない気がします。
  
  そうでないなら、オブジェクトの生成を決定する全ての条件が意図した場面で意図した値となっているのかを確かめることが必要かもしれません。



  それと類似のコードを書いて試したわけではないですが、

コード:

       for(int j=0; j<m_col; j++){

          if(object配列[i][j].x - 総スクロール量 > 画面サイズ)
          {continue;}//まだ必要ないobjectということでループ抜ける <- ここ
 
              if(object配列[i][j].birth_flg==false)//発生させていないobjectか?
          {
             発生処理 インスタンス化→割愛します
             object配列[i][j].birth_flg=true;//発生
                }
        }
  ここで(breakではなく)continueを使った場合、私個人の直感ではループを抜けずに次のif文へ行きそうな気がしますが、ループを抜けることができるのですか?
  仮にループを抜けられないのなら、本来必要でない条件下でインスタンス化が起こる原因の一つといえるかもしれません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 助けてください、スクロールとオブジェクト発生について

#3

投稿記事 by みけCAT » 9年前

zxc さんが書きました:ここで(breakではなく)continueを使った場合、私個人の直感ではループを抜けずに次のif文へ行きそうな気がしますが、ループを抜けることができるのですか?
あなたの直感はC言語の仕様とは一致しませんが、continueの効果として「ループを抜ける」という表現も一般的ではないと思います。
C言語/C++のcontinueは現在のループの残りの処理を飛ばし、ループの「最後の行」の次の処理へ飛びます。
(「最初に戻る」と解説しているところもありますが、do~while文を考えると「最後に行く」とした方がいいと思います)
continue文
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

きりた

Re: 助けてください、スクロールとオブジェクト発生について

#4

投稿記事 by きりた » 9年前

zxcさん、レスありがとうございます。

現在はcontinueの配置がミスを誘うかもしれないということで
↓の様に使わない処理で確認しています。
しかし同じように出だしは守られていますがだんだんと画面外でも発生されてしまいます。

コード:

for(int i=0; i<m_line; i++){
       for(int j=0; j<m_col; j++){
        if(object配列[i][j].birth_flg==false)//発生させていないobjectか?
        {
           if(object配列[i][j].x - 総スクロール量 < 画面サイズ)
           {
        
             発生処理 インスタンス化→割愛します
             object配列[i][j].birth_flg=true;//発生
                    }
             }
        }
 }
zxc さんが書きました:
何らかの方法(例えば時間経過でのラインのx値の出力等)でわかっているのですか?
出力して調べてみましたが、
総移動量は常に正しい数値が加算され続けていました。すみません。

ということで
zxc さんが書きました:
そうでないなら、オブジェクトの生成を決定する全ての条件が意図した場面で意図した値と
なっているのかを確かめることが必要かもしれません。
を実行しているのですが、原因がわかりません。
if文がどれもシンプルなので、ミスしていても気づきやすそうなもんですが、、、
「オブジェクトを発生させる条件」がおかしいのでしょうか?
コードからは問題を推測はできませんでしょうか?

ステージの更新関数内に設置しています。
あと、本当は、オブジェクトの座標は二次元配列の添え字で入っていますので
座標を出すのに「× 画像サイズ」をしております。

コード:

for(int i=0; i<m_line; i++){
       for(int j=0; j<m_col; j++){
        if(object配列[i][j].birth_flg==false)//発生させていないobjectか?
        {
           if( (object配列[i][j].x × マップチップサイズ) - 総スクロール量  <  画面サイズ)
           {
        
             発生処理 インスタンス化→割愛します
             object配列[i][j].birth_flg=true;//発生
                    }
             }
        }
 }
これが自分が出せる限界です。
最初は画面サイズにあって発生しているのに、
徐々に先の方の座標のobjectまで発生していくのか、、、わかりません。

きりた

Re: 助けてください、スクロールとオブジェクト発生について

#5

投稿記事 by きりた » 9年前

あと、構造体の 座標変数をint からdoubleに変えました。
double x;
double y;
int No;   //オブジェクト判別数値
bool flg:  //発生フラグ

が、変化はありません。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: 助けてください、スクロールとオブジェクト発生について

#6

投稿記事 by zxc » 9年前

 

  発生ラインが前に進んだら、オブジェクトの生成は遅くなりますね。間違いましたすいません。

あくまで個人的に感じたことですが、
  • マップチップサイズ と言ったら大体16*16とか、32*32あたり? 32*32と仮定。
  • 画面サイズ と言ったら小さいと320*240くらい、多いのは640*480あたり、とりあえず640*480だと仮定します。
  • オブジェクトの座標 と言ったらおおよそ画面から大きくはみ出ない値、今回で言えば(640,480)( ±(50,50)くらい?) と仮定。
  • 最初は結果がずれていないが、だんだんずれる→(y = 得られた値-理想値 のグラフを書いたら直線だと勝手に仮定)
  上のように仮定すると、下に示すif文の条件は不味いような気がします。

コード:

if( (object配列[i][j].x × マップチップサイズ) - 総スクロール量  <  画面サイズ)
  オブジェクトの座標の増加量とスクロール量が、単位時間当たり等しいとしたら、「object配列[j].x × マップチップサイズ」は「総スクロール量」のマップチップサイズ倍の増加量となりませんか?
  要はマップチップサイズが大きいほどオブジェクトの生成は先延ばしになる。言い換えれば理想的なスクロール量のマップチップサイズ倍になるまでは、そのオブジェクトは生成されない、ということになるのだと思います。



 みけCATさん なるほど、そうでしたか。すいませんでした。

きりた

Re: 助けてください、スクロールとオブジェクト発生について

#7

投稿記事 by きりた » 9年前

zxcさん
レスありがとうございます。
マップチップサイズは8×8です。小さいチップで背景をつくっています。
マップ全体は、横幅が7000ピクセルほどあります。横シューなんで横幅は長めです。
で、画面サイズは横幅が480ピクセルになります(pspの画面サイズを意識)。
各オブジェクトの座標の設定は、マップを8×8で区切り、それを二次元配列の添え字を利用しています。
(たとえば、object配列[2][4]に入っているobjectのx,y座標は、y=16(2×8)、x=32(4×8)の座標ということ)

そして、各objectのx座標から総スクロール量を引いて
そのobjectが画面内に入っている状態ならインスタンス化する、
ということがしたいのです。
zxc さんが書きました: 
発生ラインが前に進んだら、オブジェクトの生成は遅くなりますね。
すみません、上記の仕様でいうと
発生ラインが前に進んだらobjectの生成は早まりませんか??

きりた

Re: 助けてください、スクロールとオブジェクト発生について

#8

投稿記事 by きりた » 9年前

解決出来ました。
発生させる式は正しかったんです。
そのobjectを発生させるときにぶっこむ座標を間違えてました。
スクロールを考慮した座標をほうりこんでインスタンス化。
それで解決出来ました。なんとも情けない、、、、
質問でもそこには触れていなかったので
zxcさんもまさかとは思っていなかったでしょう。
ご迷惑おかけしました、レスくださってありがとうございます。

閉鎖

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