スクリプトを作れるようになろう-03

投稿者:Material 7186 1 mini ikosami 投稿日:2012/03/23 18:21

どうも。ikosamiです。

前回を見ていない人は、↓を先に見てください。
http://blog.rmake.jp/ikosami/1666


④マップを表示する

ゲームをやってみればわかると思いますが、
まったく何も見えない状態で、手がかりなしに進むのは、
難易度が高すぎます。

ですので、マップを表示してみましょう。


マップを表示する方法は色々ありますが、
画像を使うと、色々とスプライトをよく知らない人には
一気に難しくなってしまうので、

とりあえず、画面テキスト表示でやってみます。
createText()関数


マップは、
行ったことのある場所は地形を表示
行ったことのない場所は?と表示させるように作ってみましょう。


まずは、行ったことがあるかどうかの初期設定です。

初期設定ですが、ステージを進むたびに、新しくなるので、
「設定」チャプターの最後の所に追加していきましょう。

すべてのマスを設定する必要がありますが、
ステージに何マスあるかを取得するのは簡単ではないので、
とりあえず、20×20ぐらいで設定しておきましょう。


m = createArray()
i = 0
while i < 13
  m[i] = createArray()
  i2 = 0
  while i2 < 20
    m[i][i2] = -1
    i2 = i2 + 1
  end
  i = i + 1
end



このwhile文を入れ子状に使う設定の方法は、結構よく使います。
入れ子状に使う設定が始めてRmakeで出てきたのが、
http://rmake.jp/boards/2/topics/256
らしいです。


では、次に画面テキストの設定です。

20×20の文字をそのままの大きさで表示すると
画面をはみ出してしまうので、
少し文字のサイズを小さくしましょう。

画面テキストは、
画面テキスト生成{createText()}の時の文字サイズがそのまま維持されるので

deleteTextAll()
setTextFontSize(20)
t = createText(150, 0, 700, 600)
setTextFontSize(28)

(deleteTextAll()は、テキスト全消しで、
2度目呼び出す時に画面テキストが2重になることを防止するためにとりあえず使います。)

こうすれば、画面テキストのみ文字サイズが小さくなり、
その後の他の文字は小さくなりません。
(初期のテキストサイズは、28です。)

そして、20×15の?(行ったことない場所の表示)を表示しましょう。
(縦をあまり大きくすると、メッセージウィンドウに進出して、メッセージが読みづらくなります。)

te = ""

i = 0
while i < 13
  i2 = 0
  while i2 < 20
       te = te + "?"
    i2 = i2 + 1
  end
te = te + "\n"# 1行終わったら改行
  i = i + 1
end

setText(t, te)

さっきのmの設定と似ていますね。


あとは
setVariable("m", m)
setVariable("t", t)

で、しっかり保存(?)しておきましょう。


では、「メイン」チャプターのほうに、
マップの機能を追加しましょう。

場所は、

s = getVariable("s")
x = getVariable("x")
y = getVariable("y")
# 「Ⅰ」 「ここにさっき保存したmとtの変数の読み込みを追加」

#///////////////////中略/////////////////////////////
  else
    s[y+yi][x+xi] == 1
    speak("その方向には壁があり、進めません。")
  end

# 「Ⅱ」 「ここに機能の追加を。」
#///////////////////中略/////////////////////////////
end#(ループのend)


まずⅠの場所に
m = getVariable("m")
t = getVariable("t")
を追加しましょう。


次にⅡの場所に
「行ったマスの情報を保存する」
「保存された情報を読み取ってマップを表示する」
という、2つの機能を追加します。

まずは、「行ったマスの情報を保存する」

m[y][x] = s[y][x]

これで、自分のいるマスの情報を地図の変数に保存することができます。

しかし、これでは壁の情報がまったく保存できません。(壁の中には入れないので。)

なので、進む時のスクリプトに、少し追加をしましょう。
S = true
  if s[y+yi][x+xi] == 0
    speak("進みました。\n",x+xi,"-",y+yi)
    x = x + xi;y = y + yi
    S = false
  elsif s[y+yi][x+xi] == 2
    speak("ゴールです。")
    speak("次のステージへ進みます。")
    setVariable("ST", getVariable("ST")+1)
    changeChapter("設定")
  else
    s[y+yi][x+xi] == 1
    speak("その方向には壁があり、進めません。")
  end

これで、進んだ場合は変数Sがfalse、
進んでいない場合は変数Sがtrueとなります。
(変数は、大文字か小文字かを区別するので、Sとsは別の変数です。)

