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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0410
アイドル【hspdxfix.as】操作した内容をリプレイで再現したい3解決


アイドル

リンク

2022/4/10(Sun) 18:41:36|NO.95952

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


■やりたいこと
操作した内容をリプレイで再現したい

■問題点
2回同じファイルに保存して再生すると、弾を打ってない箇所で弾を打つ

■仕様
・「入力処理」の内容を保存
(「シフトキー、Xキー、コントロールキー」はミニソースでは処理はしてません)

・ショットを打つと点数が入る(実際は敵を倒したり、点数アイテムで増加)
・「リプレイ保存処理」で3ファイルの内選んだファイルに保存する
・エンターを押すとリプレイ保存するか聞く(実際はゲームクリア時に遷移する)
(Xで保存しないこともできる)



かなり昔にリプレイの質問をして、
解決したときの動作が入っているため、一部古い処理が混ざっているかも。
「hspdxfix.as」プラグインでは初めてやるのでうまくいかないかもしれない。

画像があったほうが処理が楽なので、画像とファイルをアップしておきました。
https://ux.getuploader.com/UGI_55/download/61
パス:HSP3_ripu

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9100,9100,4096 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-530, 640,520 ;スプライト有効エリア設定 ;******************画像***************** buffer 1 picload "ti_rp.bmp" ;タイトルとリプレイ画像 es_buffer 1,,$00ff00,,1 ;------ buffer 2 picload "G_sisu-3.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;---得点(スコア)--- es_size 11,14 CS_TEN_x = 243 ;取ってくる画像X repeat 10 es_pat 40+cnt, CS_TEN_x,855 CS_TEN_x += 11 loop ;------ buffer 4 picload "jiki-2.bmp" es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 3500, 0, 0 JIKISpd = 4 ;自機のスピード(4) ;---自機弾--- es_size 11,11, 150 es_pat 51, 1,43 gsel 0,1 gmode 1 ;■■■■■ゲーム内情報■■■■■ *初期化 ;タイトル Activ_ID = 0 ;アクティブID MENI_c = 0 ;メニューカーソル値 ;メインゲーム ki_iti = 0 ;記録値 JIKI_x = 206 : JIKI_y = 390 ;自機座標 GEMU_IJI_SUKOA = 0 ;現在スコア ;保存処理 RIPU_c = 1 ;リプレイファイル選択値 HZON_c = 1 ;保存ファイル選択値 ;複数スプライト削除 es_clear ;**********メイン**************** *メイン ;**********リプレイ関連********************** sdim replay,37000 ;リプレイファイルのサイズ exist "replay1.dat" ;ファイルのサイズ取得 rep_BAIT1 = strsize ;ファイルのサイズを変数に代入 exist "replay2.dat" ;ファイルのサイズ取得 rep_BAIT2 = strsize ;ファイルのサイズを変数に代入 exist "replay3.dat" ;ファイルのサイズ取得 rep_BAIT3 = strsize ;ファイルのサイズを変数に代入 ;保存する時に、以前のデータを表示させるため代入する bload "replay1.dat", replay RP_TENSU = lpeek(replay,0) ;点数 RP_HIZUK(0) = lpeek(replay,4) ;年 RP_HIZUK(1) = peek(replay,8) ;月 RP_HIZUK(3) = peek(replay,9) ;日 RP_NAIND = peek(replay,10) ;難易度 RPNAI_TENSU1 = RP_TENSU ;点数 RPNAI_HIZUK1(0) = RP_HIZUK(0) ;年 RPNAI_HIZUK1(1) = RP_HIZUK(1) ;月 RPNAI_HIZUK1(3) = RP_HIZUK(3) ;日 RPNAI_NAIND1 = RP_NAIND ;難易度 bload "replay2.dat", replay RP_TENSU = lpeek(replay,0) ;点数 RP_HIZUK(0) = lpeek(replay,4) ;年 RP_HIZUK(1) = peek(replay,8) ;月 RP_HIZUK(3) = peek(replay,9) ;日 RP_NAIND = peek(replay,10) ;難易度 RPNAI_TENSU2 = RP_TENSU ;点数 RPNAI_HIZUK2(0) = RP_HIZUK(0) ;年 RPNAI_HIZUK2(1) = RP_HIZUK(1) ;月 RPNAI_HIZUK2(3) = RP_HIZUK(3) ;日 RPNAI_NAIND2 = RP_NAIND ;難易度 bload "replay3.dat", replay RP_TENSU = lpeek(replay,0) ;点数 RP_HIZUK(0) = lpeek(replay,4) ;年 RP_HIZUK(1) = peek(replay,8) ;月 RP_HIZUK(3) = peek(replay,9) ;日 RP_NAIND = peek(replay,10) ;難易度 RPNAI_TENSU3 = RP_TENSU ;点数 RPNAI_HIZUK3(0) = RP_HIZUK(0) ;年 RPNAI_HIZUK3(1) = RP_HIZUK(1) ;月 RPNAI_HIZUK3(3) = RP_HIZUK(3) ;日 RPNAI_NAIND3 = RP_NAIND ;難易度 ;************カウンター********** es_cls ;画面クリア pos 0,20 : es_mes "アクティブID " + Activ_ID pos 0,40 : es_mes "メニューカーソル値 " + MENI_c pos 0,60 : es_mes "リプレイファイル選択値 " + RIPU_c pos 0,110 : es_mes "リプレイ点数 " + RP_TENSU pos 0,130 : es_mes "リプレイ点数2 " + RPNAI_TENSU2 pos 0,150 : es_mes "リプレイ点数3 " + RPNAI_TENSU3 ;■■■■■■表示処理■■■■■■ kioku = "replay" + RIPU_c + ".dat" sdim replay,320000 bload kioku, replay ;▼▼▼「プレイ」、「リプレイ」選択▼▼▼ if Activ_ID = 0 { if MENI_c = 0 { ;「プレイ」にカーソルが移動した場合 pos 20,250 : gmode 4,124,31,255 : es_copy 1,0,736 ;明るい pos 20,280 : gmode 4,199,32,255 : es_copy 1,236,833 ;暗い } else { ;「リプレイ」にカーソルが移動した場合 pos 20,250 : gmode 4,124,31,255 : es_copy 1,236,736 ;明るい pos 20,280 : gmode 4,199,32,255 : es_copy 1,0,833 ;暗い } } ;▼▼▼リプレイファイル選択▼▼▼ if Activ_ID = 1 { if MENI_c = 1 { if RIPU_c = 1 { pos 90,110 : gmode 4,76,17,255 : es_copy 1,694,766 ;ファイル名(明るい) ;日付 color 255,106,136 : pos 192,112 : es_fmes ""+ RPNAI_HIZUK1(0) + "年" + RPNAI_HIZUK1(1) + "月" + RPNAI_HIZUK1(3) + "日" pos 345,110 : gmode 4,73,18,255 : es_copy 1,955,765 ;キャラクター名 pos 460,110 : gmode 4,44,17,255 : es_copy 1,1059,765;イージ pos 150,220 : gmode 4,69,17,255 : es_copy 1,695,925 ;ステージ ;スコア sco_keta = strlen(str(RPNAI_TENSU1)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(RPNAI_TENSU1) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48-8することによってキャラ番号を調節する loop } else { pos 90,110 : gmode 4,76,17,255 : es_copy 1,771,766 ;ファイル名(暗い) } ;------2つ目のファイル------ if RIPU_c = 2 { pos 90,140 : gmode 4,76,17,255 : es_copy 1,694,798 ;ファイル名(明るい) ;日付 pos 192,142 : es_fmes ""+ RPNAI_HIZUK2(0) + "年" + RPNAI_HIZUK2(1) + "月" + RPNAI_HIZUK2(3) + "日" pos 345,140 : gmode 4,73,18,255 : es_copy 1,955,765 ;キャラクター名 pos 460,140 : gmode 4,44,17,255 : es_copy 1,1059,765;イージ pos 150,220 : gmode 4,69,17,255 : es_copy 1,695,925 ;ステージ ;スコア sco_keta = strlen(str(RPNAI_TENSU2)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(RPNAI_TENSU2) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48-8することによってキャラ番号を調節する loop } else { pos 90,140 : gmode 4,76,17,255 : es_copy 1,771,798 ;ファイル名(暗い) } ;------3つ目のファイル------ if RIPU_c = 3 { pos 90,170 : gmode 4,76,17,255 : es_copy 1,694,830 ;ファイル名(明るい) ;日付 pos 192,172 : es_fmes ""+ RPNAI_HIZUK3(0) + "年" + RPNAI_HIZUK3(1) + "月" + RPNAI_HIZUK3(3) + "日" pos 345,170 : gmode 4,73,18,255 : es_copy 1,955,765;キャラクター名 pos 460,170 : gmode 4,44,17,255 : es_copy 1,1059,765;イージ ;スコア pos 150,220 : gmode 4,69,17,255 : es_copy 1,695,925 ;ステージ sco_keta = strlen(str(RPNAI_TENSU3)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(RPNAI_TENSU3) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48-8することによってキャラ番号を調節する loop } else { pos 90,170 : gmode 4,76,17,255 : es_copy 1,771,830;ファイル名(暗い) } } } ;---Zキー処理--- getkey Zkey,90 ;決定 (Zキー) if Zkey = 0 AND ZkeyGate = 1 : ZkeyGate = 0;Zキーを押していない、Zキーゲートが立っている時 → Zキーゲートを「0」にする if Zkey = 1 AND ZkeyGate = 0 { ZkeyGate = 1 ;Zキーゲートを「立てる」 if Zkey { if MENI_c = 0 : goto *ロードする if MENI_c = 1 { ;「リプレイ」を選択したら実行 Activ_ID += 1 ;アクティブIDを+1する if Activ_ID = 2 { ;「リプレイ」でZを押したら playmode = 1 ;リプレイモードにする goto *ロードする } } } } ;---キャンセルキー--- getkey Xkey,88 ;キャンセル(Xキー) if Xkey = 0 AND XkeyGate = 1 : XkeyGate = 0 ;Xキーを押していない時 if Xkey = 1 AND XkeyGate = 0 { XkeyGate = 1 ;Xゲートを「立てる」 if Xkey { if Activ_ID = 1 : Activ_ID -= 1;1個手前に戻る } } ;************↑↓************* stick KASO if KASO & 2 { ;↑ボタン MENI_KASO_c = -1 gosub *プレイ選択↑↓ } if KASO & 8 { ;↓ボタン MENI_KASO_c = 1 gosub *プレイ選択↑↓ } await 16 : es_sync ;画面更新 goto *メイン ;*********プレイ選択↑↓********** *プレイ選択↑↓ switch Activ_ID ;第一層(タイトル) case 0 MENI_c = MENI_c + MENI_KASO_c ;カーソルの値を入れる if MENI_c < 0 { ;↑を押した場合 MENI_c = 1 } if MENI_c > 1 { ;↓を押した場合 MENI_c = 0 } swbreak ;第二層(リプレイ) case 1 RIPU_c = RIPU_c + MENI_KASO_c ;カーソルの値を入れる if RIPU_c < 1 { ;↑を押した場合 RIPU_c = 3 } if RIPU_c > 3 { ;↓を押した場合 RIPU_c = 1 } swbreak swend return ;***********ロードする************* *ロードする ;リプレイ選択時ファイルを読み込む if playmode = 1 : bload kioku, replay, 12 ;(キャラクターデーターである「13」から過ぎたデータを読み込みたいため、p3の値を「12」) ;*********ゲーム内メインループ********** *ゲーム内メイン es_cls ;画面クリア es_draw ;スプライト描画 ;********カウンター*********** pos 0,20 : es_mes "リプレイファイル選択値 " + RIPU_c pos 0,60 : es_mes "難易度 " + RP_NAIND pos 0,80 : es_mes "現在スコア " + GEMU_IJI_SUKOA pos 0,100 : es_mes "記録値 "+ ki_iti ;************gosub************ gosub *入力処理 gosub *自機の移動 gosub *自機弾移動 gosub *デバック用 ;*************自機関連****************** es_set 3500, JIKI_x,JIKI_y, 3500 ;自機表示 es_sync ;画面更新 await 16 goto *ゲーム内メイン ;*********入力処理********** *入力処理 if playmode = 0 { ;通常モード stick key,15 ;移動 getkey keyZ,90 ;Zキー getkey Skey,16 ;シフトキー getkey Xkey,88 ;Xキー getkey Ctrl_key,17 ;コントロールキー ;キー入力情報(方向キー+ボタン4つまで)を1バイト(0−255)の数値にまとめる key_Matome = Ctrl_key*128 + Xkey*64 + Skey*32 + keyZ*16 + (key & 15) poke replay,ki_iti+13,key_Matome;キー入力を保存 } ;入力の読み出し if playmode = 1 { ;リプレイモード key_Matome = peek(replay,ki_iti+13) ;キー入力を読み出し(「13」はキャラクターデーター) key = key_Matome & 15 ;方向キー keyZ = (key_Matome & 16)/16 ;ショット Skey = (key_Matome & 32)/32 ;シフトキー Xkey = (key_Matome & 64)/64 ;Xキー Ctrl_key = (key_Matome & 128)/128 ;コントロールキー } if ki_iti <= 36982 : ki_iti+1 ;記録カウント return ;**************自機の移動************* *自機の移動 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 ;*************自機弾移動**************** *自機弾移動 JK_TAMA_G_kazu = 0 if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- if JK_TAMA_c >= 1 { JK_TAMA_dai_Kz = JK_TAMA_c \ 2 if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1 } JK_TAMA_c++ ;ループ内カウンター if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側 if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側 JKSO_y = JIKI_y es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo es_apos JK_TAMA, 0,-15 ,100 ;↑に移動 RENSA = 2 ;弾の間隔 es_type JK_TAMA,2 ;type値(2) GEMU_IJI_SUKOA += 100 ;点数(デバッグ用) } if RENSA > 0 : RENSA -= 1 ;弾の間隔 ;---画面外判定--- JK_TAMA_no = 10 ;自機弾の検索ナンバー repeat es_find JK_TAM_D, 2, JK_TAMA_no,30, 1 if JK_TAM_D < 0 : break es_get JK_TAM_D_y,JK_TAM_D,5 ;自機弾Y if JK_TAM_D_y < 0 : es_kill JK_TAM_D ;自機弾【削除】 JK_TAMA_no++ ;自機弾の検索ナンバー loop return ;*****デバック用****** *デバック用 stick en,32 ;エンターキー if en&32 : goto *リプレイ保存処理 return ;***********リプレイ保存処理*************** *リプレイ保存処理 if playmode = 1 { ;リプレイモードで来てたらメインに戻る playmode = 0 goto *初期化 } es_cls ;画面クリア ;************カウンター********** pos 0,60 : es_mes "難易度 " + RP_NAIND pos 0,80 : es_mes "現在スコア " + GEMU_IJI_SUKOA pos 0,100 : es_mes "記録値 "+ ki_iti pos 0,190 : es_mes "保存ファイル選択値 " + HZON_c pos 0,210 : es_mes "カーソル値 " + MENI_KASO_c ;****************************** if playmode = 0 { ;通常モード stick KASO if KASO & 2 { ;↑ボタン MENI_KASO_c = -1 gosub *保存選択↑↓ } if KASO & 8 { ;↓ボタン MENI_KASO_c = 1 gosub *保存選択↑↓ } ;■■■■■■ファイル名■■■■■■ ;リプレイファイルを選んだ「HZON_c」で保存する kioku = "replay" + HZON_c + ".dat" ;現在のスコア表示 sco_keta = strlen(str(GEMU_IJI_SUKOA)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(GEMU_IJI_SUKOA) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48-8することによってキャラ番号を調節する loop ;------------ファイル関連------------- ;ファイル1 if HZON_c = 1 { pos 90,110 : gmode 4,76,17,255 : es_copy 1,694,766 ;ファイル名(明るい) ;日付 color 255,106,136 : pos 192,112 : es_fmes ""+ RPNAI_HIZUK1(0) + "年" + RPNAI_HIZUK1(1) + "月" + RPNAI_HIZUK1(3) + "日" pos 345,110 : gmode 4,73,18,255 : es_copy 1,955,765;キャラクター名 pos 460,110 : gmode 4,44,17,255 : es_copy 1,1059,765;イージ pos 150,220 : es_excopy 1,695,925, 70,18 ;ステージ ;リプレイ1スコア sco_keta = strlen(str(RPNAI_TENSU1)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(RPNAI_TENSU1) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48-8することによってキャラ番号を調節する loop } else { pos 90,110 : gmode 4,76,17,255 : es_copy 1,771,766 ;ファイル名(暗い) } ;---ファイル2--- if HZON_c = 2 { pos 90,140 : gmode 4,76,17,255 : es_copy 1,694,798 ;ファイル名(明るい) ;日付 color 255,106,136 : pos 192,142 : es_fmes ""+ RPNAI_HIZUK2(0) + "年" + RPNAI_HIZUK2(1) + "月" + RPNAI_HIZUK2(3) + "日" pos 345,140 : gmode 4,73,18,255 : es_copy 1,955,765 ;キャラクター名 pos 460,140 : gmode 4,44,17,255 : es_copy 1,1059,765;イージ pos 150,220 : es_excopy 1,695,925, 70,18 ;ステージ ;リプレイ2スコア sco_keta = strlen(str(RPNAI_TENSU2)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(RPNAI_TENSU2) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48+79することによってキャラ番号を調節する loop } else { pos 90,140 : gmode 4,76,17,255 : es_copy 1,771,798 ;ファイル名(暗い) } ;---ファイル3--- if HZON_c = 3 { pos 90,170 : gmode 4,76,17,255 : es_copy 1,694,830 ;ファイル名(明るい) ;日付 color 255,106,136 : pos 192,172 : es_fmes ""+ RPNAI_HIZUK3(0) + "年" + RPNAI_HIZUK3(1) + "月" + RPNAI_HIZUK3(3) + "日" pos 345,170 : gmode 4,73,18,255 : es_copy 1,955,765 ;キャラクター名 pos 460,170 : gmode 4,44,17,255 : es_copy 1,1059,765;イージ pos 150,220 : es_excopy 1,695,925, 70,18 ;ステージ ;リプレイ3スコア sco_keta = strlen(str(RPNAI_TENSU3)) ;スコアの文字列の長さを測定 repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする) string = str(RPNAI_TENSU3) ;文字列に変換 sco_bit = peek(string,cnt) ;バッファから1byte読み出し es_put 320-sco_keta*12+cnt*13,220, sco_bit-8 ;アスキーコード表で0は48になるので、48+79することによってキャラ番号を調節する loop } else { pos 90,170 : gmode 4,76,17,255 : es_copy 1,771,830 ;ファイル名(暗い) } ;---保存処理--- getkey keyZ,90 ;決定 (Zキー) if keyZ = 0 AND ZkeyGate = 1 : ZkeyGate = 0;Zキーを押していない、Zキーゲートが立っている時 → Zキーゲートを「0」にする if keyZ = 1 AND ZkeyGate = 0 { ZkeyGate = 1 ;Zキーゲートを「立てる」 if keyZ { RP_TENSU = GEMU_IJI_SUKOA ;ゲーム中スコアの「点数」をリプレイの変数に代入 RP_NAIND = NAIND ;ゲーム中の「難易度」をリプレイの変数に代入 ;日付取得 repeat 4 HIZUK(cnt) = gettime(cnt) loop lpoke replay,0,RP_TENSU ;点数 lpoke replay,4,HIZUK(0) ;年 poke replay,8,HIZUK(1) ;月 poke replay,9,HIZUK(3) ;日 poke replay,10,RP_NAIND ;難易度 poke replay,11,kixyara ;キャラクター poke replay,12,RAN_PTN ;乱数 bsave kioku, replay, 320000 goto *初期化 } } ;---キャンセルキー--- getkey Xkey,88 ;キャンセル(Xキー) if Xkey = 0 AND XkeyGate = 1 : XkeyGate = 0 ;Xキーを押していない時 if Xkey = 1 AND XkeyGate = 0 { XkeyGate = 1 ;Xゲートを「立てる」 if Xkey { goto *初期化 ;保存せずにタイトルに戻る } } } await 1 : es_sync ;画面更新 goto *リプレイ保存処理 ;*******保存選択↑↓********** *保存選択↑↓ HZON_c = HZON_c + MENI_KASO_c if HZON_c < 1 { ;↑を押した場合 HZON_c = 3 } if HZON_c > 3 { ;↓を押した場合 HZON_c = 1 } return



