MVVM ダメ Tips

使ってはいけない Tips。コードは Livet 環境前提。

ViewModel から直接 View を参照してしまう

最早 MVVM ではないが、添付ビヘイビアとか作るの面倒くさい時に。
Initialize2() の引数に Window オブジェクトが渡される。

XAML 側コード

<i:EventTrigger EventName="ContentRendered">
    <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/>
    <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize2" MethodParameter="{Binding ElementName=MyWindow}"/>
</i:EventTrigger>

ViewModel 側コード

public void Initialize2(Object oParam)
{
    Debug.WriteLine("Initialize2() param type: " + oParam?.GetType().ToString());
}


Factory Town 計算ブロックでマインカートを制御する

生産物流箱庭ゲーム「Factory Town」において、マインカート(鉄道)は直進しかできない猪突猛進型のユニットですが、計算ブロックを使うことで、マインカートに様々な振る舞いをさせられるようになります。

以下の記事の内容は把握済みである前提でまとめています。

なお、Factory Town Ver 0.108m 時点(Windows 版)での情報です。画像はクリックすると拡大します。

やりたいこと

マインカートの積み荷によって、行き先を分岐させたいと思います。また、積み荷を降ろして空になったマインカートに対しては、1 台ごとに別の荷物を積むようにします。

whole2全体像が右の写真です。

カートは青白い矢印の向きに時計回りに走るものとします。

①のサイロには木材があり、②の井戸からは水が出てきます。従って、カートは木材か水のどちらかを積んだ状態で、(B) の分岐点に来ます。

木材を積んだカートは (B) を上方向に、水を積んだカートは (B) を右方向に進むようにします。

これにより、③の倉庫には木材だけが、④の倉庫には水だけが溜まっていきます。同じ線路を使用していても、積み荷の振り分けが可能となります。

積み荷を倉庫で降ろして空になったカートは、(A) の分岐点に来ます。

(A) では、上方向と右方向を交互に進ませます。これにより、1 台目のカートが木材を積んだら、2 台目のカートは水を積む、というように、2 種類の積み荷を運ぶことができます。

(補足)積み荷の振り分けは、計算ブロックを使わずとも、ソーターやプッシャーでマインカートを押し出すことにより行えます。本記事は計算ブロックの勉強用としてご覧ください。

施設の配置

fusetsu右の写真のように、施設やレールとバリアゲートを配置します。時間を止めた方がやりやすいです。

バリアゲートは物流ブロックの中にあり、設置時は「オフ」になっていて遮断機がおりた状態で通行できませんが、「オン」にすると遮断機が上がって通行できるようになるというブロックです。

サイロと井戸のレールストップは出力、倉庫のレールストップは入力に設定します。

レールの敷設についてですが、(1)-(2)-(3) の分岐部分は、(1)-(2) を先に敷いてから最後に (3) をつなぐようにします。詳しくは、マインカートの記事の「単線運用」節を参考にしてください。

同様に、(1)-(4)-(5) は (4)-(5) が先、(5)-(6)-(7) は (5)-(6) が先、(7)-(8)-(9) は (7)-(9) が先です。

カートは適当な台数(私は 3 台にしました)を、時計回りに走るように配置します。手動でバリアゲートをオンオフして、それぞれの場合でカートが詰まらずに走れるか確認すると良いと思います。

計算ブロックの配置と設定(右側の分岐)

bunki1右側の分岐(積み荷の種類による分岐)の制御を行う計算ブロックの説明から先にします。(5) から来たカートが (6) か (7) かのどちらかに進む分岐です。

カートの積み荷による分岐を行うには、計算ブロックであるエージェントトリガーを使います。エージェントトリガーは、通過したアイテムによってオンオフを出力するブロックです。

エージェントトリガーを分岐点に上乗せして配置します。簡単のために分岐点に重ねていますが、重ねたくない場合は他の場所に配置しても構いません。ただし、他の場所に配置した場合は、オフセット指定で分岐点を必ず指定して下さい。

エージェントトリガーのアイテムフィルタを「水」にします。

