OpenGL ESで背景のスクロールを行いたいです。
座標系は右下に行くほど+されるDXライブラリと同じ用に変更してあります。
UV座標系ではありません。
画面サイズ 320×480
画像サイズ 1024×512 スクロールします
DrawTexture・・・中心に描画する関数
DrawTexture( X座標, Y座標, 表示する画像, 切り取り開始位置X, 切り取り開始位置Y, 切り取りサイズX, 切り取りサイズY, 輝度, 透過 );
画像が切れそうなときは上に切れる部分を
0~表示するといったことをしているのですが
スクロールしているように見えません。
2枚目の画像の位置の指定が間違えていると思うのですが
お分かりになる方はおりませんでしょうか?
―――――――――以下ソース―――――――――
scBack += 3;
if( scBack >= 1024) scBack -= 1024;
// 背景スクロール
DrawTexture( 160, 240, texBack, scBack, 0, 320, 480, 0xffffff, 255 );
if(scBack >= 1024-320) DrawTexture( 160, 240, texBack, 320-(1024-scBack), 0, 320, 480, 0xffffff, 255 );
背景のスクロール
Re:背景のスクロール
(160,240)というのは何の座標ですか?
(160,240)から右下に向かって320x480の領域に描画したいということですかね。
/* scBackは正の数でなければならない */
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
DrawTexture(160, 240, texBack, scBack, 0, copy_w, 480, 0xffffff, 255);
if (copy_w < 320) DrawTexture(160+scBack, 240, texBack, 0, 0, 320-copy_w, 480, 0xffffff, 255);
こんな感じでできると思います。
(160,240)から右下に向かって320x480の領域に描画したいということですかね。
/* scBackは正の数でなければならない */
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
DrawTexture(160, 240, texBack, scBack, 0, copy_w, 480, 0xffffff, 255);
if (copy_w < 320) DrawTexture(160+scBack, 240, texBack, 0, 0, 320-copy_w, 480, 0xffffff, 255);
こんな感じでできると思います。
Re:背景のスクロール
>>ISLe様
ご回答ありがとう御座います。
あれから色々試してみたのですがうまく行かなかったので非常に助かりました。
修正してみたのですがそれらしい動きになったのですがやはりうまく動きません。
一応、画像を添付させて頂きます。 ←すみません・・・ファイルサイズの問題で出来ませんでした。
ただフォトショ上で加工しているとループしていますので素材のミスではないと思います。
(160,240)は画面の中心座標です。
DrawTexture関数は左上原点で描画するのではなく中心原点?で表示する関数となっております。
記載していなくて申し訳ありませんでした。
320x480の領域があって中心原点の関数を使うので(160,240)となっております。
たぶん中心原点なのが行けないかと思うのですが出来ればこの関数を使って行いたいです・・・。
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;がよくわからないのですが
これはどういう意味なのでしょうか?
ご回答ありがとう御座います。
あれから色々試してみたのですがうまく行かなかったので非常に助かりました。
修正してみたのですがそれらしい動きになったのですがやはりうまく動きません。
一応、画像を添付させて頂きます。 ←すみません・・・ファイルサイズの問題で出来ませんでした。
ただフォトショ上で加工しているとループしていますので素材のミスではないと思います。
(160,240)は画面の中心座標です。
DrawTexture関数は左上原点で描画するのではなく中心原点?で表示する関数となっております。
記載していなくて申し訳ありませんでした。
320x480の領域があって中心原点の関数を使うので(160,240)となっております。
たぶん中心原点なのが行けないかと思うのですが出来ればこの関数を使って行いたいです・・・。
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;がよくわからないのですが
これはどういう意味なのでしょうか?
Re:背景のスクロール
すいません解決できました!!
copy_wの中身の変化をみたら修正できました。
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
DrawTexture(160-(320-copy_w)/2, 240, texBack, scBack, 0, copy_w,480, 0xffffff, 255);
if (copy_w < 320) DrawTexture( 320-(320-copy_w)/2, 240, texBack, 0, 0, 320-copy_w, 480, 0xffffff, 255);
本当にありがとう御座います。
宜しければいいのでint copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
の意味を教えては頂けないでしょうか?
(scBack < 1024 - 320) の条件下でtrueなら320 falseなら1024 - scBackな気がするのですがあっていますでしょうか?
copy_wの中身の変化をみたら修正できました。
int copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
DrawTexture(160-(320-copy_w)/2, 240, texBack, scBack, 0, copy_w,480, 0xffffff, 255);
if (copy_w < 320) DrawTexture( 320-(320-copy_w)/2, 240, texBack, 0, 0, 320-copy_w, 480, 0xffffff, 255);
本当にありがとう御座います。
宜しければいいのでint copy_w = (scBack < 1024 - 320) ? 320 : 1024 - scBack;
の意味を教えては頂けないでしょうか?
(scBack < 1024 - 320) の条件下でtrueなら320 falseなら1024 - scBackな気がするのですがあっていますでしょうか?
Re:背景のスクロール
> (scBack < 1024 - 320) の条件下でtrueなら320 falseなら1024 - scBackな気がするのですがあっていますでしょうか?
動作はそれであってます。
転送元に対してスクロール(オフセット)座標から見て、
右に320ピクセル以上あるなら320ピクセルそのまま使い、
320ピクセルに足りないときは残りの幅だけを使うという意味です。
動作はそれであってます。
転送元に対してスクロール(オフセット)座標から見て、
右に320ピクセル以上あるなら320ピクセルそのまま使い、
320ピクセルに足りないときは残りの幅だけを使うという意味です。
Re:背景のスクロール
なるほど・・・ありがとうございました!!
勉強になりました!!
質問ばかりで申し訳ないのですが問題がでてしまいました。
スクロール速度が速かったのでscBackをintからfloatにして+3を+0.5fに修正したら
途中でカクカクになったり1pxずれてしまいます。
カクカクになるのはif (copy_w < 320) の条件下の時です。
原因は何となくわかるのですが修正の仕方が思いつきません。
※scBackが3.5fなどになると描画するときに切り捨てで3と同じ扱いになる
しかし次のフレームでは4.0fになるのでそこでずれてしまう
0.5fだと2フレームごとにカクカク動いてしまう?
フレーム 移動量 描画
0 0 0
1 0.5 0
2 1.0 1
3 1.5 1
4 2.0 2
これを中心点描画しているのが行けない気がします。
見当違いだったらすみません・・・。
これはintでしか出来ないのでしょうか?
勉強になりました!!
質問ばかりで申し訳ないのですが問題がでてしまいました。
スクロール速度が速かったのでscBackをintからfloatにして+3を+0.5fに修正したら
途中でカクカクになったり1pxずれてしまいます。
カクカクになるのはif (copy_w < 320) の条件下の時です。
原因は何となくわかるのですが修正の仕方が思いつきません。
※scBackが3.5fなどになると描画するときに切り捨てで3と同じ扱いになる
しかし次のフレームでは4.0fになるのでそこでずれてしまう
0.5fだと2フレームごとにカクカク動いてしまう?
フレーム 移動量 描画
0 0 0
1 0.5 0
2 1.0 1
3 1.5 1
4 2.0 2
これを中心点描画しているのが行けない気がします。
見当違いだったらすみません・・・。
これはintでしか出来ないのでしょうか?
Re:背景のスクロール
> これはintでしか出来ないのでしょうか?
DrawTexture関数はfloatのまま渡せるのでしょうか?
いったんint型の変数に代入してそれを使うようにしたらどうでしょう?
2フレームごとに1ピクセルのスクロールになるのでカクカクに見えますかね。
int iScBack = scBack;
int copy_w = (iScBack < 1024 - 320) ? 320 : 1024 - iScBack;
DrawTexture(160-(320-copy_w)/2, 240, texBack, iScBack, 0, copy_w, 480, 0xffffff, 255);
if (copy_w < 320) DrawTexture(320-(320-copy_w)/2, 240, texBack, 0, 0, 320-copy_w, 480, 0xffffff, 255);
隙間が広がるのは、切り捨てを足したあとでやるのと引いたあとでやるのとでは向きが違うからです。
例えばスクロール座標が900.5fのとき、
copy_w = 1024 - scBack; /* 123.5f → 123 */
DrawTexture(160-(320-copy_w)/2, 240, texBack,
iScBack, /* 900.5f → 900 */
0,
copy_w, /* 123 */
480, 0xffffff, 255);
1024ピクセル幅に対してオフセット900から123ピクセルとなって右端まで1ピクセル届きません。
DrawTexture関数はfloatのまま渡せるのでしょうか?
いったんint型の変数に代入してそれを使うようにしたらどうでしょう?
2フレームごとに1ピクセルのスクロールになるのでカクカクに見えますかね。
int iScBack = scBack;
int copy_w = (iScBack < 1024 - 320) ? 320 : 1024 - iScBack;
DrawTexture(160-(320-copy_w)/2, 240, texBack, iScBack, 0, copy_w, 480, 0xffffff, 255);
if (copy_w < 320) DrawTexture(320-(320-copy_w)/2, 240, texBack, 0, 0, 320-copy_w, 480, 0xffffff, 255);
隙間が広がるのは、切り捨てを足したあとでやるのと引いたあとでやるのとでは向きが違うからです。
例えばスクロール座標が900.5fのとき、
copy_w = 1024 - scBack; /* 123.5f → 123 */
DrawTexture(160-(320-copy_w)/2, 240, texBack,
iScBack, /* 900.5f → 900 */
0,
copy_w, /* 123 */
480, 0xffffff, 255);
1024ピクセル幅に対してオフセット900から123ピクセルとなって右端まで1ピクセル届きません。
Re:背景のスクロール
>>ISLe様
お礼が遅くなってしまい申し訳ありませんでした。
そのように書いてみたのですがやはりカクカクしてしまいます。
一度しめて新しく質問させて頂きます。
お礼が遅くなってしまい申し訳ありませんでした。
そのように書いてみたのですがやはりカクカクしてしまいます。
一度しめて新しく質問させて頂きます。