この記事に返信する


アイドル

リンク

2022/4/18(Mon) 22:41:58|NO.96059

あれからもうちょっとソースを弄って短くしてみました。

自機の移動記録を取るだけでも、
6回ぐらい保存して再生すると動かしていない場面で動いてしましました。
原因が全然わからず・・・

ちょっとした情報でもいいのでなにかございましたら教えてほしいです!
(画像は不要にしました)


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9100,9100,4096 ;スプライトの最大数、キャラクタの最大数,周の精度 es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-530, 640,520 ;スプライト有効エリア設定 ;******************画像***************** buffer 4 ; picload "jiki-2.bmp" ;画像は不要にした es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 3500, 0, 0 JIKISpd = 4 ;自機のスピード gsel 0,1 gmode 1 ;■■■■■ゲーム内情報■■■■■ *初期化 ;タイトル Activ_ID = 0 ;アクティブID MENI_c = 0 ;メニューカーソル値 ;メインゲーム ki_iti = 0 ;記録値 JIKI_x = 206 : JIKI_y = 390 ;自機座標 ;複数スプライト削除 es_clear ;**********メイン**************** *メイン ;**********リプレイ関連********************** sdim replay,32000 ;リプレイファイルのサイズ exist "replay1.dat" ;ファイルのサイズ取得 rep_BAIT1 = strsize ;ファイルのサイズを変数に代入 ;************カウンター********** es_cls ;画面クリア pos 0,20 : es_mes "アクティブID " + Activ_ID pos 0,40 : es_mes "メニューカーソル値 " + MENI_c ;■■■■■■表示処理■■■■■■ kioku = "replay1.dat" bload kioku, replay ;バッファにファイルをロード ;▼▼▼「プレイ」、「リプレイ」選択▼▼▼ if Activ_ID = 0 { if MENI_c = 0 { ;「プレイ」にカーソルが移動した場合 es_exboxf 20,250,200,270 , $ff0000 pos 20,250 : es_mes "ゲームスタート" pos 20,280 : es_mes "リプレイ" } else { ;「リプレイ」にカーソルが移動した場合 es_exboxf 20,280,200,300 , $ff0000 pos 20,250 : es_mes "ゲームスタート" pos 20,280 : es_mes "リプレイ" } } ;▼▼▼リプレイファイル選択▼▼▼ if Activ_ID = 1 { pos 90,110 : es_mes "リプレイを再生する場合:Z " pos 90,130 : es_mes "Xでキャンセル " } ;---決定--- getkey Zkey,90 ;決定 (Zキー) if Zkey = 0 AND ZkeyGate = 1 : ZkeyGate = 0;Zキーを押していない、Zキーゲートが立っている時 → Zキーゲートを「0」にする if Zkey = 1 AND ZkeyGate = 0 { ZkeyGate = 1 ;Zキーゲートを「立てる」 if Zkey { if MENI_c = 0 : goto *ロードする ;ゲームスタートを押したらロードする if MENI_c = 1 { ;「リプレイ」を選択したら実行 Activ_ID += 1 ;アクティブIDを+1する if Activ_ID = 2 { ;「リプレイ」でZを押したらリプレイモードにする playmode = 1 goto *ロードする } } } } ;---キャンセル--- getkey Xkey,88 ;キャンセル(Xキー) if Xkey = 0 AND XkeyGate = 1 : XkeyGate = 0 ;Xキーを押していない時 if Xkey = 1 AND XkeyGate = 0 { XkeyGate = 1 ;Xゲートを「立てる」 if Xkey { if Activ_ID = 1 : Activ_ID -= 1;1個手前に戻る } } ;************↑↓************* stick KASO if KASO & 2 { ;↑ボタン MENI_KASO_c = -1 gosub *プレイ選択↑↓ } if KASO & 8 { ;↓ボタン MENI_KASO_c = 1 gosub *プレイ選択↑↓ } await 16 : es_sync ;画面更新 goto *メイン ;*********プレイ選択↑↓********** *プレイ選択↑↓ switch Activ_ID ;第一層(タイトル) case 0 MENI_c = MENI_c + MENI_KASO_c ;カーソルの値を入れる if MENI_c < 0 { ;↑を押した場合 MENI_c = 1 } if MENI_c > 1 { ;↓を押した場合 MENI_c = 0 } swbreak swbreak swend return ;***********ロードする************* *ロードする if playmode = 1 : bload kioku, replay, 12 ;(キャラクターデーターである「13」から過ぎたデータを読み込みたいため、p3の値を「12」) ;*********ゲーム内メインループ********** *ゲーム内メイン es_cls ;画面クリア es_draw ;スプライト描画 ;********カウンター*********** pos 0,100 : es_mes "記録値 "+ ki_iti ;************gosub************ gosub *入力処理 gosub *自機の移動 gosub *デバック用 ;*************自機関連****************** es_set 3500, JIKI_x,JIKI_y, 3500 ;自機表示 es_sync ;画面更新 await 16 goto *ゲーム内メイン ;*********入力処理********** *入力処理 if playmode = 0 { ;通常モード stick key,15 ;移動 ;キー入力情報(方向キー+ボタン4つまで)を1バイト(0−255)の数値にまとめる key_Matome = key & 15 poke replay,ki_iti+13,key_Matome;キー入力を保存 } ;入力の読み出し if playmode = 1 { ;リプレイモード key_Matome = peek(replay,ki_iti+13) ;キー入力を読み出し(「13」はキャラクターデーター) key = key_Matome & 15 ;方向キー } if ki_iti <= 36982 : ki_iti+1 ;記録カウント return ;**************自機の移動************* *自機の移動 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 ;*****デバック用****** *デバック用 stick en,32 ;エンターキー if en&32 : goto *リプレイ保存処理 return ;***********リプレイ保存処理*************** *リプレイ保存処理 if playmode = 1 { ;リプレイモードで来てたらメインに戻る playmode = 0 goto *初期化 } es_cls ;画面クリア ;************カウンター********** pos 0,100 : es_mes "記録値 "+ ki_iti ;■■■■■■ファイル名■■■■■■ kioku = "replay1.dat" pos 90,110 : es_mes "Zキーで保存。" pos 90,130 : es_mes "Xでキャンセル。" ;---保存処理--- getkey keyZ,90 ;決定 (Zキー) if keyZ = 0 AND ZkeyGate = 1 : ZkeyGate = 0;Zキーを押していない、Zキーゲートが立っている時 → Zキーゲートを「0」にする if keyZ = 1 AND ZkeyGate = 0 { ZkeyGate = 1 ;Zキーゲートを「立てる」 if keyZ { bsave kioku, replay, 320000 ;バッファをファイルにセーブ goto *初期化 } } ;---キャンセル--- getkey Xkey,88 ;キャンセル(Xキー) if Xkey = 0 AND XkeyGate = 1 : XkeyGate = 0 ;Xキーを押していない時 if Xkey = 1 AND XkeyGate = 0 { XkeyGate = 1 ;Xゲートを「立てる」 if Xkey { goto *初期化 ;保存せずにタイトルに戻る } } await 1 : es_sync ;画面更新 goto *リプレイ保存処理



