みんなの感動をかたちに
旧製品情報

Shade 11



最新バージョン発売のため、本製品の販売は終了しております。ぜひ最新バージョンをご検討ください。

Shade 12 製品情報・予約

でった☆のスクリプト天国 Shadeゲーム化大作戦

最終回 当たるべきか、行くべきか、それが判定だ

(掲載日:10.03.19)

こんにちは、でった☆です。

今回は、前回のダンジョンゲームに「当たり判定」を追加して、きちんとダンジョンを探検できるようにしましょう。

完成版の「Widget(ウィジェット)」はこちらからダウンロードできます。

「dungeon08」フォルダを「widget」フォルダにインストールし、中の「dungeon08.shd」を開いて遊んでみてくださいね。

インストールの方法や、編集の方法については、こちらを御覧下さい。

ゲームの様子はこちらのムービーからも御覧になれます。

dungeon01_game.flv
クリックして再生

◆「index.html」を用意する

ゲーム制作用の「sample08」を用意しましたので、ダウンロードしてShadeにインストールしてください。インストール後にShadeを再起動したら、中の「index.html」を開いてください。ダンジョン用の「sample08.shd」も同梱されていますので、そちらも開いてくださいね。

「index.html」を開く詳しい方法は、こちらのトピックをご覧ください。

◆当たり判定の仕組み

ダンジョンには、複数の「閉じた線形状の掃引体」で壁を作ってあります。そして、カメラは壁の半分の位置に、視点がくるように配置されています。

図では、カメラが2歩進むと、視点が前の壁の中心と重なります。下がると、視点が後ろの壁の中心と重なりますね。
なので、視点と中心が重なる時は、壁があるということになります。

◆壁の中心のリストを作る

それでは、当たり判定用のリストを作成しましょう。「center_point」で壁の中心を調べますが、普通に出力すると、細かい数字になります。

print xshade.scene().active_shape().center_point

これは、Shadeの扱う数値が細かいためで、カメラの視点・注視点の位置も同様に、細かい数値となります。

print xshade.scene().camera.eye
print xshade.scene().camera.target

3

細かい数値だと、同じ座標でも微妙な誤差が出て、「同じ」という判断が出来ない場合があります。そこで、「round」で四捨五入して、さらに「int」で整数にします。また、Y座標は不要なので、XとZ座標だけをリストにします。

scene = xshade.scene()
cv = scene.active_shape().center_point
print int(round(cv[0]))
print int(round(cv[2]))

3

リストは「index.html」内に、メッセージウインドウからコピーして貼り付けます。「str」でリスト全体を文字にして、「Python」の文章として出力するようにしておきましょう。

c_list = []
for sp in xshade.scene().active_shapes:
      cv = sp.center_point
      c_list.append((int(round(cv[0])), int(round(cv[2]))))
print "map_data = " + str(c_list)

ブラウザで「閉じた線形状の掃引体」を選択して実行すると、メッセージウインドウにリストが出力されます。

a

◆カメラ位置とリストの判定

「index.html」の「#◆◆ここにリストを貼り付ける◆◆」にメッセージウインドウからコピーしたリストを貼りつけます。

この壁のリスト内に、1歩先の注視点のリスト、あるいは一歩後ろの視点のリストが含まれているかを「count」で調べて、当たり判定を行います。スクリプトウインドウに、次のコードを書き入れて実行すると、最初の判定では、リスト内に1つあるので「1」を、次の判定では、存在しないので「0」が出力されますよ。

mdata = [[2,3], [2,1], [4,5]]
print mdata.count([4,5])
print mdata.count([0,1])

◆ぶつかった時のメッセージを追加する

当たり処理を行う部分は、「index.html」内に書き込んであります。壁にぶつかったときの、表示するメッセージ内容を書き入れて完成させましょう。ランダムに4つのメッセージを表示するようになっていますので、好きなメッセージを書き入れてくださいね。

if walk_mode == 0: #forward
      int_t_v = (int(round(t_v[0])), int(round(t_v[2])))
      if map_data.count(int_t_v) == 0:
            e_v = get_add_vec(e_v, walk_vec)
            t_v = get_add_vec(t_v, walk_vec)
      else:
            n = random.randint(0,3)
            if n == 0:
                  xshade.show_message_box('痛っ!', False)
            elif n == 1:
                  xshade.show_message_box('壁だ!', False)
             elif n == 2:
                  xshade.show_message_box('進めない!', False)
            elif n == 3:
                  xshade.show_message_box('無理!', False)

下がったときのメッセージも、同様に書き入れます。

elif walk_mode == 3: #back
      sub_v = get_sub_vec(e_v, walk_vec)
      int_t_v = (int(round(sub_v[0])), int(round(sub_v[2])))
      if map_data.count(int_t_v) == 0:
            e_v = get_sub_vec(e_v, walk_vec)
            t_v = get_sub_vec(t_v, walk_vec)
      else:
            n = random.randint(0,3)
            if n == 0:
                  xshade.show_message_box('痛っ!', False)
            elif n == 1:
                  xshade.show_message_box('壁だ!>', False)
            elif n == 2:
                  xshade.show_message_box('進めない!', False)
            elif n == 3:
                  xshade.show_message_box('無理!', False)

◆ゲームの完成

「index.html」を保存したら、スクリプトメニューから「sample08」を実行して、ダンジョン内を歩きまわって壁にぶつかることを確認しましょう。

ここまでの手順のムービーは、こちらからご覧になれます。

dungeon01_game.flv
クリックして再生

◆オリジナルマップの作り方

このゲームでは、壁を一辺500mmの「閉じた線形状の掃引体」で作成し、グリッドに合わせて配置しています。通路には何も配置しません。同様にして、他のマップを作成することもできます。

作成したら、スクリプトで壁の中心のリストを作って、「index.html」に貼りつけましょう。

◆隠し要素の追加

当たり判定では、特定の場所に入ったときに、なにかの処理を行うこともできます。「sample08」では脱出したときに、メッセージを表示するようにしていますよ。

goal_v = (4750, -3250)
if (int(round(t_v[0])), int(round(t_v[2]))) == goal_v:
      xshade.show_message_box('おめでとう!無事脱出できました。', False)

これを応用して、特定の位置へ移動させたり、モンスターを出したり、謎解きをさせたりすることもできますね。
また、リストを作ったあとで、壁の位置を変更したり、追加することで、壁があるけど、実は進める「隠し通路」などを作ることも出来ます。「sample08」「ShadeDungeon」でも、1箇所色を少し変えて仕込んであります。

◆終りに

本連載は、今回で最終回です。ゲーム作りを通して、スクリプトの仕組みや、出来ることを、ちょこっと紹介させていただきました。これをきっかけに、スクリプトに興味をもっていただけたら、なにより嬉しく思います。最後までお付き合いいただき、ありがとうございました。それでは。

※「artists side」に専用コミュニティ「でった☆のスクリプト天国」を開設していますので、ご質問などありましたら、お気軽にご利用下さい。

▲ページ上部へ