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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1223
fateノベルゲームのセーブ5解決


fate

リンク

2011/12/23(Fri) 11:13:04|NO.43892

ノベルゲームを作っているのですが、データのセーブはどうすればいいでしょうか?

cls onkey gosub *a mes "testです" stop *a onkey *b if wparam = 13 { cls mes "test1です" } *b onkey *c if wparam = 13 { cls mes "test2です" } *c onkey *d if wparam = 13 { cls mes "test3です" } *d if wparam = 13 { cls mes "test4です" }
こんな感じに書いてます(見づらくてすいません&セーブボタンなどは省いています)
例えば*bでセーブボタンを押してセーブし、*dまで行ってロードボタンを押したら、
セーブした*bまで戻るようにできませんか?



この記事に返信する


あり

リンク

2011/12/23(Fri) 12:06:07|NO.43893

『ラベル型配列変数』を使うとラベルを数値で管理できます。
プログラミングマニュアルのラベルの項にサンプルもあるので試してみて下さい。



あり

リンク

2011/12/24(Sat) 01:28:30|NO.43904

大雑把ですがラベル型配列変数を使うならこんな感じで実現可能です。

; 記述の簡略化用マクロ #define __clear color 255 , 255 , 255 : boxf : color 0 , 0 , 0 #define __status title "現在のシーンNO=" + scene + " SAVEしたシーンNO=" + savescene ; 変数初期化 lbl = *s_00 , *s_01 , *s_02 , *s_03 , *s_04 ; ラベルを配列に代入 scene = 0 ; 現在のシーンNO nextscene = 0 ; 次に進むシーンNO savescene = 0 ; セーブしたシーンNO cls onkey gosub *key_in button gosub "SAVE" , *save ; セーブボタン button gosub "LOAD" , *load ; ロードボタン *s_00 ; タイトル画面等の処理 gosub *s_01 __status ; ステータス表示マクロ stop ; 操作処理 *key_in ; 入力処理 if wparam = 13 { ; Enterで進む gosub lbl(nextscene) ; 次のシーンへ進む } __status return *save ; セーブ処理(今回は変数に保存するだけ) savescene = scene ; 現在のシーンNOを保存する __status return *load ; ロード処理 scene = savescene ; 保存したシーンNOを現在のシーンNOにする __status gosub lbl(scene) ; 指定したシーンへ進む return ; シナリオ処理 *s_01 __clear ; 画面クリアマクロ pos 0 , 48 mes "test1です" scene = 1 ; 現在のシーンNO nextscene = 2 ; 次のシーンNO return *s_02 __clear pos 0 , 48 mes "test2です" scene = 2 nextscene = 3 return *s_03 __clear pos 0 , 48 mes "test3です" scene = 3 nextscene = 4 return *s_04 __clear pos 0 , 48 mes "test4です" mes "最初に戻ります" scene = 4 nextscene = 1 ; 最初のシーンに戻る return
ただ、ノベルゲームのシナリオを各種処理と一緒にスクリプト内に記述する方式は
効率が悪いので規模が大きくなるようならシナリオを処理部分から独立させたシステムに
した方が良いとは思います。



fate

リンク

2011/12/24(Sat) 10:06:29|NO.43906

すいません。
セーブするというのは、別のファイルを作成し、
今度からそのファイルに上書きするような感じにしたいんですが



あり

リンク

2011/12/24(Sat) 11:51:46|NO.43908

先のサンプルでラベルを変数で管理する事ができているので
あとはbsave・bloadやnotesave・noteload等を使って変数を
保存・読み込みするようにすればいいだけです。
(arraysave・arrayloadという命令もあります)

その際existを使えば指定したファイルが存在しているかを調べる事が
できるので、セーブファイルが既にある場合上書きするか確認する事が出来ます。

以下はbsave・bloadを使った例です。

; 記述の簡略化用マクロ #define __clear color 255 , 255 , 255 : boxf : color 0 , 0 , 0 #define __status title "現在のシーンNO=" + scene + " SAVEしたシーンNO=" + savescene ; 変数初期化 lbl = *s_00 , *s_01 , *s_02 , *s_03 , *s_04 ; ラベルを配列に代入 scene = 0 ; 現在のシーンNO nextscene = 0 ; 次に進むシーンNO savescene = 0 ; セーブしたシーンNO cls onkey gosub *key_in button gosub "SAVE" , *save ; セーブボタン button gosub "LOAD" , *load ; ロードボタン *s_00 ; タイトル画面等の処理 gosub *s_01 __status ; ステータス表示マクロ stop ; 操作処理 *key_in ; 入力処理 if wparam = 13 { ; Enterで進む gosub lbl(nextscene) ; 次のシーンへ進む } __status return *save ; セーブ処理(ファイルを作成して保存) exist "savedata.dat" ; セーブファイルがあるか確認 if strsize = -1 { ; セーブファイルが存在していない場合の処理 dialog "セーブデータを作成します" } else { dialog "セーブデータを上書きしますか?" , 3 if stat = 7 : return ; いいえが押されたらキャンセル } savescene = scene ; 現在のシーンNOを保存する bsave "savedata.dat" , savescene __status return *load ; ロード処理 exist "savedata.dat" ; セーブファイルがあるか確認 if strsize = -1 { ; セーブファイルがなければ処理をキャンセル dialog "セーブデータがありません" return } bload "savedata.dat" , savescene scene = savescene ; 保存したシーンNOを現在のシーンNOにする __status gosub lbl(scene) ; 指定したシーンへ進む return ; シナリオ処理 *s_01 __clear ; 画面クリアマクロ pos 0 , 48 mes "test1です" scene = 1 ; 現在のシーンNO nextscene = 2 ; 次のシーンNO return *s_02 __clear pos 0 , 48 mes "test2です" scene = 2 nextscene = 3 return *s_03 __clear pos 0 , 48 mes "test3です" scene = 3 nextscene = 4 return *s_04 __clear pos 0 , 48 mes "test4です" mes "最初に戻ります" scene = 4 nextscene = 1 ; 最初のシーンに戻る return



fate

リンク

2011/12/25(Sun) 10:43:46|NO.43914

ありがとうございました。
理解するのに時間がかかり返信が遅れてしまいました。
すいません。



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