×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

ゲームを作ろう! 脱出ゲームその3 データのセーブとロード


ゲームにはつきものの、進行度合いをセーブ&ロードする機能。
ノベルゲームなら、終了した時のページ数さえ記録しておけば、再開もそんなに難しくなさそうです。
やってみましょう。
とはいえ、セーブ&ロード機能の為に付け足したり書き換えたりしなければならない部分もあります。

まず、セーブとロードの方法自体について。
Small Basicには、Fileオブジェクトというものがあります。
外部のファイルを読み込んだり、書き込んだりできるオブジェクトです。
セーブとロードに使えそうなのは……

セーブ……
File.WriteContents(FilePath, contents)
ファイルを開いて、指定された内容をそのファイルに書き込みます。

ロード……
File.ReadLine(FilePath, lineNumber)
指定されたファイルを開いて、指定された行番号まで読み込みます。

まずはセーブデータ用にテキストファイル「save.txt」を作っておきましょう。
もちろん、中身は空です。ファイルを作っただけです。
以降は、このテキストファイルをDドライブに置いたという設定で書いています。
つまり、ファイルのフルパスが「D:\save.txt」です。

セーブ……
File.WriteContents("D:\save.txt", 終了した時のページ数)

ロード……
File.ReadLine("D:\save.txt", 1)

こんな感じになりそうです。前回、ページ数は「page」という変数に決めたので、具体的には

セーブ……
File.WriteContents("D:\save.txt", page)

こうですね。

今回はセーブは自動にしておきます。
つまり、ページを読み込んだ瞬間にページ数を自動的にD:\save.txtに書き込むようにします。
そしてロード時も、自動セーブでセーブしたデータのみをロードできるようにします。
もちろん、セーブするタイミングは別途決めることができますし、セーブできるデータ数はいくらでも増やせますが、今回は簡単にということで。

流れとしては……

表紙に、
「最初から始める場合はSpaceキーを押してください。
 Lキーを押すとデータのロード画面に移動します。」
と表示するようにする

GraphicsWindow.KeyDown = LoadKey

page=1

Sub LoadKey *データのロード画面
  If GraphicsWindow.LastKey = "L" Then
 「データをロードしますか?
  ロードする時はYキーを押してください。
  最初から始める場合は、スペースキーを2回押してください。」
  EndIf
  If GraphicsWindow.LastKey = "Y" Then
  page = File.ReadLine("D:\save.txt", 1)
  「データをロードしました。スペースキーを押してください。」
    Shapes.Move(load4, 100, 200)
    If page = 1 Then
      GraphicsWindow.KeyDown = StartKey1 →page=1とStartKey1で、1ページ目に飛ぶ
    EndIf
    If page = 2 Then
      GraphicsWindow.KeyDown = StartKey2 →page=2とStartKey2で、2ページ目に飛ぶ
    EndIf
    If page = 3 Then
      GraphicsWindow.KeyDown = StartKey3 →page=3とStartKey3で、3ページ目に飛ぶ
    EndIf
  EndIf
  If GraphicsWindow.LastKey = "Space" Then
    GraphicsWindow.KeyDown = StartKey1 →page=1とStartKey1で、1ページ目に飛ぶ
  EndIf
EndSub

Sub StartKey1 *1ページ目
  If GraphicsWindow.LastKey = "Space" And page = 1 Then
    File.WriteContents("D:\save.txt", page) *ページ数を強制セーブ
    (1ページ目内容表示)
    GraphicsWindow.KeyDown = StartKey2
  EndIf
EndSub

Sub StartKey2 *2ページ目
  If GraphicsWindow.LastKey = "Space" And page = 2 Then
    File.WriteContents("D:\save.txt", page) *ページ数を強制セーブ
    (2ページ目内容表示)
    GraphicsWindow.KeyDown = StartKey3
  EndIf
EndSub

Sub StartKey3 *3ページ目
  If GraphicsWindow.LastKey = "Space" And page = 3 Then
    File.WriteContents("D:\save.txt", page) *ページ数を強制セーブ
    (3ページ目内容表示)
    GraphicsWindow.KeyDown = StartKey4
  EndIf
EndSub

……

これは、3ページ目までのプログラムの流れです。
ページ数が増えたら、サブルーチン「LoadKey」内の記述なんかを増やしていけば良いだけです。

なお、D:\save.txt内は上の通り、ただ数字が記載されていくだけですね。
セーブファイルの中身を見ると、プレイヤーにページ数がモロバレですね。w
本当のゲームだったら、こうならないように、暗号化したり復号化したりするのでしょうが……。
セーブする時に、2行目にはセーブした年月日・時間も記述して、ロード時にそれを表示するなど、工夫できる点はいくらでもあるはずです。
色々といじってみてください。