kinokawa

リンク

2022/4/19(Tue) 02:00:07|NO.96061

最初にreplay1.datがないと実行できないので
replay1.datを作成するスクリプトを書きました


;**********リプレイ関連********************** sdim replay,32000 ;リプレイファイルのサイズ exist "replay1.dat" ;ファイルのサイズ取得 if strsize=-1 : bsave "replay1.dat",replay,32000 : exist "replay1.dat" rep_BAIT1 = strsize ;ファイルのサイズを変数に代入

で、
>動かしていない場面で動いてしまいました。
は最初に過去のリプレイファイルを読み込み
そのままゲームを始めてしまうと過去のデーターに上書きされてしまうので
通常のゲームを始めるときは
再度sdim replay,32000等でデーターをクリアする必要があります


;***********ロードする************* *ロードする if playmode = 1 : bload kioku, replay, 12 : else : sdim replay,32000 ;(キャラクターデーターである「13」から過ぎたデータを読み込みたいため、p3の値を「12」)



アイドル

リンク

2022/4/20(Wed) 09:15:04|NO.96069

kinokawaさん回答ありがとうございます!


>通常のゲームを始めるときは
>再度sdim replay,32000等でデーターをクリアする必要があります
あーやらかしてましたねこれ。

なるほどこれで保存と再生処理が正常に動くことを確認できました!
ありがとうございます!


