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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0926
guccihspdxfixの画面コピー14解決


gucci

リンク

2008/9/26(Fri) 15:05:18|NO.19762

hspdxfixのスプライト機能を使ってゲームを制作しています。

実行画面(buffer 0)を2倍の大きさでbuffer 0に表示したいのですが
es_copy命令ではオフスクリーンバッファからのコピーしかできず、
gcopyやgzoom命令等で他のバッファにbuffer 0の画面をコピーしても
まっしろの画面がコピーされてしまい、困っています。

どうにかして見たままの画面をコピーすることはできないでしょうか?



この記事に返信する


あり

リンク

2008/9/26(Fri) 16:35:01|NO.19763

es_xferで現在描画中のバッファ(-2)から
別のバッファにコピーしておき
es_zoomで再び拡大してコピーし直せば可能な筈です。

詳しくはes_xferのヘルプを見てもらえればわかると思います。



gucci

リンク

2008/9/26(Fri) 17:33:56|NO.19764

>>ありさん
迅速な回答、ありがとうございます。
そんな命令があったとは・・・。

さっそく実装してみたところ、拡大コピーは可能になったのですが
FPSが60から30程度にまで低下してしまい、まともにプレイできなくなってしまいました・・・

スクリプトは

buffer 3 es_buffer 49,0;画面拡大用バッファ gsel 0,1 *main ;▲描画命令は省略 es_xfer 49,-2,0,0,320,240 es_zoom 49,0,0,320,240,640,480 es_sync
といった感じです。
何か不備があるのでしょうか?



あり

リンク

2008/9/26(Fri) 18:10:43|NO.19765

Direct3Dを使っているとかなり遅くなるようです。
hspdx.txtの『Direct3D描画について』にそれらしき事も書いてありました。

es_screenの第6パラメータを0(Direct3Dを使用しない)で
試しても変わらないようなら、hspdxとハードの相性が悪いと
考えた方が良いのかもしれません。



gucci

リンク

2008/9/26(Fri) 19:04:18|NO.19766

ありがとうございます。
direct3Dを切ったところ、動作は軽くなりましたが
es_zoom命令で拡大した画像が使用前よりかなりぼやけてしまいました。

通常命令のgzoomならば意図したとおりの拡大ができるのですが、
hspdxを使用している以上はあきらめた方が良いのでしょうか・・・



あり

リンク

2008/9/26(Fri) 19:48:36|NO.19767

残念ながら今のhspdxではes_zoomでの
拡大補完処理の有無は選択出来ないみたいですね。

HPの日記を見させてもらったところ、ゲーム画面を320x240で作って
拡大したいという事のようですので
画像データのドットをあらかじめ2倍に拡大しておいた物で
640x480のゲーム画面を作る(座標の値は内部で2倍にする)
という方法はダメでしょうか?

スプライトの処理に多少工夫がいるかもしれませんが
Direct3Dを使えるのでメリットも多いと思うのですが・・・。



gucci

リンク

2008/9/28(Sun) 00:47:44|NO.19803