以下、私のひどい例。3ページ目の内容を放棄しました。

GraphicsWindow.Width = 800
GraphicsWindow.Height = 600
GraphicsWindow.Title = "novel"

windowX = 15
windowY = 15

backsky = Shapes.AddImage("D:\sora.jpg")

GraphicsWindow.BrushColor = "WhiteSmoke"
GraphicsWindow.PenColor = "DimGray"

window = Shapes.AddRectangle(GraphicsWindow.Width - windowX * 2, GraphicsWindow.Height - windowY * 2 )
Shapes.SetOpacity(window, 70)
Shapes.Move(window, windowX, windowY)

GraphicsWindow.PenColor = "Black"
GraphicsWindow.BrushColor = "Black"
sikaku1 = Shapes.AddRectangle(30, 30)
sikaku2 = Shapes.AddRectangle(30, 30)
sikaku3 = Shapes.AddRectangle(30, 30)
sikaku4 = Shapes.AddRectangle(30, 30)
Shapes.Move(sikaku2, 0, GraphicsWindow.Height - 30)
Shapes.Move(sikaku3, GraphicsWindow.Width - 30, 0)
Shapes.Move(sikaku4, GraphicsWindow.Width - 30, GraphicsWindow.Height - 30)

GraphicsWindow.FontName = "Rounded M+ 1p medium"

'表紙
GraphicsWindow.FontSize = 60
hyousi = Shapes.AddText("なんか小説")
GraphicsWindow.FontSize = 24
hyousi2 = Shapes.AddText("最初から始める場合はSpaceキーを押してください。")
hyousi3 = Shapes.AddText("Lキーを押すとデータのロード画面に移動します。")

Shapes.Move(hyousi, 250, 100)
Shapes.Move(hyousi2, 100, 200)
Shapes.Move(hyousi3, 100, 250)
page = 1

'本文
text[1][1] = "「キミ、名前は?」"
text[1][2] = "ぼくは彼女に尋ねた。"
text[1][3] = "「わたし? わたしの名前は、マオーコ」"
text[1][4] = "「マオーコ? 変わった名前だな……」"
text[1][5] = "「そんなことないわ。なら、あなたの名前は何?」"
text[1][6] = "「ぼくはユーテルヴォガリア・シャフォンレーム。長いからユーシャ"
text[1][7] = "と呼ばれている」"
text[1][8] = "「あなたこそ変な名前じゃない。わたしの名前は由緒正しいのよ。"
text[1][9] = "魔王の血筋に代々受け継がれていて……」"
text[1][10] = "「まさか、魔王の娘だから『魔王・子』なんてダサいネーミング……"
text[1][11] = "えっ、ま、魔王!?」"
text[1][12] = "ぼくは驚いた。"
text[1][13] = "まさか、こんな所に魔王の娘が居るなんて。"

text[2][1] = "「ダサいって何よ、失礼ね! 謝りなさい」"
text[2][2] = "「キミだってぼくの名前を変だと言っただろ。おあいこさ」"
text[2][3] = "魔王の娘という割には、やけにフランクだな。"
text[2][4] = "「それで、一体何の用? ぼくと戦うつもり?」"
text[2][5] = "「フフ、それもいいわね……」"
text[2][6] = "「……!」"
text[2][7] = "ぼくはとっさに、剣の柄を握った。"
text[2][8] = "だが彼女は微動だにせず、笑っている。"
text[2][9] = "「そのナマクラで、わたしと戦おうというの?」"
text[2][10] = "「そっちがそのつもりなら、そうするさ」"
text[2][11] = "「人間って本当に野蛮ね」"
text[2][12] = "「魔族に言われたくない」"

text[3][1] = "仮"
text[3][2] = "仮仮仮仮仮仮仮"
text[3][3] = "仮仮仮仮仮仮仮仮仮仮"
text[3][4] = "仮仮仮仮仮"
text[3][5] = "仮仮仮仮"
text[3][6] = "仮仮仮仮仮仮仮仮"
text[3][7] = "仮"
text[3][8] = "仮仮仮仮仮"
text[3][9] = "仮仮仮仮仮仮仮仮仮仮"
text[3][10] = "仮"
text[3][11] = "仮仮仮仮"
text[3][12] = "仮仮仮仮仮仮仮仮仮仮"

GraphicsWindow.PenColor = "Black"
GraphicsWindow.BrushColor = "Black"

GraphicsWindow.KeyDown = LoadKey