ついでに進んだ時に今居るマスを表示するようにしておきました。

if S
 m[y+yi][x+xi] = s[y+yi][x+xi]
else
 m[y][x] = s[y][x]
end

こうしておけば完璧です。


ちなみに、最初からsの変数の情報をすべてmの変数に写し取った場合、
最初からマップが表示されている状態になります。


次に「保存された情報を読み取ってマップを表示する」
これはちょっとややこしいです。
まず画面テキストで表示するので、
表示するための変数を作ります。

te = ""

そして、
te = ""
i = 0
while i < 13
  i2 = 0
  while i2 < 20
#///////ここに処理を入れる////////////
    if m[i][i2] == 0
      te = te + "□"
    elsif m[i][i2] == 1
      te = te + "■"
    else
       te = te + "?"
    end
#/////////////////////////////////////
    i2 = i2 + 1
  end
te = te + "\n"# 1行終わったら改行
  i = i + 1
end

setText(t, te)


こんな感じのさっきと似たようなのを作ります。

これで、地図が表示されるようになりました。。



今回はここまでにします。


「関数」
前回と変化なし。

「初期設定」
前回と変化なし

「設定」
追加内容:地図の初期設定
s = createArray()


if getVariable("ST") == 1
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,2,1")
  s[2] = Array("1,0,0,0,1")
  s[3] = Array("1,0,1,1,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 2
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,1")
  s[2] = Array("1,0,0,0,0,2,1")
  s[3] = Array("1,0,1,1,0,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 3
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,0,1")
  s[2] = Array("1,0,0,0,0,0,1")
  s[3] = Array("1,0,1,1,0,0,1")
  s[4] = Array("1,0,0,0,1,0,1")
  s[5] = Array("1,1,1,1,1,2,1")
  x = 3;y = 4
elsif getVariable("ST") == 4
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,0,1,0,0,1")
  s[2] = Array("1,1,0,0,0,1,1")
  s[3] = Array("1,2,1,1,0,0,1")
  s[4] = Array("1,0,0,0,0,0,1")
  s[5] = Array("1,0,1,0,1,0,1")
  s[5] = Array("1,1,1,1,1,1,1")
  x = 1;y = 1
else
  speak("すべてのステージをクリアしました!\nおめでとうございます!")
  goEnding()
end
speak("ステージ",getVariable("ST"))
setVariable("s", s)
setVariable("x", x)
setVariable("y", y)


m = createArray()
i = 0
while i < 13
  m[i] = createArray()
  i2 = 0
  while i2 < 20
    m[i][i2] = -1
    i2 = i2 + 1
  end
  i = i + 1
end

deleteTextAll()
setTextFontSize(28)
t = createText(150, 00, 700, 600)
setTextFontSize(28)

te = ""

i = 0
while i < 13
  i2 = 0
  while i2 < 20
       te = te + "?"
    i2 = i2 + 1
  end
te = te + "\n"# 1行終わったら改行
  i = i + 1
end

setText(t, te)

setVariable("m", m)
setVariable("t", t)



「メイン」
追加内容:地図保存&表示
s = getVariable("s")
x = getVariable("x")
y = getVariable("y")

m = getVariable("m")
t = getVariable("t")

loop = true
while loop
  case speakWithSelect(4,"↑","→","←","↓", 
      "どちらに進みますか?")
    when 0
      xi =  0;yi = -1
    when 1
      xi =  1;yi =  0
    when 2
      xi = -1;yi =  0
    when 3
      xi =  0;yi =  1
  end

S = true
  if s[y+yi][x+xi] == 0
    speak("進みました。\n",x+xi,"-",y+yi)
    x = x + xi;y = y + yi
    S = false
  elsif s[y+yi][x+xi] == 2
    speak("ゴールです。")
    speak("次のステージへ進みます。")
    setVariable("ST", getVariable("ST")+1)
    changeChapter("設定")
  else
    s[y+yi][x+xi] == 1
    speak("その方向には壁があり、進めません。")
  end

if S
 m[y+yi][x+xi] = s[y+yi][x+xi]
else
 m[y][x] = s[y][x]
end

te = ""
i = 0
while i < 13
  i2 = 0
  while i2 < 20
#///////ここに処理を入れる////////////
    if m[i][i2] == 0
      te = te + "□"
    elsif m[i][i2] == 1
      te = te + "■"
    else
       te = te + "?"
    end
#/////////////////////////////////////
    i2 = i2 + 1
  end
te = te + "\n"# 1行終わったら改行
  i = i + 1
end

setText(t, te)

end


ちょっといきなり地図作成は難易度が高かったかもしれません・・・


暗闇迷路 - 【迷路ゲーム】

わからない部分が、少しでもあったらどんどんコメントしてください。


次回は、今回よりもはるかに簡単です。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Images 3    mini sekirin(投稿日:2012/04/06 09:31, 履歴)
少しお久しぶりです。
難しかったけれどなんとか理解しました^^
04はまだ上げないのですか?
Material 7186 1 mini ikosami(投稿日:2012/04/06 21:44, 履歴)
理解してもらえて良かったです(^^)

最近、色々と忙しかったので、何もできませんでしたが、
明日と明後日は予定が少ないので
土日中に次の講座は書けると思います。
Material 7186 1 mini ikosami(投稿日:2012/04/10 22:54, 履歴)
すみません・・・

忙しくて、やっぱりまだ書けそうにありません・・・
Images 3    mini sekirin(投稿日:2012/04/11 18:09, 履歴)
それは残念です;;
落ち着いたら書いてくださいね!
  1 mini 闇さん(投稿日:2012/04/10 23:02, 履歴)
お久しぶりです
ほぼ毎日ブログ更新していたのに
突然コメントも無くなったので心配でした
Material 7186 1 mini ikosami(投稿日:2012/04/10 23:04, 履歴)
大学関係で忙しいので、
しばらくこの状態が続くと思います・・・

まぁ、忙しいと言っても、ただ慣れてなくて
疲れて帰ったらすぐ寝てしまっているだけなんですけど(--;)
User icon mini 退会したユーザー(投稿日:2012/04/06 21:53, 履歴)
case文でもelse使えますよ。
if getVariable("ST") == 1
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,2,1")
  s[2] = Array("1,0,0,0,1")
  s[3] = Array("1,0,1,1,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 2
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,1")
  s[2] = Array("1,0,0,0,0,2,1")
  s[3] = Array("1,0,1,1,0,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 3
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,0,1")
  s[2] = Array("1,0,0,0,0,0,1")
  s[3] = Array("1,0,1,1,0,0,1")
  s[4] = Array("1,0,0,0,1,0,1")
  s[5] = Array("1,1,1,1,1,2,1")
  x = 3;y = 4
elsif getVariable("ST") == 4
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,0,1,0,0,1")
  s[2] = Array("1,1,0,0,0,1,1")
  s[3] = Array("1,2,1,1,0,0,1")
  s[4] = Array("1,0,0,0,0,0,1")
  s[5] = Array("1,0,1,0,1,0,1")
  s[5] = Array("1,1,1,1,1,1,1")
  x = 1;y = 1
else
  speak("すべてのステージをクリアしました!\nおめでとうございます!")
  goEnding()
end

#↑↑↑↑↑↑これらは同一↓↓↓↓↓↓

case getVariable("ST")

  when 1
    s[0] = Array("1,1,1,1,1")
    s[1] = Array("1,0,1,2,1")
    s[2] = Array("1,0,0,0,1")
    s[3] = Array("1,0,1,1,1")
    s[4] = Array("1,1,1,1,1")
    x = 1;y = 1

  when 2
    s[0] = Array("1,1,1,1,1")
    s[1] = Array("1,0,1,1,0,1")
    s[2] = Array("1,0,0,0,0,2,1")
    s[3] = Array("1,0,1,1,0,1")
    s[4] = Array("1,1,1,1,1")
    x = 1;y = 1

  when 3
    s[0] = Array("1,1,1,1,1,1,1")
    s[1] = Array("1,0,1,1,0,0,1")
    s[2] = Array("1,0,0,0,0,0,1")
    s[3] = Array("1,0,1,1,0,0,1")
    s[4] = Array("1,0,0,0,1,0,1")
    s[5] = Array("1,1,1,1,1,2,1")
    x = 3;y = 4

  when 4
    s[0] = Array("1,1,1,1,1,1,1")
    s[1] = Array("1,0,0,1,0,0,1")
    s[2] = Array("1,1,0,0,0,1,1")
    s[3] = Array("1,2,1,1,0,0,1")
    s[4] = Array("1,0,0,0,0,0,1")
    s[5] = Array("1,0,1,0,1,0,1")
    s[5] = Array("1,1,1,1,1,1,1")
    x = 1;y = 1

  else
    speak("すべてのステージをクリアしました!\nおめでとうございます!")
    goEnding()
end
Material 7186 1 mini ikosami(投稿日:2012/04/07 14:30, 履歴)
まぁ、わかりやすさ重視なので(^^;)