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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 5年前

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

#1

投稿記事 by samusu0905 » 5年前

ステージを表示してる途中なんですが、ステージを縦スクロールするにはどうすればいいですか?
スクロールは出来ているんですが、明らかにスクロールの仕方がおかしいんです。
コード提示しますので、間違ってる場所があればお願いします。

コード:

//******************************************************
//                 ステージ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);
}
これがステージをスクロールしているコードなんですが、
スクロール自体にあまり問題はありません。ただ、スクロールする際に少し汚く見えてしまっているんです。
一枚目のステージ画面が下にスクロールした後に、もう一つの同じステージ画面が下にスクロールされますよね?
その際に、二枚のステージ画面の真ん中がちょっと変になっているんです。
説明しずらいですが、スクロールした二枚の同じステージの真ん中が切り取られて、
それをくっ付けてスクロールさせているように見えています。
どう修正すれば切り取られたような部分を直せますか?
教えてほしいです。

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

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

#2

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

haikei_kireru.png
想像図
haikei_kireru.png (2.08 KiB) 閲覧数: 1855 回
よくわかりませんが、こんな感じでしょうか?
でしたら、GS_WINDOW_HEIGHTのかわりにsStage1の高さを使用してみてください。
また、sStage1の高さがGS_WINDOW_HEIGHT/2より小さい場合、sStage1を3回以上描画する必要がありそうです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

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

#3

投稿記事 by ISLe » 5年前

39行目が未規定の動作を含むので、隙間が空くかもしれないし空かないかもしれないですね。
そもそもどうしてここで座標を更新しているのかという疑問もありますが。

samusu0905
記事: 336
登録日時: 5年前

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

#4

投稿記事 by samusu0905 » 5年前

疑問を持たせてしまいすみませんね・・。
みけCATさん手助けをしてくれて毎度ありがとうございます。
とにかくNo2の通りにやってみますね。

samusu0905
記事: 336
登録日時: 5年前

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

#5

投稿記事 by samusu0905 » 5年前

みけCATさんが提示した図の通りです。
真ん中に空間ができてしまっているんです。僕の足らない説明で何となくですが、良くわかりましたね。

samusu0905
記事: 336
登録日時: 5年前

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

#6

投稿記事 by samusu0905 » 5年前

今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を変えたコードです。

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

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

#7

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

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

もしくは、反転しても違和感が無い画像を使用していて、かつライブラリが対応していれば、
2枚目((0, Stage1Y-680)に描画している画像)を上下反転して描画するのもいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

samusu0905
記事: 336
登録日時: 5年前

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

#8

投稿記事 by samusu0905 » 5年前

わかりました。やってみます。
また何か問題があれば書きますのでよろしくお願いします。

samusu0905
記事: 336
登録日時: 5年前

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

#9

投稿記事 by samusu0905 » 5年前

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

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

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

#10

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

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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#11

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

samusu0905 さんが書きました:GIMPで編集・作成した画像ってどうすれば拡張子を変更できますか?
普通にGIMPで読み込んで、Export Asすればいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#12

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

samusu0905 さんが書きました:GIMPで編集・作成した画像ってどうすれば拡張子を変更できますか?
拡張子を変更(偽装)するだけなら、普通にOSの機能またはmvコマンドを使えばいいです。
また、一部の画像はImageMagickでも変換できます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#13

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

オフトピック
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]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#14

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

みけ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タグ」を使ってよかったんですね。失念しておりました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

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

#15

投稿記事 by ISLe » 5年前

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の投稿に書いたことの趣旨です。

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

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

#16

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

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)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

samusu0905
記事: 336
登録日時: 5年前

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

#17

投稿記事 by samusu0905 » 5年前

上手くいきました。
有難うございます。
無事解決です。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

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

#18

投稿記事 by ISLe » 5年前

すみません。
件のコードは、副作用が単発なので問題ないですね。
勘違いでした。

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

閉鎖

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