>>ありさん
そうですか・・・
元々、320*240の方が編集が楽そうだという理由で始めたのですが、
本末転倒なことになりそうですね(´・ω・`)

なんとか頑張ってみます。



コンテスト出品者

リンク

2008/9/29(Mon) 00:25:45|NO.19851

ゲームのロジック部分と画面表示部分をきちんと分けているんでしたら、
内部の座標は320×240のままで、表示するときだけX,Y座標を×2倍する
ということで簡単に実装できそうですね。



gucci

リンク

2008/10/14(Tue) 15:57:58|NO.20149

返信が遅くなってすみません>コンテスト出品者さん
表示部と演算部はごっちゃになっていて、修正するのは難しそうです・・・

いろいろと試してみたところ、どうやら表示が異常に重くなるのは
es_zoomが原因ではなくes_xferのようです。

バッファIDに-2が適用できるのはes_xferだけなのでしょうか?



エコQ

リンク

2008/10/15(Wed) 08:24:38|NO.20170

いまのgucciさんのアプローチからは外れてしまいますが、
HSPDXには、自動で画面サイズを拡大/縮小してくれる機能があるので
それを利用すれば、320×240で作成したウィンドウも、任意のサイズに変更できます。

以下に簡単なサンプルを示してみましたが、縦横比は3:4に限らず任意に設定可能ですし、
ちょっと頑張って、Windows APIやsendmsg命令を利用すれば、
ウィンドウ右上の最大化ボタンでの操作や、サイズ可変ウィンドウにも対応できます。


#include "hspdx.as" ;HSP3.2β1以外での動作は確認していません screen 0, ginfo_dispx,ginfo_dispy ,0 ,0,0:onexit goto *owari es_ini 512,1024,256:es_screen 320,240,32, 0,1,1:buffer 2,320,240 cls 4:color 255,255,255:repeat 240:pset rnd(320),cnt:loop:es_buffer 1,0,0,2,0 ;背景 cls 4:color 240,255,255:repeat 2:pos cnt,0:mes "(゚ω゚)\n(゚Д゚)\n(^ー^)\n('▽')":loop es_buffer 2,0,$0,2,0:cw=ginfo_mesx:ch=ginfo_mesy:es_size cw,ch,100 repeat 4:es_pat cnt, 0,ch*cnt:loop:es_area -cw,-ch,320,240:gsel 0:mag=4:snum=64 *puts: repeat snum:pt=cnt:gosub *put1:loop ;顔初期配置 *main: wait 0:sto=stn:stick stn,-1,1 ;キーセンス if (stn==128) { goto *owari } ;【Esc:終了】 es_exnew pt,0,snum-1:if (pt>=0) { gosub *put1 } ;空き板あれば顔再配置 if (sto==0) { if (stn==1) { mag-=(mag>0) } ;【右キー:大きく】 if (stn==4) { mag+=(mag<16) } ;【左キー:小さく】 if (stn&10) { mag=4 } ;【上下キー:元に戻す】 sw=80*mag:sh=60*mag:gsel 0:title "w"+sw+" h"+sh:width sw,sh } pos 0,0:es_copy 1,0,0,320,240:es_draw :es_sync -16,2 if (stn==2) { goto *puts } else { goto *main } *owari: es_bye:end *put1: es_set pt,160-cw/2,120-ch/2,pt&3,0:es_adir pt,rnd(256),rnd(300)+100:return ;顔再配置



gucci

リンク

2008/10/15(Wed) 14:03:49|NO.20181

>エコQさん
わざわざスクリプトまで・・・ありがとうございます。
widthであっさり変更出来たんですね。

chgdispとbgscrを使って最大化もすんなり行えたので、
やっと不安要素が解決しました。



コンテスト出品者

リンク

2008/10/15(Wed) 19:26:36|NO.20196

es_screenで初期化した後にwidthで拡縮できるとは知りませんでした。
これならゲーム内部に手を加えずとも簡単にサイズ変更できますね!
widthを実行するかしないか、だから起動時に選択させることもできますし、
まさに目から鱗です。

しかしこれってHSPDXの作者が動作を保証している挙動なのでしょうか?
プラグインの説明書にはこの辺りの言及はなかったような・・・



エコQ

リンク

2008/10/15(Wed) 21:03:30|NO.20202

>コンテスト出品者さん
自分もこの動作に気づいた際に、正式な仕様なのかどうか気になったので、
Sinagawaさんに問い合わせてみたことがあります。

http://www.hspdx.net/bbs/main/log.html の
[678]に自分の問い合わせ内容と、[682]にSinagawaさんの回答が残っています。
動作保証まではされていないのですが、「保証しないので使うな」的な
注意も受けなかったため、大丈夫だろうと、自分に都合の良い方に解釈しています。
また、
「本プログラムによって生じた、 いかなる損害についても保証いたしません。」
という説明書にある記述をよく考えると、
どの命令にも動作保証はないような気がしないでもなく…ヒィ (;゚ω゚) 消されるッ

●前回投稿の訂正 と 補足
・右キーと左キーの説明コメントが逆でした

・widthで問題は解決されたようですが、
 自分が記憶している限りでは、es_xferなどの転送命令で動作が遅くなる現象は、
 転送先と転送元で、es_bufferのp5=テクスチャ使用フラグ(0〜1)の指定が
 一致していない場合などに発生していました。
 あわせて、es_set等の命令の、D3D機能の使用スイッチにも注意が必要です。



コンテスト出品者

リンク

2008/10/16(Thu) 22:10:21|NO.20261

widthでの拡縮はフルスクリーンでは不可能なのでしょうか
ウインドウモードではきれいに拡縮するのですが・・・・・・
フルスクリーン時はwidthにあわせて解像度が変わってくれたら
うれしいのですが、やっぱり無理でしょうか



エコQ

リンク

2008/10/17(Fri) 14:01:58|NO.20284

やりたい動作がよくわからないのですが、たぶん
先の NO.20170 の投稿内で提示したスクリプトの、
2行目の screen文の所を、
 chgdisp 1, 640,480:bgscr 0, 640,480 ,0 ,0,0 

と書き換えたうえで、 7行目の変数 mag の初期値設定を
mag=8 
に変更して動かしてみると、コンテスト出品者さんの
やりたい事の取っ掛かりになりそうな気はします。
全然違うかもしれませんが。(´ω`)


あ、薄々 勘付いておられるでしょうが一応…。

この自動で拡大/縮小する機能、便利なのですが
Windows98時代くらいの古めなPCとか、Direct3Dへの対応が不完全なグラボだと、
ソフトウェアによる拡大/縮小になる(?)みたいで、
その場合は、実用的な描画速度が得られませんので、ご注意を。
(エッチなの…じゃなくて、この
 ストレッチ機能を使った状態をデフォルトにするのは、
 いくない!と思います。)



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