fc2ブログ

コモンイベントができるまで

プログラムとかちゃんと勉強してないので見よう見まねですが
私がウディタでコモンイベントを作ってるときの手順でもメモしておこうかと思います。
題材はこの前作ったシミュレーション「アダムが耕し、イヴが紡いだ時、あんたが領主だったのか。

【用意するもの】
・紙と鉛筆
 流れを描くと分かりやすい。また計算用紙として。
note.jpg
実際はこれの通りには全然ならなかったのですが、よくあることです

公式のマニュアル
キーコードや変数呼び出し値などを参照するために。
・メモ帳ソフト
 イベントコードの編集用に。置換え機能が便利。

【基本的な心がけ】
・コモンセルフ変数には名前をつける。
 後から見たときに分かりやすいです。
 よく使う変数の名前だけつけて処理は空のコモンを用意しておくと楽かもしれないです。
 例えば私はいつもコモンセルフ19番を一時変数に、18番をループ回数カウント用に取ってあります。
・コメント文は欠かさない
・画面を見ていて頭がごちゃごちゃしてきたら紙に書く

 紙は偉大。
・消去or終了処理→表示or初期化処理→更新処理の順に書く
 基本システム見てたらだいたいこうなってたんで、真似してます。

【詰まったら】
1.やりたいことをはっきりさせる
決まった数のマスの中にランダムに地形を置きたいとしましょう。
でもこれだけではまだコモンにできません。
コモンにするには、やりたいことをできるだけはっきりさせることが必要です。

文章を書くときに気を付けることに5W1H(誰が、何を、いつ、どこで、なぜ、どのように)というのがありますが、こういった疑問を自分にどんどん投げるとはっきりしてきます。
なぜランダムにしたい?→資源配分をランダムにすることで飽きないようにしたい→でもゲームをはじめるたびにあまりにも片寄りすぎているとゲームにならない…
と、ダメ出ししつつ考えていくと、
「完全ランダムではなく、例えば草原10マス、砂漠10マス、川5マス…などと配分は決まっていて位置だけランダムなものが作りたいなぁ」
ということがわかってくるわけです。
どのくらいの範囲で作る?→10*10の100マス
いつマップを作る?→ゲームの最初にタグ番号だけ記録しておいて、マスを開ける時にマップチップで描画する

こうして、ゲーム像がだんだんできてきます。
ScreenShot_2012_0510_15_16_20.png


2.できるだけ簡単なモデルを考え、仮説を立てる
まずは1マスの中に置くことを考えます。
草原か砂漠化をランダムに置くのは簡単です。
0か1かが出る乱数を作って0なら草原、1なら砂漠を置いてやればいい。
もし草原チップが10枚、砂漠チップが10枚あれば
0から19までの20個の数字の出る乱数を用意して、
10未満なら草原、そうでなければ砂漠、という処理にすればいいのです

じゃ、2マスの時に草原チップ1枚と砂漠チップ1枚をランダム割り付けするには?
まず、最初のマスに二分の一の確率で草原、二分の一の確率で砂漠を割り当て、次のマスにはもう片方を割り当てる、ということになるでしょう。
この二分の一は何か?と更に考えます。2はマスの総数でありチップの総数です。
ここで仮説を立ててみます。

仮説:一回割り当てる度に割り当てられるマスの総数とその回割り当てたチップの数を減らしていけばいいんじゃないかな?

例えば最初に草原が来たら次に草原になる確率は0にすればいいんです。
初期状態…マス総数2草原1砂漠1
 →乱数で2(マス総数)分の1(草原チップ数)の確率で草原チップにする、そうでなければ砂漠チップ
一回処理したときに「草原」だった場合…総数1草原0砂漠1
 →乱数で1(マス総数)分の0(草原チップ数)の確率で草原チップにする、そうでなければ砂漠チップ
一回処理したときに「砂漠」だった場合…総数1草原1砂漠0
 →乱数で1(マス総数)分の1(草原チップ数)の確率で草原チップにする、そうでなければ砂漠チップ

こうすると必ず(草原→砂漠)か(砂漠→草原)かのどちらかになります。
なんとなくいい感じになってきました。
複数枚のときはさっきのように「未満」で分けてあげればいいです。
ちなみにウディタで条件分岐を組む際は「当てはまるものが少ない順」に書くのがいいっぽいです。

【いよいよ組んでみる】
10種のチップのためにまずセルフ20からの10個変数を用意し、
分岐用にセルフ30から更に10個用意します。
20120609_184508.png

で、組みます。
コマンド文は追記に置いておきました。

だいたいこんな感じで、つたないものですが、
数学苦手人間がどうやってコモン組んでるのかという一例として参考になれば。
今回の処理のコマンド文。
あれ、何故か「未満」じゃなくて「以下」になってる。なんか間違ってますね

