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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1226
鈍なくらHGIMG3で描画した画面を、別のウィンドウにコピーする時の挙動。13解決


鈍なくら

リンク

2013/12/26(Thu) 21:23:12|NO.58895

はじめまして、この掲示板を初めて利用します。
同人ゲームの2作目を、HSPで開発させて頂いてます。
頭に思い描いたことを実現する自由度が高い言語で、
とても楽しく開発させて頂いてます。

そこで質問なのですが、以下のスクリプトのように、
HGIMG3で描画した『ウィンドウ1』をhgcaptureでHSPの画面にコピーして、
それをメインウィンドウである『ウィンドウ0』にgcopyでコピーすると、
『ウィンドウ0』の右端と下端に、1ピクセル幅の黒いラインが入ってしまいます。

単純なことが原因かもしれませんが、
1週間ほど考えても自力では原因がわからなかったので、
思い切って質問させていただきました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜%

#include "hgimg3.as" screen 0,280,200,0+4,0,0 :title "ウィンドウID=0" screen 1,280,200,0+4,300,0 :title "ウィンドウID=1" hgini *main redraw 0 ;ウィンドウID1をオレンジで塗りつぶす。 gsel 1 :clscolor $f7941d hgdraw hgcapture ;ウィンドウID0に、ウィンドウID1をコピーする。 gsel 0 :color 255,255,255 :boxf ;画面を白で塗りつぶし pos 0,0 :gmode 0,280,200 :gcopy 1 pos 50,70 : color 172,0,0 mes "ウィンドウID1の画面を、\nこのウィンドウID0に\nコピーしています。" pos 45,10 : color 1,1,1 :mes "画面右端に幅1pixの黒い縦線→" pos 10,170 : color 1,1,1 :mes "↓画面下端に幅1pixの黒い横線" hgsync 10 redraw 1 goto *main
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜%
また、『ウィンドウ1』をOS画面の範囲外にドラッグし、
再びOS画面の範囲内にドラッグすると、『ウィンドウ0』と同様に、
『ウィンドウ1』の右端と下端に黒いラインが入ってしまいます。
(左クリックを放してドラッグを止めると再描画され、黒いラインは消えます)
この原因についても、理解していません・・。



この記事に返信する


暇人

リンク

2013/12/26(Thu) 22:44:45|NO.58896

何かバグっぽいな・・・
http://hsp.tv/play/pforum.php?mode=pastwch&num=53162
ここのNO.53363から実行速度を改善したhgcapture2を実装するモジュールを載せてる
使用に制限あるが・・・



鈍なくら

リンク

2013/12/27(Fri) 02:09:39|NO.58902

師走のお忙しい中、お返事ありがとうございます。

うわ・・! 凄いっ!!!
『hgcapture2』のモジュール領域を、上記のスクリプトに組み込んでみて、
『hgcapture』の代わりに『hgcapture2』を使ったところ、
黒のラインが表示されず、正常に画面をコピーできました!

>使用に制限あるが・・・
ここがよく分からなかったのですが、デバイスロストに関したことでしょうか・・?
とにかく、ただでさえ『hgcapture』は重たい命令ですから、非常に助かりました。


・・ということは、これは『hgcapture』のバグだったのでしょうか。
HGIMGで、サブウィンドウに
「マウス操作で簡単に回転・拡大縮小する3Dマップの地球儀」を作ったので、
それをメインウィンドウにクリッピングしていた時に、この挙動に気づきました。

HSPの標準命令でPNG形式が使えるようになりましたが、
透過度0の部分が完全に透明じゃなくて、重ねて描画すると黒くなってしまうので、
描画はすべてDirectXに任せたいと思っていました。
なのでこの『hgcapture2』は、hspとhgimg3を併用する上で、非常に有用だと思います!
2Dゲームの場合にも使えますし。



鈍なくら

リンク

2013/12/27(Fri) 02:14:45|NO.58903

上記スクリプトの挙動の原因はまだ不明ですが、
もうしばらく待ってみて、『hgcapture』のバグの線が濃厚でしたら、解決にします。



暇人

リンク

2013/12/27(Fri) 19:53:42|NO.58914