Sub LoadKey
   Shapes.HideShape(hyousi)
   Shapes.HideShape(hyousi2)
   Shapes.HideShape(hyousi3)
   Shapes.HideShape(load4)
    If GraphicsWindow.LastKey = "L" Then
    load1 = Shapes.AddText("データをロードしますか?")
    load2 = Shapes.AddText("ロードする時はYキーを押してください。")
    load3 = Shapes.AddText("最初から始める場合は、スペースキーを2回押してください。")
    Shapes.Move(load1, 100, 200)
    Shapes.Move(load2, 100, 250)
    Shapes.Move(load3, 100, 300)
  EndIf
  If GraphicsWindow.LastKey = "Y" Then
    Shapes.HideShape(load1)
    Shapes.HideShape(load2)
    Shapes.HideShape(load3)
    page = File.ReadLine("D:\save.txt", 1)
    Shapes.AddText(page)
    load4 = Shapes.AddText("データをロードしました。スペースキーを押してください。")
    Shapes.Move(load4, 100, 200)
    If page = 1 Then
      GraphicsWindow.KeyDown = StartKey1
    EndIf
    If page = 2 Then
      GraphicsWindow.KeyDown = StartKey2
    EndIf
    If page = 3 Then
      GraphicsWindow.KeyDown = StartKey3
    EndIf
  EndIf
  If GraphicsWindow.LastKey = "Space" Then
    Shapes.HideShape(load1)
    Shapes.HideShape(load2)
    Shapes.HideShape(load3)
    GraphicsWindow.KeyDown = StartKey1
  EndIf
EndSub

Sub StartKey1
  Shapes.HideShape(load4)
  If GraphicsWindow.LastKey = "Space" And page = 1 Then
    File.WriteContents("D:\save.txt", page)
    page = 0
    For i = 1 To 13
      For n = 1 To Text.GetLength(text[1][i])
        textShapemoji[1][i][n] = Shapes.AddText(Text.GetSubText(text[1][i], n, 1))
        Shapes.Move(textShapemoji[1][i][n], 20 + (24 * (n - 1)), 20 + (35 * (i - 1)))
        Program.Delay(30)
      EndFor
    EndFor
    page = 2
    Timer.Tick = yajirusi
    Timer.Interval = 1000
    GraphicsWindow.KeyDown = StartKey2
  EndIf
EndSub

Sub StartKey2
  Shapes.HideShape(load4)
  If GraphicsWindow.LastKey = "Space" And page = 2 Then
    File.WriteContents("D:\save.txt", page)
    page = 0
    Shapes.HideShape(next)
    Timer.Pause()
    For i = 1 To 13
      For n = 1 To Text.GetLength(text[1][i])
        Shapes.HideShape(textShapemoji[1][i][n])
      EndFor
    EndFor
    For i = 1 To 12
      For n = 1 To Text.GetLength(text[2][i])
        textShapemoji[2][i][n] = Shapes.AddText(Text.GetSubText(text[2][i], n, 1))
        Shapes.Move(textShapemoji[2][i][n], 20 + (24 * (n - 1)), 20 + (35 * (i - 1)))
        Program.Delay(30)
      EndFor
    EndFor
    page = 3
    Timer.Tick = yajirusi
    Timer.Interval = 1000
    GraphicsWindow.KeyDown = StartKey3
  EndIf
EndSub

Sub StartKey3
Shapes.HideShape(load4)
  If GraphicsWindow.LastKey = "Space" And page = 3 Then
    File.WriteContents("D:\save.txt", page)
    page = 0
    Shapes.HideShape(next)
    Timer.Pause()
    For i = 1 To 12
      For n = 1 To Text.GetLength(text[2][i])
        Shapes.HideShape(textShapemoji[2][i][n])
      EndFor
    EndFor
    For i = 1 To 12
      For n = 1 To Text.GetLength(text[3][i])
        textShapemoji[3][i][n] = Shapes.AddText(Text.GetSubText(text[3][i], n, 1))
        Shapes.Move(textShapemoji[3][i][n], 20 + (24 * (n - 1)), 20 + (35 * (i - 1)))
        Program.Delay(30)
      EndFor
    EndFor
    page = 4
    Timer.Tick = yajirusi
    Timer.Interval = 1000
'    GraphicsWindow.KeyDown = StartKey4
  EndIf
EndSub

Sub yajirusi
  Shapes.HideShape(next)
  next = Shapes.AddTriangle(750, 550, 750, 570, 770, 560)
  Shapes.Animate(next, 10, 0, 1000)
EndSub


ちなみに、上の例では、テキストが1文字ずつ表示されている最中のみ、「page = 0」に変数を変えています。
というのは「page = 0」みたいにpageの値を変えておかないと、テキストが1文字ずつ表示されている最中にスペースキーを押した時に、また最初から文字を表示しはじめちゃうのですね。
ということで変更しました。
こうしてデバッグを繰り返し、修正を加えていくのも大切です。


▲TOPへ戻る