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

投稿者:Material 7186 1 mini ikosami 投稿日:2012/04/22 15:34

どうも。ikosamiです。

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

⑤戦闘を追加する
階層を進むごとに、戦闘があるようにしてみましょう。

戦闘は、思うほど難しいものではありません。

まず、「メインチャプター」の
    speak("ゴールです。")
    speak("次のステージへ進みます。")
    setVariable("ST", getVariable("ST")+1)
    changeChapter("設定")


setText(t, "")
    setVariable("ST", getVariable("ST")+1)
    changeChapter("戦闘")

にして、「メインチャプター」の下に、
「戦闘」のチャプターを作りましょう。

「主人公」の部分は、好きな名前を入れてください。
台詞も、ご自由に。


では、戦闘スクリプトを作ってみましょう。

戦闘スクリプトには、最低でも、
最大HP,HP,攻撃力,防御力を
自分と敵の分が必要です。

敵の分の最大HPは回復技を作らない限り必要ないですが、
まぁ一応作っておきましょう。

まず、自分のステータスです。
これは、初期設定で設定します。

setVariable("MHP", 100)
setVariable("HP", 100)
setVariable("AT", 20)
setVariable("DT", 10)
setVariable("K", 10)


数字の大きさはお好みで。
ちなみに、一番下のKは戦闘中回復できる回数です。
今回は傷薬の数ってことにしておきましょう。


次に、敵ステータスです。

これは、「設定チャプター」で設定します。
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
  setVariable("tMHP", 30)
  setVariable("tHP", 30)
  setVariable("tAT", 10)
  setVariable("tDT", 8)



敵ステータスもお好みでいいのですが、
主人公ステータスとのバランスを考えてください。
絶対勝てないと、ゲームになりませんし、
弱すぎてもつまらないですし、
倒すのに時間がかかりすぎても嫌になります。

戦闘は、一度しかないわけではないので、
だんだん強くするようにしましょう。

敵は、とりあえず、すべての階に設定してください。
(最下層以外は、いなくても問題はないですけど・・・)

あと、ついでに、台詞も入れときましょう。

とは言っても、そのまま書くわけにはいきません。

なので、defを使って
後で呼び出せるようにしておきましょう。

def spe1()
 speak("主人公\n「階段を見つけた!」")
 setVariable("T",showImagePosition(200, 100, 64270))
 setVariable("tn","トカゲ")
 speak("主人公\n「ん? なんだこいつ・・・」")
 speak("トカゲ\n「・・・うきゃー!」")
 speak("主人公\n「うわっ!」")
end
def spe2()
 speak("トカゲ\n「・・・うきゅー・・・」")
 hideImagePosition(getVariable("T"))
 speak("主人公\n「トカゲは『うきゃー』とも『うきゅー』とも言わないだろ・・・」")
 speak("主人公\n「まぁいいや。先へ進もう」")
end

と言う感じで。

これをすべての階層に追加しましょう。



defはユーザー定義関数を作るときに使うもので

def [新しく作る関数名](引数)

と、書きます。

例えば、
def spe(a)
 speak("台詞\n「",a、"」")
end
spe("こんにちは")

と書けば、

台詞
「こんにちは」

と、表示されます。

参考:「スクリプト言語のマニュアル」




それと、
setVariable("T",showImagePosition(200, 100, 64270))
が画像表示
setVariable("tn","トカゲ")
が敵の名前です。
戦闘中の「○○の攻撃!」という文章などに使います。

ちなみに、今回の例で使用した画像は、↓です。
http://rmake.jp/published_items/25361

では、準備が終わったので、早速戦闘スクリプトを作ってみましょう。


メインスクリプトと同じく、
loop = true
while loop

end

から作っていきます。

戦闘のあるゲームを思い出してみてください。


「○○が現れた!」

「どうする?」(選択肢)
「主人公の攻撃!」
「▽△のダメージを与えた!」
「○○の攻撃!」
「□■のダメージを受けた!」
[※に戻る]


ってな感じですよね。
これを、そのまま当てはめてみます。
(上のほうのは、毎度おなじみの読み込みです。
 おなじみでない人は1から順番に読みましょう)

spe1()

mhp =  getVariable("MHP")
hp =  getVariable("HP")
at =  getVariable("AT")
dt =  getVariable("DT")

tn = getVariable("tn")
tmhp =  getVariable("tMHP")
thp =  getVariable("tHP")
tat =  getVariable("tAT")
tdt =  getVariable("tDT")

speak(tn,"○○が現れた!")

loop = true
while loop
case speakWithSelect(3,"攻撃","回復","逃げる", 
    "どうする?")
  when 0
     speak("主人公の攻撃")
     speak(tn,"に13のダメージを与えた!")
  when 1
     speak("主人公のは傷薬を使った")
     speak("体力を25回復した!")
  when 2
     speak("主人公は逃げ出した!")
     speak("しかし、何も起こらなかった!")
end
 speak(tn,"の攻撃!")
 speak("主人公は10のダメージを受けた!")
end

ほぼ、そのまま書くと
体力が減ったとか回復したとか、文字で表示しているだけで
無駄な文章の繰り返しになります。

体力などの変数を実際にちゃんと使ってみましょう。
ついでにいろいろな場合の判定も。

#//////前略////////

