ページ 11

ステージをきれいに縦スクロールさせるには

Posted: 2014年3月24日(月) 16:44
by samusu0905
ステージを表示してる途中なんですが、ステージを縦スクロールするにはどうすればいいですか?
スクロールは出来ているんですが、明らかにスクロールの仕方がおかしいんです。
コード提示しますので、間違ってる場所があればお願いします。

コード:

//******************************************************
//                 ステージ1処理
//******************************************************
#include "gs.h"				//学内ライブラリィ
#include "Stage1.h"			//ステージ1


//宣言--------------------------------------------
int Stage1Y;				//ステージ1


//参照--------------------------------------------
extern gsTexture sStage1;	//ステージ1


//開始-------------------------------------------------------------
void Stage1Start(void)
{
	Stage1Y = 0;			//ステージ1Y座標
}


//メイン処理-------------------------------------------------------
void Stage1Main(void)
{
	Stage1Y++;
	if( Stage1Y > GS_WINDOW_HEIGHT)
	{
		Stage1Y -= GS_WINDOW_HEIGHT;
	}
}


//表示-------------------------------------------------------------
void Stage1Draw(void)
{
	//ステージ1を先に表示
	//通常の位置と1画面分下に表示
	gsDraw2D( sStage1, 0, Stage1Y+=2);
	gsDraw2D( sStage1, 0, Stage1Y-GS_WINDOW_HEIGHT);
}
これがステージをスクロールしているコードなんですが、
スクロール自体にあまり問題はありません。ただ、スクロールする際に少し汚く見えてしまっているんです。
一枚目のステージ画面が下にスクロールした後に、もう一つの同じステージ画面が下にスクロールされますよね?
その際に、二枚のステージ画面の真ん中がちょっと変になっているんです。
説明しずらいですが、スクロールした二枚の同じステージの真ん中が切り取られて、
それをくっ付けてスクロールさせているように見えています。
どう修正すれば切り取られたような部分を直せますか?
教えてほしいです。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月24日(月) 21:44
by みけCAT
haikei_kireru.png
想像図
haikei_kireru.png (2.08 KiB) 閲覧数: 7352 回
よくわかりませんが、こんな感じでしょうか?
でしたら、GS_WINDOW_HEIGHTのかわりにsStage1の高さを使用してみてください。
また、sStage1の高さがGS_WINDOW_HEIGHT/2より小さい場合、sStage1を3回以上描画する必要がありそうです。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月24日(月) 23:56
by ISLe
39行目が未規定の動作を含むので、隙間が空くかもしれないし空かないかもしれないですね。
そもそもどうしてここで座標を更新しているのかという疑問もありますが。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月25日(火) 02:31
by samusu0905
疑問を持たせてしまいすみませんね・・。
みけCATさん手助けをしてくれて毎度ありがとうございます。
とにかくNo2の通りにやってみますね。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月25日(火) 02:34
by samusu0905
みけCATさんが提示した図の通りです。
真ん中に空間ができてしまっているんです。僕の足らない説明で何となくですが、良くわかりましたね。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月25日(火) 03:01
by samusu0905
今No2を試しましたが、真ん中の空間は消えましたが、ステージとステージを重ねたような跡が残ったままなんですね。
この場合どのような処理なら重ねたような跡って消えますか?
一応コード提示しますので、付け足すところありましたらお願いします。

コード:

//******************************************************
//                 ステージ1処理
//******************************************************
#include "gs.h"				//学内ライブラリィ
#include "Stage1.h"			//ステージ1


//宣言--------------------------------------------
int Stage1Y;				//ステージ1


//参照--------------------------------------------
extern gsTexture sStage1;	//ステージ1


//開始-------------------------------------------------------------
void Stage1Start(void)
{
	Stage1Y = 0;			//ステージ1Y座標
}


//メイン処理-------------------------------------------------------
void Stage1Main(void)
{
	Stage1Y++;
	if( Stage1Y > 680)
	{
		Stage1Y -= 680;
	}
}


//表示-------------------------------------------------------------
void Stage1Draw(void)
{
	//ステージ1を先に表示
	//通常の位置と1画面分下に表示
	gsDraw2D( sStage1, 0, Stage1Y+=5);
	gsDraw2D( sStage1, 0, Stage1Y-680);
}
これがNo1を変えたコードです。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月25日(火) 07:56
by みけCAT
samusu0905 さんが書きました:今No2を試しましたが、真ん中の空間は消えましたが、ステージとステージを重ねたような跡が残ったままなんですね。
この場合どのような処理なら重ねたような跡って消えますか?
画像の問題かもしれませんね。
GIMPなどで画像を2個縦に並べてみて、繋ぎ目に違和感が無いような背景画像を作成してください。

