画像の描画でどうしてもわかりません。

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

画像の描画でどうしてもわかりません。

#1

投稿記事 by 紫孝太郎 » 5年前

以下のDraw関数の処理で、自分の思うようになってくれません。
ソース自体は間違ってないはずなんですが、、なにが原因なのでしょうか。

<やりたいこと>
二種類のフラグと二種類の画像Noの構造体(A_flg、B_flg、low_No、high_No)
を持つブロック情報を、二次元配列に格納してそれを描画する。
(ひとつのチップサイズは16×16とします)
背景画像の根底にはlow_Noが設定されており、フラグ管理によって
その上にhigh_Noが描画されるエリアがある、という処理です。
そして、ある条件化ではさらに自分の下にもhigh_Noを描画する、といった処理です。

<おかしいところ>
下記のソースでいうところの「おまけ」が描画されない。
厳密に言えば、low_Noの描画処理をコメントアウトすると「おまけ」が描画されるので、
low_Noの描画が「おまけ」の上に描画されてしまっている模様。
なぜ、そんな状況になるのかがわかりません。

コード:

void Stage::Draw(){
 //二次元配列マップチップ描画
  for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){

    if(MapChip[i][j].A_flg){
       DrawGraph(MapChip[i][j].x,MapChip[i][j].y,Graph[low_No], false);
    }else{
      if(MapChip[i+1][j].B_flg){//自分の下のブロックのB_flgを確認し、B_flgが立ってない場合はそこにおまけ画像を描画する
	     //本体描画
	     DrawGraph(MapChip[i][j].x,MapChip[i][j].y,Graph[high_No], false);
      }else{
	      //本体描画
	      DrawGraph(MapChip[i][j].x,MapChip[i][j].y,Graph[high_No], false);
	      //おまけをさらに下に描画
	      DrawGraph(MapChip[i][j].x,MapChip[i][j].y+16,Graph[high_No], true);
              }
        }
     }
   }
}

紫孝太郎

Re: 画像の描画でどうしてもわかりません。

#2

投稿記事 by 紫孝太郎 » 5年前

ソースは間違ってなくて、それ以外の場所でなにか問題がある場合も考えられます。
ので、ソース上は問題無い場合は「問題ない」とおっしゃって頂けるとありがたいです。

よろしくお願いします。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 画像の描画でどうしてもわかりません。

#3

投稿記事 by あたっしゅ » 5年前

DxLib、あんまり 2D で使っていないんだけども、

>//おまけをさらに下に描画
>DrawGraph(MapChip[j].x,MapChip[j].y+16,Graph[high_No], true);

おまけのとこだけ、DrawGraph の引数が true になってるけど、これでいいの ?

DxLib>TransFlag : 画像の透明度を有効にするかどうか( TRUE:有効にする FALSE:無効にする )

1)とりあえず、false にしてみて、上書きできているか、確認する。
2)true に戻してから、画像データの透明度が、ちゃんとなってるか、確認する

以上、やってみる、というのは、いかがでしょうか。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

紫孝太郎

Re: 画像の描画でどうしてもわかりません。

#4

投稿記事 by 紫孝太郎 » 5年前

あたっしゅさん

レスありがとうございます。

>1)とりあえず、false にしてみて、上書きできているか、確認する。
>2)true に戻してから、画像データの透明度が、ちゃんとなってるか、確認する

それらはすでに確認していますし、
そこはfalseにしようがtrueにしようが影響はありません。
なぜなら、上に描画される画像は一部透過処理してるだけで実際画像だからです。
その上に描画する画像の一部が透けるか、透けないかの違いなだけですので。


というか、突っ込み場所がそのDrawGraph の引数くらいしか無いということで
やはり今回のソース上はなにも問題ないということですよね。。
参ったな、、、、

紫孝太郎

Re: 画像の描画でどうしてもわかりません。

#5

投稿記事 by 紫孝太郎 » 5年前

しかし、絶対に、
DrawGraph(MapChip[j].x,MapChip[j].y,Graph[low_No], false);
が、
DrawGraph(MapChip[j].x,MapChip[j].y+16,Graph[high_No], true);
の上に描画されちゃってるんですよね、、、

なぜなら、例えば
y+16って数値をy+8とかにすると、ちゃんと半分描画されてくれるんです。
それより下は綺麗に削られてる、、つまり下の座標のマスが上にかぶさって消えてるんです。

問題は、なぜ、
DrawGraph(MapChip[j].x,MapChip[j].y,Graph[low_No], false);
が優先されて、上に描画されているのか、なんです。
描画順で言えば、あのソースだと、
おまけ描画の処理が一番上に描画されるはずです、、、、。

紫孝太郎

Re: 画像の描画でどうしてもわかりません。

#6

投稿記事 by 紫孝太郎 » 5年前

すみません、突き詰めていったんですが
もしかして、これ、ただのDXライブラリのバグじゃないでしょうか?
//おまけをさらに下に描画
 DrawGraph(MapChip[j].x,MapChip[j].y+16,Graph[high_No], true);
だと、描画そのものがされませんが、
//おまけをさらに下に描画
 DrawGraph(MapChip[j].x,MapChip[j].y-16,Graph[high_No], true);
に書き換えると、描画されるんです、、、、、、
y+16をy-16にすると描画されるんです。

極端な例でいうと、

コード:

void Stage::Draw(){
 //二次元配列マップチップ描画
  for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){
	  DrawGraph(MapChip[i][j].x,MapChip[i][j].y+16,Graph[high_No], false);
     }
   }
}
ではまったく描画されないのに、