loop = true
while loop
case speakWithSelect(3,"攻撃","回復","逃げる", 
    "どうする?\nHP:",hp,"/",mhp,"\n傷薬:",getVariable("K"),"個")
  when 0
     speak("主人公の攻撃")
     ko = at - tdt - rand(floor(at/6)) # 一定にならないように
     if ko < 0
          speak(tn,"は、笑っている!")
     else
      thp = thp - ko
      speak(tn,"に",ko,"のダメージを与えた!")
      if thp <= 0
        speak(tn,"を倒した!")
        spe2() #さっき設定したやつ
        changeChapter("設定")
      end
     end
  when 1
    if getVariable("K") > 0 
     speak("主人公のは傷薬を使った")
     if hp < mhp
       hp = hp + 25
       setVariable("K",getVariable("K")-1)
       if hp > mhp
         hp = mhp
       end
     else
          speak("しかし傷が見当たらなかった!")
     end
    else
      speak("傷薬はもうない!")
    end
  when 2
     speak("主人公は逃げ出した!")
     speak("しかし、何も変わらなかった!")
end

 speak(tn,"の攻撃!")
ko = tat - dt - rand(floor(tat/6)) # 一定にならないように
if ko <= 0
          speak("主人公は、微動だにしない!")
     else
      hp = hp - ko
      speak("主人公は",ko,"のダメージを受けた!")
      if hp <= 0
        speak("主人公\n「負けた・・・」")
        speak(tn,"「ゲームオーバー」")
        speak("主人公\n「しゃべった!?」")
        goBadEnding()
      end
end

end


これで、戦闘が追加されました。

⑥オープニングを作る

オープニングのないゲームだと、何をすれば良いのかがよくわかりません。
なので、ゲームにオープニングを加えてみましょう。


まず、「初期設定チャプター」と「設定チャプター」の間に、
「オープニング」と言う名前のチャプターを追加します。

ここにまず、オープニングを入れてみましょう。

迷路なので、それに見合ったオープニングを作りましょう。

主人公「う~む・・・ これが家宝の宝刀か・・・」
  #盗賊画像表示
主人公「ん? あんな誰?」
主人公「わっ! なにするんだ!」
盗賊「この宝刀は、もらって行くぞ!」
主人公「まて~!」
  #洞窟の背景表示
主人公「この洞窟に逃げ込んだみたいだ。追いかけよう!」
  #背景画像消去
主人公「うわっ! まっくらだ!一度もどって、
    明かりになるものを取りに行こう。」
主人公「ん? こんなところにカンテラが・・・」
  #薄暗い洞窟背景表示
主人公「大して変わらないな・・・ まぁいいや。このまま進もう」

みたいな感じなら、
「なにをすればいいのか?」
がはっきりします。



⑦エンディング(or後日談)を作る
設定チャプターの

#####<<<前略>>>#####

if getVariable("ST") == 1
#####<<<中略>>>#####
elsif getVariable("ST") == 2
#####<<<中略>>>#####
def spe1()
#####<<<中略>>>#####
elsif getVariable("ST") == 3
#####<<<中略>>>#####
elsif getVariable("ST") == 4
#####<<<中略>>>#####
else
  speak("すべてのステージをクリアしました!\nおめでとうございます!")
  goEnding()
end

#####<<<後略>>>#####

の、
 
  speak("すべてのステージをクリアしました!\nおめでとうございます!")
  goEnding()


の部分を、

 
  changeChapter("エンディング")

に変えます。

そして、戦闘チャプターの下に、
エンディングチャプターを作ります。


そこにエンディング、もしくは後日談を書いていきましょう。

主人公「やっと見つけたぞ!」
盗賊「くっ・・・あいつらをこうもあっさり倒すなんて・・・
   なんて強さだ・・・」
主人公「宝刀を返せ!」
盗賊「わかったわかった。返すから勘弁してくれ」
宝刀を取り返した!
盗賊「というか、俺の懐中電灯の電池が切れたんだが、
   お前のそのカンテラで、出口まで連れてってくれないか?」
主人公「しかたないな・・・・・・」

主人公「やっと出られた~・・・」
盗賊「じゃぁ、逃げさせてもらうよ」
主人公「えっ!?」
主人公「・・・・・・」

goEnding()


など、御自由に。




今回の解説の内容で作るゲームは、
どちらかというと、文章力が必要になるものなので、
僕の書いたゲームのストーリーの内容は、
ほとんど気にしなくても結構です。

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


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

次回は、キーボード入力を取り入れて、
操作性をよくしてみたいと思います。

コメントする

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

コメント一覧

Images 3    mini sekirin(投稿日:2012/04/23 20:03, 履歴)
ノベルでも簡単に戦闘を作れるんですね!
分かりやすかったです^^
Material 7186 1 mini ikosami(投稿日:2012/04/23 21:07, 履歴)
ありがとうございます(^^)
Material 7186 1 mini ikosami(投稿日:2012/04/22 15:35, 履歴)
やっと、今回の分を書き終えました・・・

3日ぐらいかけて書いているので、
どこかに矛盾が生じている可能性もありますので、
おかしい場所があったら、指摘してください。
002 1  mini ugonight(投稿日:2012/04/22 16:25, 履歴)
お疲れ様です~
Material 7186 1 mini ikosami(投稿日:2012/04/23 21:06, 履歴)
次回は今週中になんとか書き終えたいです(^^)