bunki2最後に、オンオフをバリアゲートに伝送するために、エージェントトリガーとバリアゲートをリンクします。エージェントトリガーが送信元(左クリック)、バリアゲートが受け取り先(右クリック)です。

ここまでの設定により、「エージェントトリガーを通過したアイテムが水の場合はオン、そうでないならオフ」という設定がバリアゲートに送られます。バリアゲートはオンの時は通行可能となりますから、結果として、水を積んでいる場合に通行可能となります。カートは直進と左折のどちらもできる分岐に来た場合は直進しますので、直進して (7) の右方向に進みます。

一方で、水を積んでいない場合(木を積んでいるか、または空の場合)はエージェントトリガーがオフになります。バリアゲートはオフの時は通行不可ですから、カートは左折せざるを得ず、(6) の方向に進みます。

結果として、木は上の倉庫に、水は下の倉庫に入ります。

計算ブロックの配置と設定(左側の分岐)

次に左側の分岐(交互に振り分け)の制御を行う計算ブロックの説明をします。(2) から来たカートが (1) か (3) かのどちらかに進む分岐です。

bunki3再びエージェントトリガーを使います。エージェントトリガーを分岐に重ねて下さい(オフセットをしていする場合はどこでも構いません)。

さらに、トグルを付近の適当な場所に設置します。

計算ブロックの設定ですが、左側の分岐では、エージェントトリガーのアイテムフィルタは無しのままにしておきます。こうすると、エージェントトリガーと何かが通過したときに常に信号が発生するようになります。

そして、エージェントトリガーからトグルへ信号を伝送するためにリンクします(エージェントトリガーが送信元、トグルが受け取り先)。

トグルは、何らかの信号が届くたびに、オンとオフが切り替わります。つまり、エージェントトリガーをトロッコが通過する度に、交互にオンとオフになります。

トグルの設定をバリアゲートへ伝送するために、トグルからバリアゲートへリンクします(トグルが送信元、バリアゲートが受け取り先)。

交互にオンオフが送られてくるので、バリアゲートは開いたり閉じたりを繰り返します。

動作結果

ゲーム時間を再開すると、カートが走り出します。

カートが動く様子を動画にしましたので、以下の動画を参照してください。



mokuzai上側の倉庫を見ると、木材だけが溜まっていくのが分かります。

mizu逆に、下側の倉庫を見ると、水だけが溜まっていくのが分かります。

以上により、マインカートを制御して積み荷を振り分けることができました。

単に積み荷の振り分けということでいえば、計算ブロックに限らずやり方はいくつもあり、先の補足に記したようにソーターなどでも実現可能です。

しかし、計算ブロックでマインカートの制御ができるようになることで、いろいろな夢が広がっていくのではないでしょうか。

Factory Town 計算ブロックで在庫数に応じた発送制御

生産物流箱庭ゲーム「Factory Town」における計算ブロックの使い方を整理しておきます。前回はごく基礎的な操作方法のまとめでしたが、今回は実用のイメージが湧くかと思います。

なお、Factory Town Ver 0.108m 時点(Windows 版)での情報です。画像はクリックすると拡大します。

やりたいこと

牧場が肥料を生産してベルトコンベアで流してそれを農場が受け取っている場合、農場であまり肥料が消費されないと、肥料が余ってしまってベルトコンベアが渋滞してしまいます。

ベルトコンベアが渋滞しないようにする方法はいくつかありますが、そのうちの 1 つが、「農場の入力用ストレージにある程度肥料が溜まってきたら、牧場側は肥料を送らないようにする」です。これは計算ブロックで実現できます。

kansei今回は例として牧場と農場の代わりに、「井戸が生産した水をサイロで受け取る」場合を考えてみます。

サイロに溜まっている水が 10 個未満の場合のみ、井戸はベルトコンベアに水を放出します。サイロに溜まっている水が 10 個以上になったら、井戸は放出をやめます。

余談ですが、今回もマインカートの時も井戸とサイロを例にしているのは、単に供給が楽というだけで、深い意味はありません。

