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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0918
アイドル【hspdxfix.as】ゲーム中にウィンドウのサイズを変更したい5解決


アイドル

リンク

2020/9/18(Fri) 13:59:05|NO.91394

hspdxfix.asプラグインで作ったSTGゲームになります。

本当は質問を同時進行しないほうがいいんですが、
他のソースを作れば何かしら解決の糸口が見つかるのでは?って思い作成してました。


ゲーム中にウィンドウサイズの変更とフルスクリーン化をしたいのですが、
下記の方法だとフルスクリーンにはなるものの、画面が真っ暗になってしまい何かしらのキーを操作すると閉じてしまいます。
多分「es_screen」を二重宣言していることが原因だと思われますが、
いまいち原因がわからないためアドバイス等あればよろしくおねがいします!

 「考え方」
ゲーム中にウィンドウサイズを変更するので・・・
最初に「es_screen 640,480 ,0,0,1,1」でウィンドウモードを宣言します。
サイズ変更を実行したとき「es_screen 640,480 ,32,,0,1」でフルスクリーンを宣言します。

 ■仕様■
1.ゲーム中のオプションで画面のサイズの変更ができる
2.選択した内容によって画面のサイズを「通常、2倍、フルスクリーン」に変化させる
3.再起動したとき、閉じたときのサイズで起動する(「peek」で変数を読み込む想定なので、これは大丈夫だと思います)


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,500,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;************タイトル*************** *タイトル es_cls es_draw ;*************カウンター************ pos 410,250 : es_mes "メインメニューのカウント " + MNI_c pos 410,270 : es_mes "カーソル " + KASO_c pos 200,370 : es_mes "Zキーで決定です" ;********Zキーを読むこむ************ getkey Zkey,90 ;決定 (Zキー) ;通常サイズ(640*480) if Zkey & MNI_c = 0 {;メニューの1段目 SKU_SIZ = 1 ;サイズフラグを1にする goto *初期化 } ;2倍(960*720) if Zkey & MNI_c = 1 {;メニューの2段目 SKU_SIZ = 2 ;サイズフラグを2にする goto *初期化 } ;フルスクリーン if Zkey & MNI_c = 2 {;メニューの3段目 SKU_SIZ = 3 ;サイズフラグを3にする goto *初期化 } ;********カーソルキーを読むこむ********* stick KASO ;カーソルキー取得 if ( KASO & 2 ) { ;↑ボタン KASO_c = -1 gosub *↑↓ボタン } if ( KASO & 8 ) { ;↓ボタン KASO_c = 1 gosub *↑↓ボタン } ;*******メニューの文字を出す****** pos 200,250 : es_mes "通常サイズ(640*480)" pos 200,280 : es_mes "2倍(960*720)" pos 200,310 : es_mes "フルスクリーン" switch MNI_c case 0 pos 150,250 : es_mes "●" swbreak case 1 pos 150,280 : es_mes "●" swbreak case 2 pos 150,310 : es_mes "●" swbreak swend es_sync ;画面更新 await 16 goto *タイトル ;**********↑↓ボタン******* *↑↓ボタン MNI_c = MNI_c + KASO_c ; (↑がマイナス1、↓がプラス1) if MNI_c < 0 { MNI_c = 2 } if MNI_c > 2 { MNI_c = 0 } return ;★★★★★初期化★★★★★ *初期化 if SKU_SIZ = 1 { ;通常サイズ(640*480) ;基準命令 (参考用) ; screen 0,SKU_SIZ*640, SKU_SIZ*480,2 ;非表示のウィンドウを作成する ; width SKU_SIZ*640, SKU_SIZ*480 ;ウィンドウサイズ設定 } if SKU_SIZ = 2 { ;2倍(960*720) ;基準命令 (実行されるが真っ白になる) ; chgdisp 1 ;解像度の変更は正常に行なわれた ; bgscr 0,640,480,,0,0 ;枠のないウィンドウを初期化 } if SKU_SIZ = 3 { ;フルスクリーン ;実行されるが真っ黒になる ; es_screen 640,480 ,32,,0,1 ;フルスクリーンで初期化 } buffer 4 ; picload "jiki.bmp" ;自機 es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 150, 0,0 JIKI_x = 286 : JIKI_y = 352 JIKISpd = 4 ;自機のスピード(4) gsel 0,1 ;************ゲーム画面*************** *ゲーム画面 es_cls es_draw ;*************カウンター**************** pos 410,250 : es_mes "SKU_SIZ " + SKU_SIZ ;************************************** gosub *自機の移動 es_set 150, JIKI_x,JIKI_y, 150 ;自機表示 es_sync ;画面更新 await 16 goto *ゲーム画面 ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return



この記事に返信する


MillkeyStars

リンク

2020/9/19(Sat) 15:32:05|NO.91400

ゲーム中に画面解像度を変える場合、いったん hspdxfix を es_bye で終了後、再度 es_ini でまっさらな状態から開始させないと、無理じゃないかなー。(注1)
単純に、es_screen を多重に利用したら、こちらの環境でも落ちてしまうという現象があったので。
[注1] 開発者のドキュメントには、es_bye 後に es_ini を利用すると落ちる現象が、既知情報としてあります。

es_ini はシステムに DirectX を利用します。と通知し、実際には es_screen で初期化作業が入ってると思われる。



アイドル

リンク

