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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0423
アイドル【hspdxfix.as】会話をリプレイで再生すると、プレイ時とずれてしまう2解決


アイドル

リンク

2022/4/23(Sat) 08:48:09|NO.96104

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


■やりたいこと
会話をリプレイで再生した場合でも、プレイしたときと同じように進めたい

■問題点
Zキーでショットと会話が進むため、Zキーおしっぱだと会話がスタートします。
なので会話がスタートするまでカウントしてからスタートするようにしました。


if REI_ST_KAIWA_c < 51 : REI_ST_KAIWA_c += 1 ;50まで数を数える if REI_ST_KAIWA_c > 50 : REI_KAIJI_f = 1 ;51以上になったらフラグを立てる

ただしこれでも結局はZキーおしっぱだと会話が進んでしまうので改善したいです。
ちなみに会話を別のキー(A)とかに割り当てるはあまりしたくないです。

■仕様
Zキー:ショット、会話が進む
会話:ボスが出てきたら会話スタート、倒したら会話スタート
下記はミニソースように用意した処理です
(ボスを倒したら〜〜〜とかは余計な処理になるので)

REI_ST_KAIWA_c:会話進める
REIMU_GEKI_c:倒したら会話進める
REI_GEKI_ST_KAIWA_c:撃破後の会話


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9100,9100,4096 ;スプライトの最大数、キャラクタ定義の最大数,周の精度 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 ;---自機弾--- es_size 11,11, 150 es_pat 51, 1,43 ;------ gsel 0,1 ;■■■ゲーム内情報■■■ *初期化 ;タイトル Activ_ID = 0 ;アクティブID MENI_c = 0 ;メニューカーソル値 ;メインゲーム ki_iti = 0 ;記録値 JIKI_x = 206 : JIKI_y = 390 ;自機座標 ;自機弾関連 RENSA = 0 ;弾の間隔 JK_TAMA_c = 0 ;自機弾カウント ;---デバッグ用--- REI_ST_KAIWA_c = 0 REI_KAIJI_f = 0 REI_KAIWA_c = 0 REI_KAIWA_ST_f = 0 REIMU_GEKI_c = 0 REIMU_GEKIH_f = 0 REI_GEKI_ST_KAIWA_c = 0 REI_GEKI_KAIJI_f = 0 GEKI_REI_KAIWA_c = 0 GEKI_REI_KAIWA_ST_f = 0 ;複数スプライト削除 es_clear ;*****メイン***** *メイン ;*****リプレイ関連***** sdim replay,37000 ;リプレイファイルのサイズ exist "replay1.dat" ;ファイルのサイズ取得 if strsize = -1 : bsave "replay1.dat",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 ;リプレイのときは記録を読み込む } else { sdim replay,37000 ;ゲームスタートのときはデータクリアする } ;(キャラクターデーターである「13」から過ぎたデータを読み込みたいため、p3の値を「12」) ;*****ゲーム内メインループ***** *ゲーム内メイン es_cls ;画面クリア es_draw ;スプライト描画 ;*****カウンター***** pos 0,20 : es_mes "記録値 "+ ki_iti pos 0,50 : es_mes "REI_ST_KAIWA_c "+ REI_ST_KAIWA_c pos 0,70 : es_mes "REI_KAIJI_f "+ REI_KAIJI_f pos 0,90 : es_mes "REI_KAIWA_c " + REI_KAIWA_c pos 0,110 : es_mes "REI_KAIWA_ST_f " + REI_KAIWA_ST_f pos 0,140 : es_mes "REIMU_GEKI_c "+ REIMU_GEKI_c pos 0,160 : es_mes "REIMU_GEKIH_f "+ REIMU_GEKIH_f pos 0,190 : es_mes "REI_GEKI_ST_KAIWA_c "+ REI_GEKI_ST_KAIWA_c pos 0,210 : es_mes "REI_GEKI_KAIJI_f "+ REI_GEKI_KAIJI_f pos 0,230 : es_mes "GEKI_REI_KAIWA_c " + GEKI_REI_KAIWA_c pos 0,250 : es_mes "GEKI_REI_KAIWA_ST_f " + GEKI_REI_KAIWA_ST_f ;*****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 ;*****自機弾移動***** *自機弾移動 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値 } 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 ;*****ボスの会話***** *ボスの会話 if REI_KAIWA_ST_f = 0 { ;ボス会話終わったら実行しない ;会話がスタートするまで if REI_ST_KAIWA_c < 51 : REI_ST_KAIWA_c += 1 ;50まで数を数える if REI_ST_KAIWA_c > 50 : REI_KAIJI_f = 1 ;51以上になったらフラグを立てる ;会話内容(テスト用) if REI_KAIWA_c = 1 : pos 100,300 : es_mes "1回めの会話 " if REI_KAIWA_c = 2 : pos 100,300 : es_mes "会話を進めました " if REI_KAIWA_c = 3 : pos 100,300 : es_mes "さんかいめ " if REI_KAIWA_c = 4 : pos 100,300 : es_mes "4ぉー " if REI_KAIWA_c = 5 : pos 100,300 : es_mes "5くごくのめる " if REI_KAIWA_c = 6 : pos 100,300 : es_mes "6でもない " if REI_KAIWA_c = 7 : pos 100,300 : es_mes "7ラッキー " if REI_KAIWA_c = 8 : pos 100,300 : es_mes "8ちぱちぱち " if REI_KAIWA_c = 9 : pos 100,300 : es_mes "9999 " ;Zキー判定 if REI_KAIJI_f = 1 { ;フラグが立ってたら実行 if keyZ { ;キーが押されたら実効 if keyZ_f = 0 { if REI_KAIWA_c <= 9 : REI_KAIWA_c += 1 ;ボス会話カウントを進める keyZ_f = 1 } } else { keyZ_f = 0 } } ;ボス会話終わりフラグ if REI_KAIWA_c >= 10 : REI_KAIWA_ST_f = 1 } ;会話が終わったら実行する if REI_KAIWA_c = 10 { if REIMU_GEKI_c <= 50 : REIMU_GEKI_c++ if REIMU_GEKI_c >= 50 : REIMU_GEKIH_f = 1 ;ボス会話終わったら実行しないフラグを立てる } return ;*****ボス撃破後の会話***** *ボス撃破後の会話 if REIMU_GEKIH_f = 1 { ;1回目の会話が終わったら実行する if GEKI_REI_KAIWA_ST_f = 0 { ;ボス会話終わったら実行しない ;会話がスタートするまで if REI_GEKI_ST_KAIWA_c < 51 : REI_GEKI_ST_KAIWA_c += 1 ;50まで数を数える if REI_GEKI_ST_KAIWA_c > 50 : REI_GEKI_KAIJI_f = 1 ;51以上になったらフラグを立てる ;会話内容(テスト用) if GEKI_REI_KAIWA_c = 1 : pos 100,300 : es_mes "撃破した1回めの会話 " if GEKI_REI_KAIWA_c = 2 : pos 100,300 : es_mes "撃破してから会話を進めました " if GEKI_REI_KAIWA_c = 3 : pos 100,300 : es_mes "撃破さんかいめ " if GEKI_REI_KAIWA_c = 4 : pos 100,300 : es_mes "撃破4ぉー " if GEKI_REI_KAIWA_c = 5 : pos 100,300 : es_mes "撃破5くごくのめる " if GEKI_REI_KAIWA_c = 6 : pos 100,300 : es_mes "撃破6でもない " if GEKI_REI_KAIWA_c = 7 : pos 100,300 : es_mes "撃破7ラッキー " if GEKI_REI_KAIWA_c = 8 : pos 100,300 : es_mes "撃破8ちぱちぱち " ;Zキー判定 if REI_GEKI_KAIJI_f = 1 { ;フラグが立ってたら実行 if keyZ { ;キーが押されたら実効 if keyZ_GEKI_f = 0 { if GEKI_REI_KAIWA_c <= 9 : GEKI_REI_KAIWA_c += 1 ;ボス会話カウントを進める keyZ_GEKI_f = 1 } } else { keyZ_GEKI_f = 0 } } ;ボス会話終わりフラグ if GEKI_REI_KAIWA_c >= 8 : GEKI_REI_KAIWA_ST_f = 1 } } 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 *リプレイ保存処理



この記事に返信する


kinokawa

リンク

2022/4/26(Tue) 19:44:45|NO.96137

あまり意味が分かっていないのですが
REI_ST_KAIWA_c > 50 and keyZ = 0 ではだめなのかな^^;

;会話がスタートするまで
if REI_ST_KAIWA_c < 51 : REI_ST_KAIWA_c += 1 ;50まで数を数える
if REI_ST_KAIWA_c > 50 and keyZ = 0: REI_KAIJI_f = 1 ;51以上になったらフラグを立てる



アイドル

リンク

2022/4/29(Fri) 09:28:38|NO.96161

kinokawaさん
アドバイスありがとうございます。おかげでできました



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