フルスクリーンモード |
フルスクリーンモードとウィンドウモードを切り替えられるようにします。
1.変数の初期設定 |
2.指定したモードで画面を出す |
3.メニューを表示する |
4.項目の選択 |
フルスクリーンモードとウィンドウモードを切り替えるには、ddscreen命令の第3引数を変えます。0だとフルスクリーンモード、1だとウィンドウモードです。切り替える時には、一旦DirectDrawを終了し、再度初期化(ddinit)を行い、ddscreen命令を実行しなおします。初期化したわけですから、仮想画面に絵を読み込む処理も再度行います。
DirectDrawを終了する命令はddendです。
ついでに、タイトル画面にメニューを表示します。今まで"Push Ctrl Key" と書いていたのをやめて、"START"、"SCREEN"、"EXIT"の3つの項目を並べます。"SCREEN"を選んだ時にモードを切り替えます。"START"でゲームがスタートし、"EXIT"でプログラムを終了します。
1.変数の初期設定 |
「プログラム起動時の初期設定」に以下の2つを追加します。
; スクリーンモード
scrmode=1 ; 0:フルスクリーン 1:ウィンドウ
; タイトル画面で、選択されている項目
actitem=0
scrmodeはscreen modeの略です。0ならフルスクリーン、1ならウィンドウモードです。
actitemはaction itemの略で、今どの項目にカーソルがあるかを表しています。0ならSTART、1ならSCREEN、2ならEXITです。
2.指定したモードで画面を出す |
画面を作る命令を、scrmodeで指定したモードで出すように修正します。
*Screen_Init
ddinit
ddscreen 640,480,scrmode,2
3.メニューを表示する |
「タイトル表示」処理中の、"Push Ctrl Key"
と書く部分を、"START"、"SCREEN"、"EXIT"の3つを縦に並べて表示するように変えます。
scrmodeが0の時は"SCREEN"の横に"FULL"、1の時は"WINDOW"と書きます。
actitemが指し示す項目の左横にカーソル(">")を表示します。
msx=64:msy=328:mescont="S T A R T":gosub *wrtmes
msx=64:msy=360
if scrmode=0 {
mescont="S C R E E N : F U L L"
}
else {
mescont="S C R E E N : W I N D O W"
}
gosub *wrtmes
msx=64:msy=392:mescont="E X I T":gosub *wrtmes
msx=48:msy=328+(actitem*32):mescont=">":gosub *wrtmes
ddredraw
4.項目の選択 |
前はタイトルを表示したら、Ctrlキーが押されるのを待つ処理でループしていました。今回は毎回画面を描き直すようにします。そこで、画面を消す命令の前にラベルを追加します。
*Title_Loop
await 16
gosub *Clear_Screen
gdx=32 :gdy=100
gdox=0 :gdoy=$40
gdw=$100 :gdh=$40
gosub *Graphic_Draw
・
・
・
なお、"gdx=32 :gdy=100"以降はゲーム名"ABOGADRO"を表示する処理です。
キー入力の処理は以下のようになります。
以上をふまえて、フルスクリーンとウィンドウを切り替える処理は以下のようになります。
; プログラム起動時の初期設定 ; スクリーンモード scrmode=1 ; 0:フルスクリーン 1:ウィンドウ ; タイトル画面で、選択されている項目 actitem=0 *Screen_Init ddinit ddscreen 640,480,scrmode,2 ; 仮想画面1に絵を読み込む。 ddgsel 1 exist "samplecg.bmp" if strsize = -1 { end } sdim buf, strsize bload "samplecg.bmp", buf, strsize ddloadmemory buf, 2 *Game_Start ; タイトル表示 ddgsel 0 gosub *In_Key *Title_Loop await 16 gosub *Clear_Screen gdx=32 :gdy=100 gdox=0 :gdoy=$40 gdw=$100 :gdh=$40 gosub *Graphic_Draw msx=64:msy=328:mescont="S T A R T":gosub *wrtmes msx=64:msy=360 if scrmode=0 { mescont="S C R E E N : F U L L" } else { mescont="S C R E E N : W I N D O W" } gosub *wrtmes msx=64:msy=392:mescont="E X I T":gosub *wrtmes msx=48:msy=328+(actitem*32):mescont=">":gosub *wrtmes ddredraw gosub *In_Key if (pukey=0)&(ukey=1) { actitem=actitem-1 if actitem=-1 { actitem=2 } } if (pdkey=0)&(dkey=1) { actitem=actitem+1 if actitem=3 { actitem=0 } } if (pckey=0)&(ckey=1) { if actitem=0 { goto *Init_Param } if actitem=1 { scrmode=(scrmode+1)\2 ddend goto *Screen_Init } if actitem=2 { end } } goto *Title_Loop *Init_Param ; ゲームスタート時の初期設定 score=0 oneup=50000 ・ ・ ・
実行画面