コード:

void Stage::Draw(){
 //二次元配列マップチップ描画
  for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){
	  DrawGraph(MapChip[i][j].x,MapChip[i][j].y-16,Graph[high_No], false);
     }
   }
}
だと画像が描画されるんですが、、、、、
バグじゃないでしょうか、これ。。

Math

Re: 画像の描画でどうしてもわかりません。

#7

投稿記事 by Math » 5年前

元祖 DXライブラリーを開発・管理されている方の掲示板に聞いてみれば即わかるともいますね。

https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 画像の描画でどうしてもわかりません。

#8

投稿記事 by もるも » 5年前

ループの順番によって下の行の本体に上書きされています。
この書き方だと本体とおまけを描画したあと、おまけが「次の」下の行の本体に上書きされてしまうようですね。

y-16の場合 上書きされない位置なので表示されます。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 画像の描画でどうしてもわかりません。

#9

投稿記事 by usao » 5年前

> やはり今回のソース上はなにも問題ないということですよね。。

DXライブラリの詳細はしらないけども,
画像の描画先がどこになってるのかは,

コード:

MapChip[i][j].x,MapChip[i][j].y
こいつら↑の実際の値次第なんだろうから,
これらの値を知らない他者がコードだけ見てもその正当性は判断付かない話なのでは……??

で,それはそれとして,
【自分のコードのバグなのか,それともライブラリ側のバグなのか】を調べたいならば,
「自分のコードが悪いかもしれない要素」を可能な限り排した状態のコードで確認をすべきでは?
例えば,2枚の画像を描画するだけのコードを,「座標を直値で」コーディングして
後から描画させたハズの絵が見えるかどうか,という試験を行うべきではないですか?

自前のコードの動きの妥当性を把握(なり他者に示すなり)するなら,
少なくとも,DrawGraph()の最初の2つの引数に渡されることになった実際の値をどこぞに出力してみて,
自分が思っている通りの結果になっているのか否かを確かめてみたらどうでしょう?

紫孝太郎

Re: 画像の描画でどうしてもわかりません。

#10

投稿記事 by 紫孝太郎 » 5年前

もるもさん

まさに、もるもさんの言う通りの状態なんです。
やっとわかってくれる人がいてくれて嬉しいです。
しかし、自分の知恵ではこの現状を打開する方法が思いつきません。
なにか良い方法ないでしょうか?
もるも さんが書きました:
5年前
ループの順番によって下の行の本体に上書きされています。
この書き方だと本体とおまけを描画したあと、おまけが「次の」下の行の本体に上書きされてしまうようですね。

y-16の場合 上書きされない位置なので表示されます。

紫孝太郎

Re: 画像の描画でどうしてもわかりません。

#11

投稿記事 by 紫孝太郎 » 5年前

もるもさんへ

今思いついたんですが、
おまけを描画するループを別にする、というのはどうですか?
背景描画ループの後に、
おまけ描画だけを処理するループを作るんです。

for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){
           背景描画
   }
}
for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){
           該当する背景にのみ、おまけを描画
   }
}

と言う感じです。
これ、重くなりますか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 画像の描画でどうしてもわかりません。

#12

投稿記事 by usao » 5年前

重くなるかどうかに関しては
(その程度の話ではほとんど差は見られないのではないかと予想しますが)
実測比較してみれば良いのではないでしょうか.
オフトピック
なんつーか,

コード:

MapChip[i][j].x,MapChip[i][j].y
なんてデータを「わざわざ用意して参照している」んだから,
「グリッド状に敷き詰めるなら各々のチップの描画位置は i*s と j*s とかで簡単に求まるよね」的な話とは「何かしら異なること」をやってるんでしょ?
そこの部分の説明無しに「わかってくれる云々」とかエスパー求めてる姿勢がまず謎すぎる.

で,「そこの部分がバグってるかもしれないけどよくわからんから場当たり的な対処方法を捻り出すぜ!」ってのもまぁ
確かにそういう方向も一つの手としては有りなのかしれないけども,
今回の場合は,さっさとミニマムケースで座標値そのものを確認すりゃ早いんじゃないの?と感じずにはいられない.

アバター
usao
記事: 1887
登録日時: 11年前

Re: 画像の描画でどうしてもわかりません。

#13

投稿記事 by usao » 5年前

オフトピック
「そんな当たり前の確認はとっくに済ませてるんだよ!」みたいなことがある場合には,
その旨は述べた方が,他の回答してくれている方々にも参考になると思いますよ.

以上です.

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 画像の描画でどうしてもわかりません。

#14

投稿記事 by もるも » 5年前

おまけを下のマスに配置するだけの場合、for文の式を逆にして下の行から描画していくという方法なら上書きされずに描画できます。
例 for(int i=(行の最大数-1); i>=0; i--)  最大から0になるまでループを回す。

下に配置するだけではない場合は
紫孝太郎 さんが書きました:
5年前

今思いついたんですが、
おまけを描画するループを別にする、というのはどうですか?
背景描画ループの後に、
おまけ描画だけを処理するループを作るんです。

for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){
           背景描画
   }
}
for(int i=0; i<m_line; i++){
   for(int j=0; j<m_col; j++){
           該当する背景にのみ、おまけを描画
   }
}

と言う感じです。
これ、重くなりますか?
これでも良いかと思います。
画面外のチップの描画をとばすとか余分な処理を除く処理を付ければ、多重ループでも重くならないと思います。

返信

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