HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1102
SADOUS【お急ぎ】hmm.dllにおいて、透過されない?透過される時とされない時...13解決


SADOUS

リンク

2014/11/2(Sun) 17:20:43|NO.65862

例によって、サークルで作っているのでソースを貼ることはできませんが
自分なりに考えられる原因を探ってみた結果、質問のタイトルような事態に。

//メインループ中の一部 gosub*draw gosub*S;11をメインへ貼り付け DGGSEL 0 : dgpos 0,0 : dgcolor 255,255,255,255 : dgrect 0,0,480,360 DGSCALEANDANGLE 341,341,0;341=1.333 480*1.333=640 dggcopy 11 dgredraw DGSCALEANDANGLE 256,256,0 await 17 //略// *S;レイヤ合成/11にまとめる dggsel 11:dgcolor 255,255,255,255:dgrect 0,0,480,360:dgpos 0,0 dggcopy 15;下層(UNDER OBJECT) dggcopy 14;通常層(PLAYER OBJECT) dggcopy 13;上層(EFFECT) dggcopy 12;最上層(GUI等) return //略// *draw
hmmは0,0,0は合成の際に透過されるとreadmeにあります。
事実、レイヤ合成で敵キャラやプレイヤーを描写するDGbuffer14以外をコメントアウトして
14だけを表示させてみたところ、小さいキャラ画像同士は透過されていました。
また、同様にしてDGbuffer12のみを表示させてみたところ、GUIも表示されています。
もちろん透過したい所は0,0,0,255でDGclear(標準のboxfに相当)。
他の色で塗りつぶしは行っていません。

小さい画像じゃなきゃ透過できないのかと考え、
合成の処理を480,360を240,180四枚にしてコピーしてみましたが、レイヤ合成の時だけ透過されず。




情報が少なく回答も難しいと思いますが、一緒に原因を考えてもらえませんか?



この記事に返信する


SADOUS

リンク

2014/11/2(Sun) 17:36:29|NO.65863

質問の内容だけだとわかりづらいと思うので、画像にまとめて見舞いsた。
http://f.st-hatena.com/images/fotolife/s/st1105/20141102/20141102173538_original.png?1414917343



ZAP

リンク

2014/11/2(Sun) 19:11:02|NO.65865

ぱっと見、レイヤー12に原因があるような気がします。
重ね合わせがうまくいってない画面のスクリーンショットを取って、
ペイントソフト等で本当に透過させたい箇所が(0,0,0)なのか調べてみましたか?

イメージ図ではレイヤー12をプログラム内で描画して作っているみたいですが、
はじめから画像で用意するのは不可能なのでしょうか?
その方が間違いないような気がします。



SADOUS

リンク

2014/11/2(Sun) 19:14:20|NO.65866

奇妙な現象・・・

*S;レイヤ合成/11にまとめる dggsel 11:dgrect 0,0,bufx,bufy:dgpos 0,0 dgcolor 255,255,255,200 dggcopy 15;下層(UNDER OBJECT) dggcopy 14;通常層(PLAYER OBJECT) dggcopy 13;上層(EFFECT) dggcopy 12;最上層(GUI等) //dggcopy 20;透過確認用0,0,0画面 return
dggcopyの直前で指定するdgcolorのp4でブレンド率が指定できますが、
通常は255で半透明なしの合成になります。

*drawで描写しているものを拡大表示して確認しましたが、各レイヤの中では透過は効いていました。
ですが、*Sでだけブレンド率を255にすると最上層しか表示されません。
また、*Sでブレンド率を10~200に指定してみると、全レイヤが正しく半透明合成されて表示されました。




半透明だと正しく透明色付き半透明合成コピーが行える。
hmmでは透過したくなくても0,0,0が透過される。
上記の例外として、dggcopyの直前でdgcolor 0,0,0,255にすると真っ黒でコピー出来たかも。
上記の対策として、dggcopyの直前でdgcolor 255,255,255,255を指定するようにしている。



SADOUS

リンク

2014/11/2(Sun) 19:24:05|NO.65868

>ZAPさん
塗りつぶしに関するプログラム(DGRECT,DGCOLOR,DGGCOPYも含めて)確かめていますので
そんなことはないと思います。
念の為に試してみたところ・・・12も14も0,0,0が抽出出来ました。どうしよう八方ふさがり。
http://f.st-hatena.com/images/fotolife/s/st1105/20141102/20141102192203_original.png?1414923727



SADOUS

リンク

2014/11/2(Sun) 19:31:50|NO.65869

>ZAPさん
画像の通り描写の段階では問題なくコピーができています。
よって、コピーの際の指定ミスか、又はhmmの不具合(であってほしくない)だと考えています。