もしくは、反転しても違和感が無い画像を使用していて、かつライブラリが対応していれば、
2枚目((0, Stage1Y-680)に描画している画像)を上下反転して描画するのもいいかもしれません。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月25日(火) 11:26
by samusu0905
わかりました。やってみます。
また何か問題があれば書きますのでよろしくお願いします。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 15:06
by samusu0905
あれから色々とやってみました。GIMPで画像を2枚に複製して、2枚の画像をうまく重ねることは出来ました。
出来たのは良いのですが、GIMPで保存した画像を拡張子jpgで表示することができないのですが、
GIMPで編集・作成した画像ってどうすれば拡張子を変更できますか?
拡張子を変更できればできると思います。
お願いします。 後、返事遅れて申し訳ございません。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 15:12
by softya(ソフト屋)
samusu0905 さんが書きました:あれから色々とやってみました。GIMPで画像を2枚に複製して、2枚の画像をうまく重ねることは出来ました。
出来たのは良いのですが、GIMPで保存した画像を拡張子jpgで表示することができないのですが、
GIMPで編集・作成した画像ってどうすれば拡張子を変更できますか?
拡張子を変更できればできると思います。
お願いします。 後、返事遅れて申し訳ございません。
なんでも、ここで聞けば良いというものでは無いのですが、検索されたのででしょうか?
聞いちゃいけないのではなくて、検索で分かるものをわざわざ聞くのは時間の無駄だと思うわけです。
「gimp 拡張子 - Google 検索」
https://www.google.co.jp/search?num=100 ... GWqsbPA1LU
「gimp 保存形式 - Google 検索」
https://www.google.co.jp/search?num=100 ... 4uZpU2EKgw

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 15:12
by みけCAT
samusu0905 さんが書きました:GIMPで編集・作成した画像ってどうすれば拡張子を変更できますか?
普通にGIMPで読み込んで、Export Asすればいいと思います。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 15:16
by みけCAT
samusu0905 さんが書きました:GIMPで編集・作成した画像ってどうすれば拡張子を変更できますか?
拡張子を変更(偽装)するだけなら、普通にOSの機能またはmvコマンドを使えばいいです。
また、一部の画像はImageMagickでも変換できます。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 15:18
by みけCAT
オフトピック
softya(ソフト屋) さんが書きました:「gimp 拡張子 - Google 検索」
https://www.google.co.jp/search?num=100 ... GWqsbPA1LU
「gimp 保存形式 - Google 検索」
https://www.google.co.jp/search?num=100 ... 4uZpU2EKgw
なぜsearchタグを使用せず、検索にあまり関係ない情報を含んだ長いURLをそのまま見える形で貼り付けたのですか?
批判というより、むしろ興味から聞いています。
[search=google]gimp 拡張子[/search]
[search=google]gimp 保存形式[/search]

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 15:33
by softya(ソフト屋)
みけCAT さんが書きました:
オフトピック
softya(ソフト屋) さんが書きました:「gimp 拡張子 - Google 検索」
https://www.google.co.jp/search?num=100 ... GWqsbPA1LU
「gimp 保存形式 - Google 検索」
https://www.google.co.jp/search?num=100 ... 4uZpU2EKgw
なぜsearchタグを使用せず、検索にあまり関係ない情報を含んだ長いURLをそのまま見える形で貼り付けたのですか?
批判というより、むしろ興味から聞いています。
[search=google]gimp 拡張子[/search]
[search=google]gimp 保存形式[/search]
普通に検索したままなのですが、たしかに余分なものがクッツイてますね。
「searchタグ」を使ってよかったんですね。失念しておりました。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 17:35
by ISLe
No.6の投稿にあるコードの39行目
gsDraw2D( sStage1, 0, Stage1Y+=5);
呼び出されるgsDraw2D関数に、Stage1Yに5を加える前の値が渡るか、Stage1Yに5を加えた後の値が渡るか、分かりません。
Stage1Yに5を加える前の値が渡るかもしれないし、Stage1Yに5を加えた後の値が渡るかもしれません。

Stage1Yに5を加えた後の値が渡る場合は、39行目に対して40行目のgsDraw2D関数のY座標のオフセットは-680になります。
Stage1Yに5を加える前の値が渡る場合は、39行目に対して40行目のgsDraw2D関数のY座標のオフセットは-675(+5-680)になります。

後者の場合、隙間が空くのではなくて、重なりますね。
見た目には、いわゆるテアリングと同じような感じでしょう。

スクロール量を変えたかったのでしょうか。
どうしてもともとスクロール座標の更新をしているStage1Mainを変更しないのか疑問です。

#というのがNo.3の投稿に書いたことの趣旨です。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 17:42
by みけCAT
ISLe さんが書きました:No.6の投稿にあるコードの39行目
gsDraw2D( sStage1, 0, Stage1Y+=5);
呼び出されるgsDraw2D関数に、Stage1Yに5を加える前の値が渡るか、Stage1Yに5を加えた後の値が渡るか、分かりません。
Stage1Yに5を加える前の値が渡るかもしれないし、Stage1Yに5を加えた後の値が渡るかもしれません。
C言語なら確実にStage1Yに5を加えた後の値が渡ると思うのですが、C++だと違うのでしょうか?
もしくは、C言語の仕様についても誤解しているでしょうか?
The C89 Draft さんが書きました:An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
(中略)
A compound assignment of the form E1 op = E2 differs from the simple assignment expression E1 = E1 op (E2) only in that the lvalue E1 is evaluated only once.
(http://port70.net/~nsz/c/c89/c89-draft.html#3.3.16)

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 19:40
by samusu0905
上手くいきました。
有難うございます。
無事解決です。

Re: ステージをきれいに縦スクロールさせるには

Posted: 2014年3月30日(日) 22:43
by ISLe
すみません。
件のコードは、副作用が単発なので問題ないですね。
勘違いでした。

問題になるのは以下のような場合でした。
void func(int a, int b);
int i = 0;
func(i+=5, i+=10);