施設の配置

shisetsu右の写真のように施設を配置します。時間を止めた方がやりやすいです。

井戸とサイロをベルトコンベアで結んでいます。井戸からはグラバーで水を引き出し、サイロへはプッシャーで水を押し込みます。サイロの向きはベルトコンベアに向かないようにして下さい。

計算ブロックの配置

isまず、サイロに溜まっている水の数を計測するセンサーの役割を果たす計算ブロックを配置します。

建設メニューの計算ブロックの中に、その名も「インベントリセンサー」というセンサーブロックがありますので、それを配置します。

math次に、水の数が「10 個未満かどうか」を判定する役割を果たす計算ブロックを配置します。

建設メニューの計算ブロックの中に「数学ブロック」という名前のブロックがあるので、それを配置します。ちなみに、数学というほど仰々しいものではありません。ごく簡単に数字を扱うだけのブロックです。

haichi前回も触れたように計算ブロックの位置はどこでも構いません(問題なく動きます)が、個人的には、インベントリセンサーを左、数学ブロックを右に配置すると、条件が読みやすくて好きです。

これで役者が出そろいました。

インベントリセンサーで読み取った「サイロにある水の数」という状況を入力として、数学ブロックで「10 個未満かどうか」という判断をしたうえで、井戸のグラバーのオンオフを切り替えるという出力を行います。

計算ブロックの設定

is2インベントリセンサーをクリックし、右上に出てくる小窓のオフセットの所をクリックすると、黄色い線が出てきます。

これは、インベントリセンサーが「どこの」在庫の数を調べるかを指定するものです。

is3今回はサイロにある水の数を調べたいので、サイロで「右」クリックします(左クリックではないので注意)。

is4正しく設定できると、再度インベントリセンサーをクリックして選択した際、黄色い線がサイロに向かって伸び、また、オフセットに値が入っています。

アイテムフィルタも設定して明示的に測定対象を指定することも可能ですが、今回は設定しなくても構いません。

link4次に、センサーの結果を数学ブロックに伝達したいので、センサーと数学ブロックをリンクします。センサーが送信元、数学ブロックが受け取り先なので、インベントリセンサーで左クリックし、数学ブロックで右クリックです(詳しいリンクのやり方は前回を参照して下さい)。

link5正しく設定できると、再度インベントリセンサーをクリックして選択した際、数学ブロックへの白い線が増えています(根本が太いほうがインベントリセンサー)。

math3続いて数学ブロックの設定です。数学ブロックをクリックし、右上の小窓から数学関数のところをクリックします。

数学関数ウィンドウが開き、数学ブロックで行う処理の種類を選べます。今回は「10 個未満かどうか」を判定したいので、「未満」を選びます。

math5続いて、右上の小窓から設定値のところをクリックします。

数ウィンドウが開くので、10 を入力します。

math6設定を終えると、数学ブロックの表示が「<10」というようになっています。

今回の設定が表す意味は、「送信元の数値が 10 未満かどうか」ということになります。先ほどのリンクによりサイロの水の数が送信元になっていますので、「サイロの水の数が 10 未満かどうか」を判定できることになります。

条件を満たせば数学ブロックの出力はオン、満たさなければオフになりますので、「サイロの水の数が 10 未満の場合だけオン」が出力されます。

link6その結果を井戸のグラバーに伝える必要があるので、数学ブロックとグラバーをリンクします。数学ブロックが送信元(左クリック)、グラバーが受け取り先(右クリック)です。

以上により、センサーブロックで測定した「サイロにある水の数」を、数学ブロックで「10 個未満かどうか」判定し、結果を井戸のグラバーに送る、という一連の流れが完成しました。

動作結果

res1ゲーム時間を再開すると、井戸から水が流れていきます。

最初はサイロにある水の数はゼロ、つまり 10 個みまんなので、判定結果はオンであり、グラバーが有効な状態になっています。

res2やがて、井戸から流れてきた水がサイロに入っていきます。