12(UI)が最前面になっていますが、14(キャラ)を最前面になるように記述しても
今度は14だけが表示される始末。

ポジションが変動しているのかも!
→dgposを小まめに挟むも効果なし
ブレンド率やRGBの割合が不具合で変動しているのかも!
→dgcolor 255,255,255,255を小まめに挟むも効果なし



ZAP

リンク

2014/11/2(Sun) 19:32:44|NO.65870

DGBLENDMODEは直前で指定していますか?
どっかで透過なし(DGBLENDMODE 0)にしてそのままになっている、とかはないですか?
挙動がおかしいところの直前で
DGBLENDMODE 1
と明示してもダメでしょうか?

コードがないんで超能力でデバッグするしかない・・・



SADOUS

リンク

2014/11/2(Sun) 19:46:35|NO.65871

>ZAPさん
おお!もしかして!って思ったんですが、readmeも合わせて確認してみました。
→だめでした・・・

DGBLENDMODEの説明には
0は透過なし。1は透過有り(0,0,0)半透明合成コピー。
と書かれている割には0を指定していてもキャラ画像が透過されているんです。

DGGCOPYの説明には
0,0,0を透過すると書かれているので、たぶんこれが作用してDGBLENDMODEお構いなしになっているのかも。



ZAP

リンク

2014/11/2(Sun) 21:22:15|NO.65874

もしかすると何回か半透明を繰り返しているうちに
抜き色指定がうまくいかなくなるのかも知れませんね。



ZAP

リンク

2014/11/2(Sun) 21:24:29|NO.65875

hmm自体がDirectX7世代のプラグインだったと思うので、
DirectXのバージョンの違いにより作者の想定外の挙動をしている可能性もありますね。



SADOUS

リンク

2014/11/2(Sun) 21:46:27|NO.65876

>ZAPさん
製作途中なので、半透明コピーは一切行っていないのですが、
不具合の可能性が高いのでしょうか・・・

バッファから画像をコピーしてくる描写方法になれてしまっていて、
標準命令やhmmじゃないと描写プログラムが組めないんです。
hgimg3?とかはz軸やらスプライトがどうので手に負えなくて。
こんなこと言っている場合じゃないのかな?

もう少し意見を待ってみますが、ダメなようでしたら描写プラグイン探し・・・やります。



ZAP

リンク

2014/11/2(Sun) 22:06:22|NO.65877

過去の自分のhmmを使ったプログラムをみてみたのですが、
DGGCOPYの前には必ず、ひとつひとつ、DGCOLORを入れていました。


dgcolor 255,255,255,255 dggcopy 15;下層(UNDER OBJECT) dgcolor 255,255,255,255 dggcopy 14;通常層(PLAYER OBJECT) dgcolor 255,255,255,255 dggcopy 13;上層(EFFECT) dgcolor 255,255,255,255 dggcopy 12;最上層(GUI等)

こうするとどうでしょうか?



SADOUS

リンク

2014/11/2(Sun) 23:33:34|NO.65879

>ZAPさん
残念ながらダメでした。No.65869で実験済みです。
どうもhmmはダメそうなので一旦あきらめます。ご協力に感謝です!



改めてヘルプ漁っていたらhspdx.dllにスプライト管理ではなく、
標準に近く、かつ回転・拡縮・反転・合成方法指定などができるes_ex系の命令を発見。
とりあえずコチラを大至急勉強して使えるようにし・・・デジゲは浮くに間に合わせる(汗

ほんと、スプライト管理にさえ慣れていれば信頼の高いhgimg3を使えるのにな



A.C

リンク

2014/11/3(Mon) 08:27:09|NO.65883

こんにちは。
すでに解決済みですが、hgimg3についてひとつ。
以前別のスレッドにも似たようなこと書きましたが
hgimg3には標準命令のgrotateとほぼ同じ感覚で書けるhgrotate命令というものがあります。
これを使えばほぼ標準命令と同じように書けます。

以下、PNGを読み込んで表示するサンプル

#include "hgimg3.as" hgsetreq SYSREQ_DEFTIMER,1 hgsetreq SYSREQ_2DFILTER2,2 ;綺麗に拡大させる hgini dialog "png",16 if stat=0:end texload2 refstr texid=stat repeat hgdraw pos 320,240 ;この座標が中心(左上ではないので注意) gmode 2,200,200 ;↓この座標から200x200ドット表示 hgrotate texid, 0,0, 0, 300,300 ;↑表示する大きさ(300なので1.5倍の大きさで表示) hgsync wait 1 loop



ONION software Copyright 1997-2023(c) All rights reserved.