「余談」
本ソースでホーミングだけなんかおかしいなって思ってたら
ホーミング弾だけ消えてないという謎事象が発生。
あんまいい方法じゃないかもしれないけど、Y座標をマイナスにすることによって回解決

ホーミングが解決したと思ったら後半の敵が配置どおりに出現しない・・・なんだこれ
これは別問題になりそうなので、この質問に関しては一旦完了にします。

せっかくなのでホーミングのやつをおいておく

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 6000,6000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window 0,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,498 ;スプライト有効エリア設定 ;******************画像***************** buffer 4 ; picload "jiki.bmp" es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 3500, 0, 0 JIKISpd = 4 ;自機のスピード ;---ホーミング--- es_size 17,19, 100 es_pat 55, 56,62 ;------ buffer 5 ; picload "teki.bmp" es_buffer 5,,$00ff00,,1 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 gsel 0,1 ;敵 TEKI_MAX = 5 ;最大数 TEKI_Gmax = 2 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_GOKEI ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;配置X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;配置Y dim TEKI_NO_GID,TEKI_GOKEI ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,TEKI_GOKEI ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;▼▼▼敵配列▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = -10,-50,-90,-130,-170 ;グループ2 左上 TEKI_x(0,1) = 40,40,40,40,40 TEKI_y(0,1) = -10,-50,-90,-130,-170 TEKI_TIM = 100,300 ;■■■ゲーム内情報■■■ *初期化 ;タイトル Activ_ID = 0 ;アクティブID MENI_c = 0 ;メニューカーソル値 ;メインゲーム ki_iti = 0 ;記録値 JIKI_x = 206 : JIKI_y = 390 ;自機座標 ;ホーミング JK_HMIN_f = 0 ;ホーミングフラグ JK_HMIN_y = -20 ;弾のY座標(画面外にして無理やり消す) ;敵 TEKI_TIM_c = 0 ;カウント ;複数スプライト削除 es_clear ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(22) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,190 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_flag TEKI,$1100 ;自動削除OFF (スプライト表示ON+ボーダー消去無効ON) es_type TEKI,8192 TEKI_Move(TEKI) = TEK_G ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;**********メイン**************** *メイン ;**********リプレイ関連********************** sdim replay,37000 ;リプレイファイルのサイズ exist "replay1.dat" ;ファイルのサイズ取得 rep_BAIT1 = strsize ;ファイルのサイズを変数に代入 ;************カウンター********** es_cls ;画面クリア pos 0,20 : es_mes "アクティブID " + Activ_ID pos 0,40 : es_mes "メニューカーソル値 " + MENI_c ;■■■■■■表示処理■■■■■■ kioku = "replay1.dat" bload kioku, replay ;バッファにファイルをロード ;▼▼▼「プレイ」、「リプレイ」選択▼▼▼ if Activ_ID = 0 { if MENI_c = 0 { ;「プレイ」にカーソルが移動した場合 es_exboxf 20,250,200,270 , $ff0000 pos 20,250 : es_mes "ゲームスタート" pos 20,280 : es_mes "リプレイ" } else { ;「リプレイ」にカーソルが移動した場合 es_exboxf 20,280,200,300 , $ff0000 pos 20,250 : es_mes "ゲームスタート" pos 20,280 : es_mes "リプレイ" } } ;▼▼▼リプレイファイル選択▼▼▼ if Activ_ID = 1 { pos 90,110 : es_mes "リプレイを再生する場合:Z " pos 90,130 : es_mes "Xでキャンセル " } ;---決定--- getkey Zkey,90 ;決定 (Zキー) if Zkey = 0 AND ZkeyGate = 1 : ZkeyGate = 0;Zキーを押していない、Zキーゲートが立っている時 → Zキーゲートを「0」にする if Zkey = 1 AND ZkeyGate = 0 { ZkeyGate = 1 ;Zキーゲートを「立てる」 if Zkey { if MENI_c = 0 : goto *ロードする ;ゲームスタートを押したらロードする if MENI_c = 1 { ;「リプレイ」を選択したら実行 Activ_ID += 1 ;アクティブIDを+1する if Activ_ID = 2 { ;「リプレイ」でZを押したらリプレイモードにする playmode = 1 goto *ロードする } } } } ;---キャンセル--- getkey Xkey,88 ;キャンセル(Xキー) if Xkey = 0 AND XkeyGate = 1 : XkeyGate = 0 ;Xキーを押していない時 if Xkey = 1 AND XkeyGate = 0 { XkeyGate = 1 ;Xゲートを「立てる」 if Xkey { if Activ_ID = 1 : Activ_ID -= 1;1個手前に戻る } } ;************↑↓************* stick KASO if KASO & 2 { ;↑ボタン MENI_KASO_c = -1 gosub *プレイ選択↑↓ } if KASO & 8 { ;↓ボタン MENI_KASO_c = 1 gosub *プレイ選択↑↓ } await 16 : es_sync ;画面更新 goto *メイン ;*********プレイ選択↑↓********** *プレイ選択↑↓ switch Activ_ID ;第一層(タイトル) case 0 MENI_c = MENI_c + MENI_KASO_c ;カーソルの値を入れる if MENI_c < 0 { ;↑を押した場合 MENI_c = 1 } if MENI_c > 1 { ;↓を押した場合 MENI_c = 0 } swbreak swbreak swend return ;***********ロードする************* *ロードする if playmode = 1 { bload kioku, replay, 12 ;リプレイのときは記録を読み込む } else { sdim replay,37000 ;ゲームスタートのときはデータクリアする } ;(キャラクターデーターである「13」から過ぎたデータを読み込みたいため、p3の値を「12」) ;*********ゲーム内メインループ********** *ゲーム内メイン es_cls ;画面クリア es_draw ;スプライト描画 ;********カウンター*********** pos 0,100 : es_mes "記録値 "+ ki_iti pos 0,150 : es_mes "kyori_2 "+ kyori_2 pos 0,170 : es_mes "angle "+ angle ;************gosub************ gosub *入力処理 gosub *自機の移動 gosub *自機ホーミング gosub *敵移動 gosub *デバック用 ;*************自機関連****************** es_set 3500, JIKI_x,JIKI_y, 3500 ;自機表示 es_sync ;画面更新 await 16 goto *ゲーム内メイン ;*********入力処理********** *入力処理 if playmode = 0 { ;通常モード stick key,15 ;移動 getkey keyZ,90 ;Zキー getkey Skey,16 ;シフトキー getkey Xkey,88 ;Xキー getkey Ctrl_key,17 ;コントロールキー ;キー入力情報(方向キー+ボタン4つまで)を1バイト(0−255)の数値にまとめる key_Matome = Ctrl_key*128 + Xkey*64 + Skey*32 + keyZ*16 + (key & 15) poke replay,ki_iti+13,key_Matome;キー入力を保存 } ;入力の読み出し if playmode = 1 { ;リプレイモード key_Matome = peek(replay,ki_iti+13) ;キー入力を読み出し(「13」はキャラクターデーター) key = key_Matome & 15 ;方向キー keyZ = (key_Matome & 16)/16 ;ショット Skey = (key_Matome & 32)/32 ;シフトキー Xkey = (key_Matome & 64)/64 ;Xキー Ctrl_key = (key_Matome & 128)/128 ;コントロールキー } if ki_iti <= 36982 : ki_iti+1 ;記録カウント return ;**************自機の移動************* *自機の移動 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 ;*************自機ホーミング**************** *自機ホーミング if keyZ AND JK_HMIN_f = 0 { JK_HMIN_f = 1 ;ホーミングフラグを【立てる】 JK_HMIN_x = double(JIKI_x) : JK_HMIN_y = double(JIKI_y) ;実数値に変換 } if JK_HMIN_f = 1 { ;ホーミングフラグ立ってたら実行 TEKI_no = 80 ;敵のスプライトナンバ− kyori = 10000.0 ;自機と敵の距離を代入する変数(最も近い敵を探すために出来るだけ大きな数値を入れておく) TEKI_HOMIN_no = -1 ;敵が全員いなかった時にマイナス値を入れることによって、ホーミングが最後の敵に行かないようにする repeat es_find HMI_TEKI_D, 4096, TEKI_no,190;画面内の敵を探す if HMI_TEKI_D = -1 : break es_get JK_HMIN_TEKI_x,TEKI_no,3 ;敵X es_get JK_HMIN_TEKI_y,TEKI_no,5 ;敵Y if (JK_HMIN_TEKI_x > 30) AND (JK_HMIN_TEKI_y > 10) AND (JK_HMIN_TEKI_x < 412) AND (JK_HMIN_TEKI_y < 460) { ;自機と敵の距離 kyori_2 = sqrt((JIKI_x-JK_HMIN_TEKI_x)*(JIKI_x-JK_HMIN_TEKI_x) + (JIKI_y-JK_HMIN_TEKI_y)*(JIKI_y-JK_HMIN_TEKI_y));ルート値を返す if kyori_2 < kyori { kyori = kyori_2 ;近い敵までの距離を更新 TEKI_HOMIN_no = HMI_TEKI_D ;近い敵のスプライトナンバ−更新 } }TEKI_no++ ;敵の検索開始ナンバ− loop ;---弾を出す--- es_get JK_HMIN_TEKI_x,TEKI_HOMIN_no,3 ;敵X es_get JK_HMIN_TEKI_y,TEKI_HOMIN_no,5 ;敵Y es_set 55, JK_HMIN_x+5,JK_HMIN_y , 55 ;スプライト設定 es_type 55,256 ;type値 angle = 0.0 ;角度を入れる変数 if TEKI_HOMIN_no != -1 { ;敵がいる場合 angle = atan(JK_HMIN_TEKI_y - JK_HMIN_y, JK_HMIN_TEKI_x - JK_HMIN_x-10) ;敵とホーミングとの角度を求める JK_HMIN_x += 8.0 * cos(angle) : JK_HMIN_y += 8.0 * sin(angle) ;弾速さ } else { ;敵がいない場合正面に真っ直ぐ進む JK_HMIN_x += 8.0 * cos(deg2rad(270)) : JK_HMIN_y += 8.0 * sin(deg2rad(270)) } ;---当たり判定--- if (JK_HMIN_TEKI_x > 30) AND (JK_HMIN_TEKI_y > 10) AND (JK_HMIN_TEKI_x < 412) AND (JK_HMIN_TEKI_y < 460) { es_check HMIN_VS_TEKI ,TEKI_HOMIN_no,256 if HMIN_VS_TEKI != -1 { JK_HMIN_f = 0 ;ホーミングフラグ【初期化】 es_kill TEKI_HOMIN_no ;敵【削除】 es_kill HMIN_VS_TEKI ;ホーミング【削除】 } } } ;画面外 es_get JK_HMIN_TEKI_x,55,3 ;ホーミングX es_get JK_HMIN_TEKI_y,55,5 ;ホーミングY if (JK_HMIN_TEKI_x < 30-17) or (JK_HMIN_TEKI_y < 10-19) or (JK_HMIN_TEKI_x > 412+17) or (JK_HMIN_TEKI_y > 460+19) { JK_HMIN_f = 0 ;ホーミングフラグ【初期化】 es_kill 55 ;ホーミング【削除】 } return ;*************敵移動**************** *敵移動 if TEKI_TIM_c < 2800 : TEKI_TIM_c += 1 ;敵出現カウンター ;枠外 (↓に移動する) TEKI_no = 80 ;敵スプライト検索開始NO repeat es_find TEKI_D, 8192, TEKI_no,190, 1 if TEKI_D < 0 : break es_get TEKI_pos_x,TEKI_D,3 ;敵X es_get TEKI_pos_y,TEKI_D,5 ;敵Y TEK_G = TEKI_NO_GID(TEKI_D) ;敵スプライトNOをキーにグループインデックス取り出し TEKI_DID = TEKI_NO_DID(TEKI_D) ;敵スプライトNOをキーに敵データインデックス取り出し TAMA_NO_DID(TEKI_IDO) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) ;1グループ if TEKI_TIM_c >= TEKI_TIM(TEK_G) { if TEK_G = 0 { es_apos TEKI_D, 0,1, 200 ;200のスピードで↓に移動する } } ;2グループ if TEKI_TIM_c >= TEKI_TIM(TEK_G) { if TEK_G = 1 { es_apos TEKI_D, 0,1, 200 ;200のスピードで↓に移動する } } ;---枠内 (type書き換え)--- if (TEKI_pos_x > 30) AND (TEKI_pos_y > 10) AND (TEKI_pos_x < 412) AND (TEKI_pos_y < 460) { es_get TEKI_flag,TEKI_D,0 ;敵のflag値を「取得」 es_type TEKI_D,4096 ;画面内のtype値設定 }TEKI_no++ ;敵の検索開始ナンバ− loop ;枠内 (途中移動) dup TEKI_Move_f,TEKI_IDO_f TEKI_no = 80 ;敵の検索開始ナンバ− repeat es_find TEKI_D, 4096, TEKI_no,190, 1 if TEKI_D < 0 : break es_get TEKI_pos_x,TEKI_D,3 ;敵X es_get TEKI_pos_y,TEKI_D,5 ;敵Y if TEKI_pos_y >= 300 { if TEKI_Move(TEKI_D) = 0 { es_apos TEKI_D, -1,0, 200 ;200のスピードで←に移動する } if TEKI_Move(TEKI_D) = 1 { es_apos TEKI_D, 1,0, 200 ;200のスピードで→に移動する } } ;---当たり判定--- es_check JKTM_VS_TEKI ,TEKI_D,2 if JKTM_VS_TEKI != -1 & TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 ;敵フラグ【立てる】 es_kill TEKI_D ;敵【削除】 es_kill JKTM_VS_TEKI;自機弾【削除】 JK_HIT++ ;デバッグ用 BS_STU_c++ ;ボス出現カウント } ;---画面外--- if (TEKI_pos_x < 30-18) or (TEKI_pos_y < 10-19) or (TEKI_pos_x > 412+18) or (TEKI_pos_y > 460+19) { es_kill TEKI_D ;敵【削除】 }TEKI_no++ ;敵の検索開始ナンバ− loop return ;*****デバック用****** *デバック用 stick en,32 ;エンターキー if en&32 : goto *リプレイ保存処理 return ;***********リプレイ保存処理*************** *リプレイ保存処理 if playmode = 1 { ;リプレイモードで来てたらメインに戻る playmode = 0 goto *初期化 } es_cls ;画面クリア ;************カウンター********** pos 0,100 : es_mes "記録値 "+ ki_iti ;■■■■■■ファイル名■■■■■■ kioku = "replay1.dat" pos 90,110 : es_mes "Zキーで保存。" pos 90,130 : es_mes "Xでキャンセル。" ;---保存処理--- getkey keyZ,90 ;決定 (Zキー) if keyZ = 0 AND ZkeyGate = 1 : ZkeyGate = 0;Zキーを押していない、Zキーゲートが立っている時 → Zキーゲートを「0」にする if keyZ = 1 AND ZkeyGate = 0 { ZkeyGate = 1 ;Zキーゲートを「立てる」 if keyZ { bsave kioku, replay, 370000 ;バッファをファイルにセーブ goto *初期化 } } ;---キャンセル--- getkey Xkey,88 ;キャンセル(Xキー) if Xkey = 0 AND XkeyGate = 1 : XkeyGate = 0 ;Xキーを押していない時 if Xkey = 1 AND XkeyGate = 0 { XkeyGate = 1 ;Xゲートを「立てる」 if Xkey { goto *初期化 ;保存せずにタイトルに戻る } } await 1 : es_sync ;画面更新 goto *リプレイ保存処理



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