スクリプトを作れるようになろう-03
投稿者: ikosami 投稿日:2012/03/23 18:21
どうも。ikosamiです。
前回を見ていない人は、↓を先に見てください。
http://blog.rmake.jp/ikosami/1666
④マップを表示する
ゲームをやってみればわかると思いますが、
まったく何も見えない状態で、手がかりなしに進むのは、
難易度が高すぎます。
ですので、マップを表示してみましょう。
マップを表示する方法は色々ありますが、
画像を使うと、色々とスプライトをよく知らない人には
一気に難しくなってしまうので、
とりあえず、画面テキスト表示でやってみます。
createText()関数
マップは、
行ったことのある場所は地形を表示
行ったことのない場所は?と表示させるように作ってみましょう。
まずは、行ったことがあるかどうかの初期設定です。
初期設定ですが、ステージを進むたびに、新しくなるので、
「設定」チャプターの最後の所に追加していきましょう。
すべてのマスを設定する必要がありますが、
ステージに何マスあるかを取得するのは簡単ではないので、
とりあえず、20×20ぐらいで設定しておきましょう。
このwhile文を入れ子状に使う設定の方法は、結構よく使います。
入れ子状に使う設定が始めてRmakeで出てきたのが、
http://rmake.jp/boards/2/topics/256
らしいです。
では、次に画面テキストの設定です。
20×20の文字をそのままの大きさで表示すると
画面をはみ出してしまうので、
少し文字のサイズを小さくしましょう。
画面テキストは、
画面テキスト生成{createText()}の時の文字サイズがそのまま維持されるので
(deleteTextAll()は、テキスト全消しで、
2度目呼び出す時に画面テキストが2重になることを防止するためにとりあえず使います。)
こうすれば、画面テキストのみ文字サイズが小さくなり、
その後の他の文字は小さくなりません。
(初期のテキストサイズは、28です。)
そして、20×15の?(行ったことない場所の表示)を表示しましょう。
(縦をあまり大きくすると、メッセージウィンドウに進出して、メッセージが読みづらくなります。)
さっきのmの設定と似ていますね。
あとは
で、しっかり保存(?)しておきましょう。
では、「メイン」チャプターのほうに、
マップの機能を追加しましょう。
場所は、
まずⅠの場所に
m = getVariable("m")
t = getVariable("t")
を追加しましょう。
次にⅡの場所に
「行ったマスの情報を保存する」
「保存された情報を読み取ってマップを表示する」
という、2つの機能を追加します。
まずは、「行ったマスの情報を保存する」
これで、自分のいるマスの情報を地図の変数に保存することができます。
しかし、これでは壁の情報がまったく保存できません。(壁の中には入れないので。)
なので、進む時のスクリプトに、少し追加をしましょう。
これで、進んだ場合は変数Sがfalse、
進んでいない場合は変数Sがtrueとなります。
(変数は、大文字か小文字かを区別するので、Sとsは別の変数です。)
ついでに進んだ時に今居るマスを表示するようにしておきました。
こうしておけば完璧です。
ちなみに、最初からsの変数の情報をすべてmの変数に写し取った場合、
最初からマップが表示されている状態になります。
次に「保存された情報を読み取ってマップを表示する」
これはちょっとややこしいです。
まず画面テキストで表示するので、
表示するための変数を作ります。
te = ""
そして、
こんな感じのさっきと似たようなのを作ります。
これで、地図が表示されるようになりました。。
今回はここまでにします。
「関数」
前回と変化なし。
「初期設定」
前回と変化なし
「設定」
追加内容:地図の初期設定
「メイン」
追加内容:地図保存&表示
ちょっといきなり地図作成は難易度が高かったかもしれません・・・
暗闇迷路 - 【迷路ゲーム】
わからない部分が、少しでもあったらどんどんコメントしてください。
次回は、今回よりもはるかに簡単です。
ツイート
前回を見ていない人は、↓を先に見てください。
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
ちょっといきなり地図作成は難易度が高かったかもしれません・・・
暗闇迷路 - 【迷路ゲーム】
わからない部分が、少しでもあったらどんどんコメントしてください。
次回は、今回よりもはるかに簡単です。
コメントする
コメントするには、ログインする必要があります。
コメント一覧
退会したユーザー(投稿日: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
難しかったけれどなんとか理解しました^^
04はまだ上げないのですか?
最近、色々と忙しかったので、何もできませんでしたが、
明日と明後日は予定が少ないので
土日中に次の講座は書けると思います。
忙しくて、やっぱりまだ書けそうにありません・・・
落ち着いたら書いてくださいね!