2020/9/19(Sat) 20:53:00|NO.91401

MillkeyStarsさん
返答ありがとうございますー

いったんes_byeで終了しないとダメなんですね。
ようするに「このスクリーンはここまで」って教えないとだめってことか。

>es_bye 後に es_ini を利用すると落ちる現象が、既知情報としてあります。
うわああそうなのかー
ゲーム中に実装するのは難しそうかなーって感じがしますね。


1.メインゲームとは別プログラムにコンフィグ専用を作って、そこで設定でき「peek」でファイルに保存する
2.メインゲーム開始時、ファイルに保存された変数をスクリーンに代入する

この方法がスマートかもしれませんね(東方原作がこんな感じ)
少しユーザーには手間になりますが、上記が可能かやってみようかと想います。



kanamaru

リンク

2020/9/19(Sat) 21:18:22|NO.91402

僕はhspdxfixに詳しくはないんですけど、
少し調べてみました。
最初はbufferとかに描画して実際の画面に拡大描画できないかなと思ってたら、
使える命令に限りがあるみたいですね。
で、調べていたら動作保証がない代わりに使えそうな情報がありました。
それは、width命令が使えるということです。
http://hsp.tv/play/pforum.php?mode=pastwch&num=19762
これならゲーム中でもサイズ変更できるはず。



アイドル

リンク

2020/9/20(Sun) 14:03:15|NO.91404

kanamaruさん
返答ありがとうございますー

そうなんですよねー使える命令に制限があって、使おうとしても適応されないものが多いです
width命令でこんなことできるんですね。
そのためには「screen 0, ginfo_dispx,ginfo_dispy ,0 ,0,0」も必要で、
「マクロとしてhspdef.as内で定義されている」情報が入るって感じなのかな。


これならフルスクリーン以外簡単にできますね。
フルスクリーンは調べた感じだと、情報が無いですな・・・

NO.91401で私が返答した内容などを考慮してどのようにするのか決めようかな。



アイドル

リンク

2020/9/20(Sun) 14:26:11|NO.91405

っと思ったらよくよく考えたらフルスクリーンできますねこれ。


「ginfo_dispx、ginfo_dispy」をwidthにそのまま入れればフルスクリーンにできました!
ただフルスクリーンにすると、左側にちょこっと空白があいちゃうのが気になりますね・・・

まぁあんま問題ないし気になる人が多いなら、
「peek」でファイルに値を保存してそれを読み込む形にしようかと思います。
おかげで解決できました!ありがとうございます!!

後はホーミングだ・・・

#include "hspdxfix.as" ;DXライブラリ使用 screen 0, ginfo_dispx,ginfo_dispy ,0 ,0,0 width ,,130,200 ;ウィンドウの位置 es_ini 640,500,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;************タイトル*************** *タイトル es_cls es_draw ;*************カウンター************ pos 410,250 : es_mes "メインメニューのカウント " + MNI_c pos 410,270 : es_mes "カーソル " + KASO_c pos 200,370 : es_mes "Zキーで決定です" ;********Zキーを読むこむ************ getkey Zkey,90 ;決定 (Zキー) ;通常サイズ(640*480) if Zkey & MNI_c = 0 {;メニューの1段目 goto *初期化 } ;2倍(960*720) if Zkey & MNI_c = 1 {;メニューの2段目 SKU_SIZ = 2 ;サイズフラグを2にする goto *初期化 } ;フルスクリーン if Zkey & MNI_c = 2 {;メニューの3段目 SKU_SIZ = 3 ;サイズフラグを3にする goto *初期化 } ;********カーソルキーを読むこむ********* stick KASO ;カーソルキー取得 if ( KASO & 2 ) { ;↑ボタン KASO_c = -1 gosub *↑↓ボタン } if ( KASO & 8 ) { ;↓ボタン KASO_c = 1 gosub *↑↓ボタン } ;*******メニューの文字を出す****** pos 200,250 : es_mes "通常サイズ(640*480)" pos 200,280 : es_mes "2倍(960*720)" pos 200,310 : es_mes "フルスクリーン" switch MNI_c case 0 pos 150,250 : es_mes "●" swbreak case 1 pos 150,280 : es_mes "●" swbreak case 2 pos 150,310 : es_mes "●" swbreak swend es_sync ;画面更新 await 16 goto *タイトル ;**********↑↓ボタン******* *↑↓ボタン MNI_c = MNI_c + KASO_c ; (↑がマイナス1、↓がプラス1) if MNI_c < 0 { MNI_c = 2 } if MNI_c > 2 { MNI_c = 0 } return ;★★★★★初期化★★★★★ *初期化 if SKU_SIZ = 2 { ;2倍(960*720) width 960,720 } if SKU_SIZ = 3 { ;フルスクリーン width ginfo_dispx,ginfo_dispy, 0,0 } buffer 4 ; picload "jiki.bmp" ;自機 es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 150, 0,0 JIKI_x = 286 : JIKI_y = 352 JIKISpd = 4 ;自機のスピード(4) gsel 0,1 ;************ゲーム画面*************** *ゲーム画面 es_cls es_draw ;*************カウンター**************** pos 410,250 : es_mes "SKU_SIZ " + SKU_SIZ ;************************************** gosub *自機の移動 es_set 150, JIKI_x,JIKI_y, 150 ;自機表示 es_sync ;画面更新 await 16 goto *ゲーム画面 ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return



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