>デバイスロストに関したことでしょうか・・?
それも一つ
後は、デスクトップの色数が32ビット色限定(24ビット色以上?)
テクスチャサイズが2の累乗に制限されてる環境だと失敗する

デバイスロストはhgimg3をフルスクリーンで初期化しない限り問題ない(フルスクリーンでもAlt+TAB等でタスク移動しなければ問題ない)
デスクトップの色数は今時16ビット色にしてる人は少ないし、居ても自分でそう設定してるだけだから32ビット色限定とか説明文に入れれば良い
テクスチャサイズ制限についてはスクリプト側で対応しないと無理なので下に修正場所を書いとく

>#comfunc global IDirect3DDevice8_CreateTexture 20 int,int,int,int,int,int,int
これを

#comfunc global IDirect3DDevice8_CreateImageSurface 27 int,int,int,int
に置換え

> //D3DUSAGEとMANAGEDの指定はどの組み合わせが良いのか良く分からない・・・
> IDirect3DDevice8_CreateTexture com(PTRD3DDEV),dup_tsizex,dup_tsizey,1,D3DUSAGE_DYNAMIC, dup_D3DFORMAT,D3DPOOL_SYSTEMMEM,varptr(ret(TEXTURE)) :if( stat ) : dialog "error "+__line__+": CreateTexture "+stat : end
> newcom com(TEXTURE), , -1, ret(TEXTURE)
>
> IDirect3DTexture8_GetSurfaceLevel com(TEXTURE),0,varptr(ret(SURFACE)) :if stat : dialog "error "+__line__+": GetSurfaceLevel "+stat : end
この複数行を

IDirect3DDevice8_CreateImageSurface com(PTRD3DDEV),D3DSURFACE_DESC(6),D3DSURFACE_DESC(7),D3DSURFACE_DESC,varptr(ret(SURFACE)) :if stat : dialog "error "+__line__+": CreateImageSurface "+stat : end
この一行に置換え

これで2の累乗に制限は関係なくなると思う



鈍なくら

リンク

2013/12/28(Sat) 00:28:06|NO.58921

★>暇人さまへ。

ビット色の制限の説明文など、詳しく教えてくださり、ありがとうございます。
お蔭さまで、滞っていた多くの問題が、いっきに解決しました。
ウィンドウはフルスクリーンにならず800*600固定でなので、そこは大丈夫みたいです。

あれから、『使用の制限』とは著作権的な制限かな、とも思っていました。
未完成なのに気が早いかもしれませんが、一応、曲がりなりにも有償配布の作品なので、
このモジュールに商用禁止などの制限がありましたら使わないようにしますし、
権利についてご希望の記載文(作者名、URL、定型文など)があれば
その通りに載せますので、もし何か問題があれば仰って下さい。

とりあえず、解決にします。ありがとうございました。



暇人

リンク

2013/12/28(Sat) 02:05:49|NO.58923

>このモジュールに商用禁止などの制限がありましたら使わないようにしますし、
そう言う制限等はありません
自由に改変しても構いません



鈍なくら

リンク

2013/12/28(Sat) 18:53:30|NO.58939

★>暇人さまへ。
このモジュールの挙動をいろいろ試してみたのですが、
『hgcapture2』を呼ぶ呼ばないにかかわらず、このモジュールを組み込んだ状態で、

1)F5『コンパイル+実行』でゲーム画面を表示
2)PCをスリープモードにする
3)スリープモードを解除する

と行うと、

  『hsp3hg.exe』は動作を停止しました
  問題が発生したため、プログラムが正しく動作しなくなりました。
  プログラムは閉じられ、解決策がある場合はwindowsから通知されます。

とエラーが表示されて、ゲームが強制終了してしまうようです。
ご参考までにどうぞ。



暇人

リンク

2013/12/28(Sat) 20:42:57|NO.58944

hginiでサーフェイスとか確保してるが
hgcapture2命令実行しない場合は
hgdraw時に
>#deffunc _hgdraw int p1
>hgdraw@hsp p1
>hgdrf =1
>return
が実行されるだけでモジュール側で確保したDirectXに関係する物は何もいじっていない・・・


試しにメインループのhgsync次行に

repeat hggetreq DEVLOST,SYSREQ_DEVLOST if DEVLOST=0 { if cnt=0 {break}else{wait 100:break} } hgdraw@hsp 4+2 await 16 loop
を追加してみて