水が入る度に数学ブロックで 10 個未満かを判定し、結果をグラバーに送るので、伝達を示す青い線が一定間隔で表示されます。

10 個未満の場合は結果は「オン」のままなので、引き続き水は流れていきます。

res3サイロの水が 10 個溜まったところで、判定結果が「オフ」に変わります。それがグラバーに伝わると、グラバーがオフになって赤く表示が変わります。

以降、水が止まります。

res4なお、サイロにある在庫を手動でゼロに戻すと、再び水が流れるようになります。

以上により、サイロの在庫数に応じた、井戸からの発送調整が実現できました。発送をやめてもベルトコンベアに流れている分があるため、多少のタイムラグがあるので、実際にはこのあたりを工夫する必要が出てくる場合もあるかもしれません。


Factory Town 計算ブロックの一番簡単な使い方

生産物流箱庭ゲーム「Factory Town」における計算ブロックの使い方を整理しておきます。

なお、Factory Town Ver 0.108m 時点(Windows 版)での情報です。画像はクリックすると拡大します。

計算ブロックとは

計算ブロック(Computation blocks)は、物流の状況に応じた調整(アクション)を自動的に行うためのブロックです。「農場で使う肥料は十分にあるから、牧場からの肥料発送をやめよう」とか、「普通は直進しかしないマインカートを状況に応じて分岐させよう」などということができるようになります。

現在の状況という「入力」を元に、必要に応じて「判断」を行い、アクションという「出力」を行う。これを実現するのが計算ブロックです。入力も出力も原則として「オン/オフ」で表現されるので、一般的に論理回路と呼ばれます。Minecraft では Redstone 回路と呼ばれて人気ですが、Factory Town の計算ブロックは
  • 基本的な機能が 1 ブロックにまとめられている
  • 配線が簡単(配線のためのブロックスペースが不要)
という特徴があり、Minecraft よりも回路を組む敷居は低いのではないかと思います。

シンプルな入出力を行う

switch1一番シンプルに計算ブロックを使ってみます。

スイッチ(右の写真の左側のブロック)とランプ(右側のブロック)が 1 つずつで、スイッチを押すと、ランプが光ったり消えたりする、という簡単なものです。

toggleスイッチは「トグル」という名前のブロックになります。建設メニューの計算ブロックでトグルを選択して配置します。

lampランプは「論理ランプ」という名前のブロックです。同じく建設メニューの計算ブロックから選択して配置します。

スイッチとランプの位置関係は適当で構いません。

さて、2 つのブロックを配置しただけでは連動しないので、連動するようにリンクを張ります(配線します)。

linkトグルを左クリックして選択状態にしてから、マウスカーソルを論理ランプの上に持って行くと、「論理リンクを追加」という表示が出ます。この状態で「右」クリックすると、リンクが張られます。

必ず、トグル(入力元)で左クリック→論理ランプ(出力先)で右クリック、の順番です。

link2リンクが張られると、改めてトグルを選択した際に、トグルと論理ランプが白いカーブで結ばれている表示になります。入力元であるトグルの方が太い線になっています。

補足ですが、リンクを張ってあればきちんと動作するので、ブロック同士の位置関係はどんなものでも構いません。逆に、隣同士に配置したとしても自動でリンクが張られるということはありません。

さて、トグルをマウスで選択しマウスカーソルがトグル上にある状態で、Enter キーを押すと、トグルのマークが赤い禁止マークから緑のチェックマークに変化します。

link3同時に、カチッと音をたてながら青いビームが論理ランプに飛び、変化が論理ランプに伝わり、論理ランプが青く光ります。

Enter キーを押す度にトグルの表示が変わり、併せて論理ランプの表示も変わります。

なお、Enter キーを押すまでにマウスカーソルがずれてしまうと、トグルのオンオフは切り替わるのに論理ランプの表示は変わらなくなってしまうので注意して下さい。また、Enter キーはテンキーの Enter キーではなく大きい方の Enter キーを使って下さい。