■変数操作: CSelf10[基準X] = 5 + 0
■変数操作: CSelf11[基準Y] = 3 + 0
■変数操作: CSelf20[平原] = 30 + 0
■変数操作: CSelf21[雪原]~CSelf25[荒地] = 10 + 0
■変数操作: CSelf26[オアシス]~CSelf29[川] = 5 + 0
■変数操作: CSelf18[カウントうp] = 0 + 0
■マップチップ上書き: [ レイヤー 2 / X CSelf10[基準X] / Y CSelf11[基準Y] ] から[ 横10 / 縦10 ] をチップ[ 0 ]で上書き
■マップチップ上書き: [ レイヤー 1 / X CSelf10[基準X] / Y CSelf11[基準Y] ] から[ 横10 / 縦10 ] をチップ[ 55 ]で上書き
■回数付きループ [ 100 ]回
|■変数操作: CSelf13[現在X] = CSelf18[カウントうp] % 10
|■変数操作: CSelf14[現在Y] = CSelf18[カウントうp] / 10
|■変数操作: CSelf13[現在X] += CSelf10[基準X] + 0
|■変数操作: CSelf14[現在Y] += CSelf11[基準Y] + 0
|■変数操作: CSelf30~CSelf39 = CSelf20[平原] + 0
|■変数操作: CSelf31~CSelf39 += CSelf21[雪原] + 0
|■変数操作: CSelf32~CSelf39 += CSelf22[湿地] + 0
|■変数操作: CSelf33~CSelf39 += CSelf23[砂漠] + 0
|■変数操作: CSelf34~CSelf39 += CSelf24[森] + 0
|■変数操作: CSelf35~CSelf39 += CSelf25[荒地] + 0
|■変数操作: CSelf36~CSelf39 += CSelf26[オアシス] + 0
|■変数操作: CSelf37~CSelf39 += CSelf27[山] + 0
|■変数操作: CSelf38~CSelf39 += CSelf28[雪山] + 0
|■変数操作: CSelf39 += CSelf29[川] + 0
|■変数操作: CSelf19[一時] = 100 - CSelf18[カウントうp]
|■変数操作: CSelf19[一時] = 0 ~ CSelf19[一時]
|■条件分岐(変数): 【1】CSelf19[一時] が CSelf30以下 【2】CSelf19[一時] が CSelf31以下 【3】CSelf19[一時] が CSelf32以下
|-◇分岐: 【1】 [ CSelf19[一時] が CSelf30以下 ]の場合↓
||■変数操作: CSelf12[現在タグ] = 1 + 0
||■変数操作: CSelf20[平原] -= 1 + 0
||■
|-◇分岐: 【2】 [ CSelf19[一時] が CSelf31以下 ]の場合↓
||■変数操作: CSelf12[現在タグ] = 2 + 0
||■変数操作: CSelf21[雪原] -= 1 + 0
||■
|-◇分岐: 【3】 [ CSelf19[一時] が CSelf32以下 ]の場合↓
||■変数操作: CSelf12[現在タグ] = 3 + 0
||■変数操作: CSelf22[湿地] -= 1 + 0
||■
|-◇上記以外
||■条件分岐(変数): 【1】CSelf19[一時] が CSelf33以下 【2】CSelf19[一時] が CSelf34以下 【3】CSelf19[一時] が CSelf35以下
||-◇分岐: 【1】 [ CSelf19[一時] が CSelf33以下 ]の場合↓
|||■変数操作: CSelf12[現在タグ] = 4 + 0
|||■変数操作: CSelf23[砂漠] -= 1 + 0
|||■
||-◇分岐: 【2】 [ CSelf19[一時] が CSelf34以下 ]の場合↓
|||■変数操作: CSelf12[現在タグ] = 5 + 0
|||■変数操作: CSelf24[森] -= 1 + 0
|||■
||-◇分岐: 【3】 [ CSelf19[一時] が CSelf35以下 ]の場合↓
|||■変数操作: CSelf12[現在タグ] = 6 + 0
|||■変数操作: CSelf25[荒地] -= 1 + 0
|||■
||-◇上記以外
|||■条件分岐(変数): 【1】CSelf19[一時] が CSelf36以下 【2】CSelf19[一時] が CSelf37以下 【3】CSelf19[一時] が CSelf38以下
|||-◇分岐: 【1】 [ CSelf19[一時] が CSelf36以下 ]の場合↓
||||■変数操作: CSelf12[現在タグ] = 7 + 0
||||■変数操作: CSelf26[オアシス] -= 1 + 0
||||■
|||-◇分岐: 【2】 [ CSelf19[一時] が CSelf37以下 ]の場合↓
||||■変数操作: CSelf12[現在タグ] = 8 + 0
||||■変数操作: CSelf27[山] -= 1 + 0
||||■
|||-◇分岐: 【3】 [ CSelf19[一時] が CSelf38以下 ]の場合↓
||||■変数操作: CSelf12[現在タグ] = 9 + 0
||||■変数操作: CSelf28[雪山] -= 1 + 0
||||■
|||-◇上記以外
||||■変数操作: CSelf12[現在タグ] = 10 + 0
||||■変数操作: CSelf29[川] -= 1 + 0
||||■
|||◇分岐終了◇
|||■
||◇分岐終了◇
||■
|◇分岐終了◇
|■可変DB書込:DB[マスDB:CSelf18[カウントうp]:地形タグ] = CSelf12[現在タグ]
|■イベントの挿入[名]: ["地形ボーナス返す"] <コモンEv 2> / 0:ボーナス / CSelf18[カウントうp]
|■変数操作: CSelf18[カウントうp] += 1 + 0
|■
◇ループここまで◇◇
関連記事
スポンサーサイト



Comment

Comment Form
公開設定

Trackback


→ この記事にトラックバックする(FC2ブログユーザー)