鈍なくら

リンク

2013/12/29(Sun) 02:34:12|NO.58958

★>暇人さまへ。
お返事、ありがとうございます。
まずお伝えしたいのは、スリープで強制終了したとしても、
ゲーム中では細かくオートセーブするので、ほとんど困ってはいません。
それに私のPCに限らず、スリープ復帰後に強制終了するゲームはそんなに珍しくないですし、
PhotoShopもスリープ後には、筆圧に不具合が出ますし。

ただ、参考にされるかもしれないので、テストの結果は書いておきます。
『hgsync』待ちの次行に追加してみましたが、同じ症状になるようです。
試しに、NO.53363の原文ままや、NO.53573などで修正したりして、いろいろ試してみました。

スリープ後の結果としては、『hgcapture2』命令を呼ぶ呼ばないに関係なく、
    『 error 167:CopyRects -2005530520 』
と表示されたり、
    『 hsp3hg.exe は動作を停止しました
      問題が発生したため(ry     』
と表示される感じです。

使っているPCは、OSはwin7、CPUは2.0GHz、メモリ8GB(7.9GB使用可能)で、
64ビットOSのノートPC、マシンパワーはそれなりだと思います。



暇人

リンク

2013/12/29(Sun) 04:02:49|NO.58959

報告ありがとうございます
>ゲーム中では細かくオートセーブするので、ほとんど困ってはいません。
まぁ、理由が分からないのは気持ち悪いので・・・
自分の環境が何も実行して無い状態でスリープ(XPだからスタンバイだが)しても復帰が上手くいかないので試せない・・・

>hgcapture2』命令を呼ぶ呼ばないに関係なく、
>     『 error 167:CopyRects -2005530520
hgcapture2を使わない限りCopyRectsは実行されないから
たぶん呼んだ時だけかな?
-2005530520はDEVICELOSTなのでエラー出して終了するのは正常動作(そのうち対応したのを出すと思う)

出来たらで良いんでNO.58944のをhgsyncの下だけじゃなくhgdrawの下にも追加して試してみて



鈍なくら

リンク

2013/12/30(Mon) 00:18:25|NO.58978

★>暇人さまへ。
お力になれれば幸いですが・・。
>hgcapture2を使わない限りCopyRectsは実行されないからたぶん呼んだ時だけかな?
あ、その通りです。
『-2005530520』は、NO.53363の原文まま(hgcapture2やhgcapture2Ex命令がある)で、
F5『コンパイル+実行』の後、スリープ復帰の強制終了時に表示されます。
分かりにくくてすみません(^^;

私のモジュールの組み込みミスも考慮して、このスレッドの先頭・NO.58895のスクリプトではなく、
NO.53363のスクリプト全文ままや、NO.53573を組み込んだ状態でもテストしてみました。

NO.58944を『*main』下の『hgdraw』と『hgsync 16』直下に追加してみましたが、
『 hsp3hg.exe は動作を停止しました 問題が発生したため(ry 』
となります。
1つも追加しないと、『-2005530520』が表示されるようです。

一方で、3行目〜197行目あたりのモジュール領域全部をコメントアウトして、
『hgcapture2 2』と『hgcapture2Ex 1,0,0,640/3,480/3』を『hgcapture』にした場合、
スリープ復帰後の強制終了は起こりません。
また、NO.53573の追加の有無は関係ないようです。

私のPCと、私のじゃないPCの2台でテストしましたが、
2台ともで同じ症状が出るので、再現性は高いと思います。
両方とも性能の近いノートPCで、OSはwin7です。



暇人

リンク

2013/12/30(Mon) 06:13:39|NO.58980

報告ありがとうございます
デバイスロストにちゃんと対応させれば問題無くなる感じかな・・・



暇人

リンク

2013/12/31(Tue) 00:50:51|NO.58998

>『 hsp3hg.exe は動作を停止しました 問題が発生したため(ry 』
が解決するかは分からないけど、一応デバイスロスト対応版

hgimg3のhgcapture命令の速度使い勝手を改良したhgcapture2を追加するモジュール
http://hsp.tv/play/pforum.php?mode=all&num=58997



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