migishitaさらに言うと、トグルを選択すると画面右下にトグルのオンオフを切り替える小窓が表示されますが、この小窓でマウスを使ってオンオフを切り替えると論理ランプの表示は変わらないので注意して下さい。

バージョンアップするに従ってこの辺りは改善されるとは思いますが、現状ではトグルの扱いに注意が必要です。

とはいえ、実際には手動でトグルをいじることはないので、実用上はあまり問題にはならないかと思います。

以上が、1 入力 1 出力という一番シンプルな計算ブロックの使い方となります。「入力のオン/オフに応じて出力がオン/オフ」されました。これを発展させていくと、実用的な使い方ができるようになります。

Factory Town マインカートの基本的な使い方

run生産物流箱庭ゲーム「Factory Town」において、高速輸送ツールであるマインカート(Minecart:鉄道のイメージ)の使い方が最初分からなくて困ったので整理しておきます。

なお、Factory Town Ver 0.108m 時点(Windows 版)での情報です。画像はクリックすると拡大します。

環状線が基本


マインカート(電車というかトロッコ?)はひたすら前に進むのみで、折り返しという機能はありません。手動で進行方向の反転は可能ですが、自動運転が基本ですので、前進のみを前提に線路(レール)を敷設する必要があります。

これにより、レールの形態としては環状線が基本となります。

レールの敷設


reru建設メニューの通路からレールを選びます。

環状にレールを敷設します。

reru2また、今回は例として「井戸からサイロに水を運ぶ」こととしますので、レールに隣接するように井戸とサイロを配置しました。

サイロを配置すると、向きによっては矢印が表示されますが、これは「レールストップ」です。次で説明します。

レールストップの設置

駅に相当するのがレールストップです。

stop建設メニューの物流ブロックからレールストップを選びます。

stop2井戸から出る方向になるようにレールストップを設置します。

stop3設置したレールストップをクリックすると、右上の小窓にアクセスタイプが表示されるのでクリックすると、アクセスタイプを設定するウィンドウが表示されます。

井戸の水をトロッコに積み込みたい(井戸からトロッコへ出力)ので、井戸のレールストップのアクセスタイプを出力に設定します。

stop4一方、サイロのレールストップでは、トロッコに積んである水を格納したい(トロッコからサイロへの入力)ので、サイロのレールストップのアクセスタイプは入力に設定します。矢印の向きがサイロを向くようにします。

マインカートの配置

kato1建設メニューのワーカーからマインカートを選びます。

kato2レールの上にマインカートを配置します。配置したマインカートを選択して R キーを押すと、マインカートの進行方向を指定できます。

kato3マインカートを走らせると、井戸の前を通る際に自動的に水を積み込みます。

井戸の生産が最大で 10 のため、マインカートにも 10 個しか積まれませんが、マインカートの積載量は最大 20 個です。

サイロの前を通ると、自動的に水を降ろします。

環状線なのでひたすらマインカートがぐるぐる周り、井戸からサイロに水を移します。

単線運用

tansen1輸送効率の面からも環状線が有用ですが、そうは言っても単線で運用したい場合(序盤でレール資源が少ない場合や、景観上の好みなど)は、線路の終端を右の写真のようにすることで折り返し運転が可能となります。マインカートは矢印のように進みます。

tansen2レールの敷設手順としては、まず、交差部分以外の線路を先に敷設しておきます。

tansen3次に、右の写真の①から②に向かってレールを敷設します。右の写真は、②までレールを敷設した段階のものです。

最後に、③から①に向かってレールを敷設すれば完成です。本節の最初の写真のような敷設になるはずです。

ng2参考までに、ダメな例を右に。

①と③を最初に結んでしまうと、交差点部分があたかも十字路のようであるかのようになり、②から進んできたマインカートが直進しようとして詰まってしまいます。

tansen4なお、コンパクトにレールを敷設すると、4 マスで折り返し運転が可能となります。

カウンター


カンパのお願い
Amazon でお買い物の際は、下記で検索して頂けたら幸いです。
記事検索
最新コメント
  • ライブドアブログ