仕様等雑多情報

Last-modified: 2014-05-11 (日) 01:31:59

このページでは、MMF2を使用してきて判明した仕様や不具合を掲載しています。

 

本体関係

本体の仕様

「タイマーベース動作」について

テクニック集/「タイマーベース動作」についてをご覧下さい。

マウスコントロール動作に設定していると、マウスボタンクリック条件が動作しない

オブジェクトの動作に「マウスコントロール」を設定していると、イベントのマウスボタンクリック条件が動作しません。
マウスコントロール動作を設定している時は、プレイヤーのボタン入力がマウスボタンクリックとして機能します。
ボタン1が左クリック、ボタン2が右クリックです。

使用できるフラグの数は0~31の計32個

アクティブオブジェクトに設定できるフラグの数は0~31までの計32個です。
32番を設定した場合は、0番のフラグが操作されたことになり、0番のフラグが使われているイベントが動作してしまいます。
同じように33番だと1番、34番だと2番…となり、64番ではまた0番とループします。
フラグは0~31番までしか使用しないようにすると良いでしょう。

新しく生成したオブジェクトの変数をいじるには?

オブジェクト新規作成アクションを起こしたイベントに、そのオブジェクトの変数Aに1をセットするなどの操作をした場合、そのアクションは新しく新規作成されたオブジェクトのみに適応されます。
しかし、一つのイベント内でオブジェクトを複数作った場合はそれぞれのオブジェクトを初期化することはできません。

オブジェクトはイベントを全て実行した後に破壊される

オブジェクト破壊のアクションは、即座に実行されません。
オブジェクトを破壊したイベントの次のイベントでオブジェクトの数をカウントしても
オブジェクトの数は減っていないことに注意してください。

高速ループはグローバルイベント、フレームイベント、オブジェクトイベント、どこからでも呼べる

この特徴をいかして、全てのフレームに書かなきゃいけない重複したイベントをグローバルイベントに書いて、フレームイベントからグローバルイベントの処理を呼び出そう!

 

or(論理式)とor(フィルタ)の違い

こちらを参照してください。

 

↑のリンク先を読んで自分なりにOR(フィルタ)の用途を無理矢理捻出してみました。
or01s.png
※非常に非直感的な動作なのでこの様な使い方はあまりお薦め出来ません。
プログラマの方が想定するような(C言語でいう「||」)はOR(論理)だと思って下さい。
OR(フィルタ)は使わない方が無難かもしれません。

 

OR演算子(フィルタ).mfa*

 

OR(フィルタ)は即時条件(赤くなる条件)のみだと上手く動作しないようです。上の画像のイベントでも、「Hp >0」の条件を外すと片方に当てると両方とも変数が変更されてしまうという動作になってしまいます。
衝突判定を「重なっている時」のような赤くならない条件に変えるか、画像のように変数の比較などの赤くない条件を挟んでそちらの条件でオブジェクトを特定するようにするといいようです。

オブジェクトイベント(Behaviors)やグローバルイベントでユーザーアニメに変更する方法

オブジェクトイベントやグローバルイベントにインポートしたアクティブオブジェクトのアニメーションを変更しようとしても、リストに新規に追加したユーザーアニメが出ないので使えないと思われているかもしれませんが、実は使用することが出来ます。
アニメーションエディタでユーザーアニメを追加する時、デフォルトの名前が「アニメーション 12」となっていたのを思い出してください。そうです。アニメーションシーケンスには名前だけでなく番号も振られているのです。「停止」~「立ち上がる」には0~11が振られていてユーザーアニメは12番以降になります。そこで、アニメーションシーケンスを変更する時に計算式を使って12以降を指定してやれば、オブジェクトイベントやグローバルイベントでもユーザーアニメに変更させることが出来ます。

フレーム開始より、タイマーが00:00のほうが早く実行される

このテクニックを使えば、どうしてもフレーム開始より優先して実行したいイベントを実行することができます。
たとえば、グローバルイベントとフレームイベントの両方にフレーム開始のイベントを組んだ場合、グローバルイベントが遅く実行されますが、グローバルイベントでタイマーが00:00のときのイベントを追加してあげれば、グローバルイベントのほうが先に実行されるイベントを組むことができます。
(タイマーが00:01や00:02でもフレーム開始より早いとの報告あり。これはFPSに関係してそう)

計算式の結果で小数点以下の数値を出す方法

2/3(2÷3)は普通に電卓で計算すると答えは0.66666666666666666666666666666667となるが、MMF2の計算式で2/3の計算をした場合に返ってくる数値は0となり、小数点以下の数値は無視されてしまう。
MMF2で整数同士で小数点以下の値が出る結果になる計算をする場合は、2/3.0などのようにどちらかの数値に無理やり小数点以下の値を付ける。これで小数点以下の値も含めた正しい結果が返ってくる。

 

つまり、「計算する時点で小数点以下の値の付いた数値を使っていないと、計算結果の小数点以下の数値は無視される」という仕様らしい。

 

オブジェクトから数値を持ってきて計算する場合に小数点以下の結果が出てほしい場合は、
変数 A( "アクティブ" )/(変数 B( "アクティブ" )*1.0)
このように1.0を掛けて小数点以下の値を付けるようにすれば良い。

変数 A( "アクティブ" )*1.0/変数 B( "アクティブ" )でも可。

2つの変数に同じ名前を設定した時

変数Aと変数Bを同じ名前に設定できるので
どうやって式を判定してるんだと思って調べてみたら
先に見つかった名前のものが優先された。(式のみ)

誤って変数名を同じものにしてしまって式いじると死を見るので注意!

アクティブオブジェクトとアクティブピクチャーオブジェクトのScaleの変更について

以下は英語版ヘルプファイルからの一部引用

(アクティブオブジェクト)Set X Scale
Changes the scale of the object on the X axis (horizontally).
Enter a floating point value: 1.0 is the normal size, 0.5 will divide the size by 2,
2.0 will double the size, etc.

アクティブオブジェクトはpixelサイズでの直接指定はできない仕様らしい。
例えば縦横各100Pixelの画像を縦横各50Pixelに縮小して表示する場合
Set X Scale to 0.5、Set Y Scale to 0.5と指定することはできるが
Set X Scale to 50、Set Y Scale to 50と言った具合にPixelサイズでの直接指定はできない。
(ちなみにこれだと50倍=5000*5000Pixelで拡大されて表示。)

アクティブピクチャーオブジェクトはTransparent Color (in Display Options tab)から透過色を
あらかじめ指定できるけど、これをイベントから呼ぶMMF2のデフォ機能は解説されていないから
たぶん無いのだと思う。(画像全体の透過率の指定はイベントからも変更可能)
そのかわりサイズの指定はPixel単位で可能となっており、オブジェクトから値の取得をする場合も
アクティブピクチャーオブジェクトはオリジナルの画像サイズ情報を取得できるなどが特徴。

■アクティブオブジェクト → PixelサイズでのScale変更指定は無理
■アクティブピクチャー  → PixelサイズでのScale変更可能、透過色の指定はイベントでの変更不可

MMF2で3Dってどうなの?

http://yam2.blog94.fc2.com/blog-entry-50.html
こちらの方が検証されています。3Dモデルの表示は「3D Mesh」というエクステンション(日本語版用エクステンションパックにも含まれています)で可能ですが、やはりとにかく「重い」ようです。
3Dメインで作るのは厳しいと思った方がいいでしょう。

標準のフルスクリーン機能の解像度判別の仕様

MMF2標準のフルスクリーンで変更される解像度は、作成しているアプリケーションのウインドウサイズが基準となります。
320x240のウインドウサイズなら320x240のフルスクリーン、640x480のウインドウサイズなら640x480のフルスクリーンになります。
しかし、一部のPCのグラフィックボードは320x240などの低解像度をサポートしないものがあります。MMF2標準のフルスクリーンは、アプリのウインドウサイズの解像度に変更できなかったら、次に対応しているサイズの解像度に変更する、という仕様になっているようで、320x240に対応していない PCで、次の解像度として640x480に変更されれば等倍なので画面は崩れませんが、稀に、320x240に対応していないのに、640x480以下の解像度が存在するPCが存在したりします(例として、320x240に対応していないのに640x400が存在するPCがあります。)。その場合は、 640x480にならないので画面が崩れることになります。
MMF2標準の解像度は変更する解像度を指定できない上に、このように少々厄介な仕様となっています。
幸い、エクステンションのThe Big Boxを使用すると、解像度を指定して変更することが可能ですが、こちらを使用すると、デスクトップアイコンが左上に寄ってしまう、他に開かれているウインドウが変更された解像度にリサイズされてしまう、といった副作用もありますのでご注意ください。

オブジェクトやイベントグループの名称に日本語は使用しない方が良い

※日本語版はUnicodeに対応しているので、日本語で名前を設定しても動作するようになっています。以下は英語版に関する話です。

オブジェクトの名称やイベントグループ名など、MMF2上で設定する名称には、必ず 半角英数 を使用しましょう。
日本語を使用すると、フレームエディタの左のリストでは正常でも、カーソルを乗せた時に出るポップアップやイベントエディタでの名称表示では文字化けしてしまいます。
また、管理人の手元には環境が無いので未確認ですが、文字化けしている状態でVista上で実行するとエラーとなって動作しないという報告も上がっています。

ファイン判定の怪

MMF2のオブジェクトの当たり判定には、ファイン判定と言って、透明色の部分を除外し、色の付いている部分のみに判定を付けてくれるという便利な機能があります。この機能はデフォルトでオンになっているので特に気にする必要はありませんが、オブジェクトのプロパティからオフにする(透明色の部分にも判定が付く)と多少処理が軽くなると言われています。
ファイン判定をオフにした状態での判定ですが、「オフにしたオブジェクトの透明色の部分に他のオブジェクトが衝突すると判定が起こる」のは当然のことなのですが、「ファイン判定オンの相手側のオブジェクトの透明色部分に判定オフのオブジェクトが衝突しても判定が起こる」ということに注意が必要です。要するに、 ファイン判定をオフにしたオブジェクトは、自らの透明色の判定だけでなく、他のオブジェクトの透明色の部分(相手側のファイン判定のオン・オフに関わらず)にも衝突判定が起こる ということです。

イベントの実行順について

イベントは、基本的にリストの上から順に実行されるというのは周知の事実ですが、
では、フレームのイベントとグローバルイベントとビヘイビアの様にエディタが分かれている場合、どれから順番に実行されるかと言いますと、

 

フレームのイベント→グローバルイベント→ビヘイビイア(オブジェクトイベント)
の順で実行されるようです。

追記:オブジェクトイベント同士の実行順は、それらが同時に実行される場合は、フレームエディタに挿入された順番となるようです。また順序の変更は不可能なようです。

通し番号と高速ループを同じイベントに組むと痛い目に

通し番号をセットするアクションと、高速ループの実行アクションを同じイベントに組み込むと
通し番号が何故か+1された値でセットされてしまいます。
フレームが開始されたときに通し番号をセット、同時に高速ループしてそれぞれのオブジェクトを初期化するというテクニックを使う祭には注意が必要です。

背景オブジェクトの「呼び出し時にロード」

オブジェクトのプロパテイにある「呼び出し時にロード」は、有効にするとそのオブジェクトはフレーム開始時にはメモリに読み込まれず、使用される時に初めてメモリに読み込まれるようにするというオプションです。

 

アクティブオブジェクトでは「開始時に作成」を無効にすることと併用することで効果を発揮し、イベントで「作成」又は「発射」されるまでメモリには読み込まれなくなります。

 

背景オブジェクトにも「呼び出し時にロード」はありますが、「開始時に作成」はありません。ではどうやって使用/不使用を判断するのでしょうか?
背景オブジェクトの場合は「表示領域内に在るかどうか」で判断されるようです。表示領域は実行した時に実際に表示される画面の領域のことです(動作領域ではありません)。
「呼び出し時にロード」が有効の場合、表示領域内に無い背景オブジェクトはメモリに読み込まれず、スクロールするなどして少しでも見えたら、その時にメモリに読み込まれるようです。

高速ループのイベントではフレーム移動のアクションが実行できない

そんな変なイベントの組み方しねーッス。という突っ込みをかき分けるように報告。

JavaでローカルPCのファイルへアクセスするために必要な作業

JavaでローカルPCのファイルにアクセスするためには、デジタル署名の作業が必要なようです。
こちらでその手順が解説されています

フルスクリーンモードと色数の関係

イベントによるフルスクリーンモードでは、解像度は変わっても色数は変わらないようです。
なので、65536色以下のグラフィックモードで作ったアプリを32bitカラーの環境で実行して、イベントでフルスクリーンモードにしても色数は32bitのままになります(例外として256色モードならちゃんと変更されます)。
プロパティの設定による、起動時からのフルスクリーンモードなら、ちゃんとグラフィックモードの色数に合わせて画面の色数も変わります。
ただし、イベントによるフルスクリーンでも、コマンドラインの/DIB7などを使って強制的にグラフィックモードを変更した状態であれば、画面の色数は変更されるようです。

  • 画面の色数がアプリのグラフィックモードと異なる時、フルスクリーンにして画面の色数が変更されるかどうか
(プロパティ)解像度を変更(プロパティ)全画面表示を切り替え(イベント)全画面モードコマンドライン(/DIB4~8)色数が変更されるか否か
××無し
×無し
××無し×
××有り
××無し×
××有り

サブアプリケーションで実行しているフレームはタイマーベース動作を無効に

サブアプリケーションで実行しているフレームは、フレームのプロパティの「タイマーベース動作」を無効にしないと、タイトルバーをドラッグしてウインドウを移動させたり、枠をドラッグしてサイズを変更している最中も動作してしまい(アプリのプロパティの「サイズ変更中に実行」が無効だと見た目は止まっています)、離した時にはプレイヤーが死んでいたなどということが起き得りますので注意してください。

オブジェクトの名前が化けた時の対処法

namebake.png
エクステンション等のオブジェクトを新規に挿入すると、名前が化けていることがあります。
その場合は、プロパティから化けている名前を消して、空白のまま確定すると元の名前に戻ります。

ハイスコアオブジェクトの注意事項

ハイスコアオブジェクトは次回実行時に前回のスコアを表示するために、ハイスコアのデータをiniファイルに保存します。
iniファイルが保存されるタイミングはフレーム終了時です。ファイルの保存先は、プロパテイの「使用するIni ファイル:」とイベントの「ファイル→現在のファイルを変更」で指定できます。
保存先を指定しない場合(空白の場合)は、WINDOWS\System32\に「cncscore.ini」という名前で保存されます。MMF2をインストールしているかいないかに関わらず、C:\Documents and Settings\ユーザー名\Application Data\Clickteamに「cncscore.ini」という名前で保存されます(Viata以降はC:\Users\ユーザー名\AppData\Roaming\Clickteam)。ファイル名のみを指定した場合はファイル名はその名前に変わりますが、保存先は同じになります。パスを含めてファイル名を指定すると、その場所に保存されます。プロパティからではフルパスでしか指定できないようなので、EXEと同じ場所に保存したという場合は、イベントから「Apppath$+ファイル名」という感じで指定しましょう。

 

ファイルの保存先を指定しないと、アプリとは別の場所に保存されてしまうことになり、アプリのフォルダを削除するだけでは完全にアンインストールとならずゴミが残ってしまうことになるので注意してください。
また、別のアプリでも同様の処理だった場合は、同じファイルを共有することになってしまいます(ハイスコアの内容は別々に記録されます)。

 

※追記:「現在のファイルを変更」を使ってファイルを指定すると、毎回リセットされた内容のファイルで上書きされてしまい、ランキングを維持できないというバグがあるようです。
となると、現状ではハイスコアファイルをアプリと同じ場所に置くことは出来ないので、プロパティにファイル名を設定してファイル自体はデフォルトの場所に作成されることを許すしかなさそうです(マニュアルに別の場所にファイルが作成されていることを明記する)。

 

テクニック集/自前でスコアランキングを作る」では、ハイスコアオブジェクトを使わずに、もっと多くの情報を表示できるハイスコア画面の作り方を解説しています。

サブアプリケーションで表示しているフレームにボタンを設置する時の注意事項

サブアプリケーションで表示しているフレームに「ボタンオブジェクト」を設置する際には注意事項があります。
サブアプリケーション内にあるボタンをクリックしてフレーム移動すると、なんとAlt+F4の終了が利かなくなってしまいます。
また、サブアプリケーションを複数置いている場合、ボタンが設置されているフレームより上にあるサブアプリケーションには(そのボタンクリックでフレームが移動した後)グローバルイベントにあるControl Xの入力がされなくなってしまいます(Key Objectは行けました。Keyboardはこれとは関係なく一番上にあるサブアプリケーションでしか入力を受け付けませんでした)。

 

現在のところ、サブアプリケーション内ではボタンオブジェクトをクリックしてフレーム移動するようにはしない方が無難ですね。

 

ボタンをクリックしてボタンにフォーカスがある状態では、メニューバーのショットカットキーが動作しません。

コマンドラインオプション一覧

本当はヘルプに書いてあるのですが、ヘルプがなかなか上がらないのでここに書いておきます。

  • /DIB => forces standard graphic mode
    強制的に表示モードを「標準」に変更する。アプリケーションプロパティで表示モードが「DirectX」および「DirectX + VRAM」になっているアプリで「標準」の表示モードで実行させることが出来るということ。
  • /DIB3 => forces standard graphic mode, 256 colors
    強制的に表示モードを「標準」に変更し、更にグラフィックモードを256色に変更する。
  • /DIB4 => forces standard graphic mode, 16 millions of colors, 24 bits
    強制的に表示モードを「標準」に変更し、更にグラフィックモードを16万色(24Bit)に変更する。
  • /DIB6 => forces standard graphic mode, 32768 colors
    強制的に表示モードを「標準」に変更し、更にグラフィックモードを32768色に変更する。
  • /DIB7 => forces standard graphic mode, 65536 colors
    強制的に表示モードを「標準」に変更し、更にグラフィックモードを65536色に変更する。
  • /DIB8 => forces standard graphic mode, 16 millions of colors, 32 bits
    強制的に表示モードを「標準」に変更し、更にグラフィックモードを16万色(32Bit)に変更する。
  • /DDRAW => forces DirectDraw + VRAM mode
    強制的に表示モードを「DirectX + VRAM」に変更する。
  • /NOVR => no VRAM in DirectDraw mode
    Direct DrawモードでVRAMを使用しない。
    これは/DDRAWと一緒に使わないと効果がない?表示モードを「DirectX + VRAM」にして/NOVRのみ付けてもVRAMの表示は消えなかった。
  • /DEBUG => displays graphic mode in title bar
    アプリケーションのタイトルバーに、表示モード、グラフィックモード、MMF2のバージョンを表示する。
  • /MIS0 => disables the Machine Independent Speed option
    アプリケーションプロパティの「マシン速度に依存しない(自動フレームスキップ)」を無効にする。
  • /MIS1 => forces the Machine Independent Speed option
    アプリケーションプロパティの「マシン速度に依存しない(自動フレームスキップ)」を有効にする。
  • /NOF => runs in windowed mode
    ウインドウモードで実行する(フルスクリーンを無効にする)。
  • /NOC => prevents images from being compressed in memory (for internal test)
    画像データが圧縮されてメモリに読み込まれるのを防止する(内部テスト目的)。
    どうもClickteam内部でテストする目的で存在してるオプションだとか?
    これを付けるとアプリケーションのメモリ使用量が増加する(圧縮されない分フレームのロードが少し早くなる?)
  • /NOX => disables Alt+F4
    Alt+F4を無効にする。
  • /NOK => disables the Keep Screen Ratio option (in full screen mode)
    アプリケーションプロパティの「画面の縦横比を保持」を無効にする(フルスクリーンモードにおいて)
  • /VSYNC => forces V-Sync ON
    強制的にV-Syncを有効にする。

コマンドラインの使用方法

作成したアプリケーション(exe)のショートカットを作成。ショートカットのプロパティを開き、
リンク先のパスの後に半角スペースを空けて上記コマンドを追加する。

例:C:\Application.exe /DEBUG /DIB6 /MIS1

アプリケーションプロパティの「コマンドライン」の箇所でもこのオプションを付けることが出来る。ここで付けたオプションは、エディタ上での実行でのみ適用され、作成したアプリケーションには保存されない。

アプリケーションの一時停止(ポーズ)について

pause3.png
イベントエディタのストーリーボードコントロールにある一時停止のアクションは、「一時停止および再開」となっているが、イベントは条件を満たさないと実行されないので、ここで設定したキーは「ポーズの解除」のみに使用され、ポーズを掛けるトリガーにはならない。
また、この機能でポーズを掛けるとポーズ中はCPUの使用率が上昇してしまうという問題(仕様?)がある。
エクステンションのTime Xにも同様の機能があるが、こちらも同じようにポーズ中はCPU使用率が上昇する。

 

CPU使用率を上げることなくポーズを掛ける方法は2つ。
アプリケーションメニューの「ファイル→一時停止」を使って止める方法が1つ。
pause1.png

 

もう1つはサブアプリケーションを使用する方法。サブアプリケーションを一時停止させても親アプリは動いているということでCPU使用率は上がらないようだ。
pause2.png

黒っぽいけど黒じゃない

オブジェクトの画像の透明色が黒(R:0 G:0 B:0)に指定されていると、ピクチャーエディタのパレットの左上の色は、透明色の黒と区別するために(R:8 G:0 B:0)に変更されます。
透明色を別の色に設定するとそこの色は(R:0 G:0 B:0)になります。
なお、このようなリマップが行われるのは黒色だけのようで、パレット内の別の色を透明色に指定すると、パレット上でその色を選択すると透明色として選択されます。

 

余談ですがアプリの色数が65536や32768色になっている場合に、フルカラーや256色の画像を読み込むと、扱う色情報の違いから多少変色してしまうので注意してください。
例として、白色(R:255 G:255 B:255)は、16ビットでは(R:248 G:252 B:248)となります。

ANSIテキストを保存

MMF2日本語版はUnicode化されている為、通常の方法(エディットボックスなど)でテキストファイルを外部に保存すると、そのファイルの文字コードはUnicodeになります。
日本語版で文字コードがANSIのテキストを保存するには、ファイルオブジェクトの「ファイルにテキストを追加」を使用します。
このアクションは、存在する追加先のファイルの文字コードがANSIで、かつ中身が空で無い場合、ANSIのままテキストを追加することが出来ます。ファイルが存在しないか、中身が空の場合はUnicodeに変換されます。

英語版と日本語版を同居させている場合

英語版のMMF2と日本語版のMMF2は同じPCに同居させることが可能ですが、同居後のアンインストール時に注意点があります。
コントロールパネルの「プログラムの追加と削除」では、MMF2の登録名が英語版と日本語版で同じである為、後からインストールした方で上書きされてしまい、後からインストールしたものしかアンインストール出来なくなってしまいます。
アンインストールは、スタートメニューのプログラムからアンインストーラーを実行するようにして下さい。

ベクター動作などで減速させる時の注意事項

イベントで徐々に速度を落とすような動作をさせた場合、バウンスボールなどでは最後が丁度0で終わらない減速度合いであっても最終的には0になって止まりますが、ベクター動作などは最後が0にならない減速度合いだと0になりません。
たとえば、速度が100で1フレームごとに現在の速度から7引くイベントを設定した場合、速度は0まで下がらず3までしか下がりません。

アンチウイルスソフトが反応してしまう場合

ビルドしたアプリケーションを実行するとアンチウイルスソフトが反応してしまい実行できない場合がありますが、その時はアプリケーションプロパティの「ランタイムを圧縮」を外してビルドしてみてください。
mfxファイルに対して反応している場合はエクステンションなので、上記の対策をしても改善しない場合があります。この場合は定義ファイルが更新されて除外されるのを待つ必要があります。

グローバル変数・文字列は無限に増やすことが出来る

オブジェクトの変数はA-Z、文字列はA-Jまでしか使用できませんが、グローバル変数・文字列はプロパティで追加していくとZ以降も増やすことが出来、事実上無限に使用することが出来ます。
Z以降は、グローバル変数 AA、AB、ACという名前になります(変更可能)。

オブジェクトイベントの内容をコピーする際の注意点

objevent01.png
オブジェクトイベントのイベントを別のオブジェクトのオブジエクトイベントにコピーすると、
このように赤い玉が割れたようなアイコンになってしまうことがあります(バッドオブジェクトと呼称)。
このアイコンの状態のまま、イベントを別のオブジェクトのものに修正しようとすると、
objevent02.png
このようにバッドオブジェクトが増殖してしまい、元に戻せなくなってしまいます。
イベントをコピーしてバッドオブジェクトのアイコンになってしまったら、まず、端の「新しいオブジェクトをインポート」アイコンをクリックして、変わってしまっているオブジェクトをインポートし直します。
objevent03.png
するとこのようにバッドオブジェクトのアイコンだったものが正しいオブジェクトに置き換わります。
全てのオブジェクトを正常なものに修正してからイベントの置き換えなどは行うようにしましょう。

テクニック集/MMF2の様々な上限

MMF2でアプリケーションを作成する上で注意したい様々な上限についてまとめています。
これらの上限を超えてしまうと、MMF2の強制終了など製作に影響が出る恐れがあります。

長文の文字列オブジェクトが存在するとスクロール時に重くなる

短文では影響は現れにくいですが、長文の文字列オブジェクトがフレームに存在しているとスクロール時に極端に処理落ちを起こします。
プロパティの「背景として表示」にチェックを入れると少しだけ軽くなりますが、アクティブオブジェクトより上に表示することが出来なくなります。
フォントをSystemTerminalのようなビットマップフォントに設定するとかなり軽くなりますが、それでも処理落ちするのは避けられません。
画面内に文字を表示したくて、かつその内容が動的に変わらないのであればアクティブオブジェクトなどで画像として表示したほうが軽いです。
他には、エクステンションの「Text Blitter」は画像で用意した文字をテキストとして表示するので、こちらも軽いです。
画面に表示する必要の無い文字列については、オブジェクトに設定できる可変文字列などを利用しましょう。

 

スクロール以外では、「背景として表示」を外した長文の文字列オブジェクトの上をアクティブオブジェクトなどが横切る時やカウンタオブジェクトと重なっている時もにも重くなります。

ボタンオブジェクトのフォーカスを解除する方法

ボタンオブジェクトのボタンをクリックすると、ボタンにフォーカスが移ってしまい、一部を除いてキーボードの入力を受け付けなくなってしまいます(スペースキーでボタンが押されるようになる)。
ボタンオブジェクトにはフォーカスを解除するアクションはありませんが、コンボボックス、エディットオブジェクト、リストオブジェクトなどにある「フォーカスを解除」を実行するとボタンオブジェクトのフォーカス
解除することが出来ます。

 

ちなみに、ボタンオブジェクトという別のオブジェクトのフォーカスまで解除されてしまうことからも判るように、「フォーカスを解除」を実行すると、他のオブジェクトのフォーカスまで解除されてしまう(例:リストオブジェクトにフォーカスがある時にコンボボックスのフォーカスを解除するアクションが実行されるとリストオブジェクトのフォーカスまで解除されしまう)という仕様のようですので注意してください(もしかしたら将来的には修正されるかもしれません)。

MMF2製アプリを(できるだけ)快適に動かす方法

MMF2製アプリケーションを実行して、重い、動作がカクつくなどの場合、以下の方法を実行することで快適になる場合があります。
全て試しても解消しない場合はPCの設定かPCのスペック不足を疑ってください。

 
  • Aeroデスクトップテーマを無効にする(Windows Vista以降対象)
    Windows Vista以降に搭載されているデスクトップテーマのAeroはMMF2と相性が悪く、このテーマに設定したまま実行すると動作がカクつくなど快適に動作しません(PCのスペックが十分であっても)。
    Aero以外のデスクトップテーマに変更することを推奨します。
    デスクトップテーマを変えたくない場合は、exeのプロパティを開き、「互換性」タブにある「デスクトップコンポジョンを無効にする」にチェックを入れて実行してください。アプリケーションが実行されている間だけAeroが無効になります。
     
 
  • 画面の色数をHigh Color(16ビット)に下げる(全OS対象)
    画面の色数をHigh Color(16ビット)に下げて実行することで多少動作が軽くなります。
    但し、HWAバージョンで作成されたアプリは16ビットだとエフェクトなどが正常に表示されなくなるので、True Color(32ビット)で実行してください。
     

MMF2 Devでアプリケーションに付けられるバージョン番号の仕様

MMF2 Devではアプリケーションプロパティでバージョン番号を付けることができます。バージョン番号は、ビルドしたEXEのプロパティのファイルバージョンに表示されます。
ここで設定できるバージョン番号にはいくつかの仕様があります。

  • ドットで区切れる数字の塊は4つまで。
  • 1つの塊の数値の範囲は0~65535。
  • 各数字の先頭に0をつけることはできない。
  • 入力した数字の塊が3つ以下だと、残りの部分には強制的に0が入る。

つまり、"65535.65535.65535.65535"が設定できる最大のバージョン番号、ということになります。

MFAファイルを公開する際の注意点

他人に見てもらう際にMFAファイルを公開することがあると思いますが、注意しなければいけないことがあります。

filepath01.png
アプリケーションをビルドすると書き込まれるビルドファイル名

 

filepath02.png
データエレメンツのバイナリデータや外部ファイルタブに表示されるファイルパス

 

これらのパスは、別のPCでMFAファイルを開いた時にも表示されてしまうため、アプリケーションをビルドした時の場所や、外部ファイルの参照先が、デスクトップなどOSのユーザー名が含まれているパスになっていると、MFAを開いた他のユーザーにOSのユーザー名が知られてしまいます。特にユーザー名を本名にしている人は意図せず名前バレしてしまう恐れがあるので注意してください。

オブジェクトの衝突判定が行われない

大量のオブジェクトが同時に衝突すると判定が行われずにすり抜けてしまう仕様があります。

これはオブジェクトの衝突に関してバッファが設定されており、それが一杯になってしまうとこうなってしまうようです。
フレームプロパティからオブジェクト数の上限を上げることで解消するので発生した場合は上限を上げてみましょう。

透過色の色について

オブジェクトの透過色に指定する色は、色によっては16bitカラーモードで実行した時に透明にならない場合があります。
たとえば、R:1,G:0,B:0を透過色として指定すると、32bitカラーモードで実行すると透明になりますが、16bitカラーモードで実行した時は透明になりません。

透明部分のある画像を利用したい場合の保存形式

透明部分のある画像はMMF2に持ち込むと自動でアルファチャンネルとして変換されますが、
その形式には制限があるようです。各画像ソフトでの透明部分を持ち込める保存形式は下の通りです。

■透明部分を抜いた画像を使いたい場合(内部的には同一のファイルです)

  • Photoshop  PNG 24bitで保存(背景は削除)
  • SAI     PNG 32bpp ARGB(不透明度有り)
  • CLIP STUDIO PNG 表現色 RGBAカラー

■アルファチャンネルを使って透明部分を抜く場合

  • Photoshop TGA (32bit)で保存
    *PNGの32BitやBMP32BitではMMF2にアルファチャンネルは持ち込めません。
    またSAI、CLIP STUDIOはアルファチャンネルを持つことが出来ないので、TGAで保存しても
    使うことが出来ません。

■IllustStudio:PNG(RGBA)は透明画像部分を保持したままでの保存は出来ない。
PSD形式では透明度を持てるようなので、一端、PSD形式で書き出した後、PhotoShopやSAIでPNGやTGAに保存し直す必要有り。

グローバルオブジェクトでの変数・フラグの引継ぎ

グローバルオブジェクトに設定すると変数やフラグをフレーム間で引き継ぐことができますが、
引き継がれるのは、フレーム移動直前に存在していた個数のみとなります。
例えば、フレーム1にグローバルなアクティブオブジェクトが3個、フレーム2に同じオブジェクトが5個あるとします。
フレーム1でオブジェクトの変数を1にしてフレーム2へ移動しても、フレーム2では5個中の2個しか変数が1になっていないということです。

Steam版CF2.5を多重起動する方法

通常Steam版CF2.5はSteamクライアントによって多重起動判定され2つ以上同時に起動することはできません。しかし、以下の方法で多重起動させることができます。

 

CF2.5のファイル選択ダイアログでmfaを右クリックし「開く」または「プログラムから開く」→「Clickteam Fusion 2.5」を選択。

本体のバグ

サブアプリケーション一時停止後のフレーム移動

サブアプリケーションを一時停止後、サブアプリのフレームを移動するというイベントは、エディタ上では動作するが、ビルドしたEXEでは動作しないので注意。
かならずサブアプリケーションの一時停止を解除した上でフレームは移動させましょう。

幽霊オブジェクトにご注意

フレームから完全にオブジェクトを削除する場合、注意があります。
場合によっては、削除して、イベントエディタから消えているにも関わらずフレームエディタの左のリストに永遠に残り続ける「幽霊オブジェクト」と化してしまう可能性があるのです。内容が作り込まれてくると確率が上がるようです。

 

以下はオブジェクトを削除する手順を記録した動画です。
2番目以外は失敗する手順です。3番目の動画では「幽霊オブジェクト」が出来上がっています。
全てにおいて当てはまる訳ではありませんが、参考にしてください。
安心して削除できるようにアップデートされるといいんですけどねぇ。

 

1(MMF2クラッシュ):http://www.youtube.com/watch?v=KrlusPB6TVc
2(削除成功):http://www.youtube.com/watch?v=iE1wRJikI1s
3(幽霊オブジェクト誕生):http://www.youtube.com/watch?v=-a820S0SXJw

 

追記:個人的にやっている対策ですが、「オブジェクト作成」「オブジェクトを発射」のイベントは「フレームイベント」ではなく「オブジェクトイベント」に設定するようにしています。
フレームイベントに「オブジェクト作成」または「オブジェクトを発射」に設定されているオブジェクトは、フレーム上から削除しても左のリストに残り続けるという仕様があります。
通常、イベントから「オブジェクト作成」「オブジェクトを発射」を削除すればリストからは消えるのですが、これが消えずに残ってしまうのが「幽霊オブジェクト」です。
この仕様を利用して、フレーム上のオブジェクトを消してスッキリさせるというのが昔はテクニックとして認知されていました。しかし個人的にはこのフレームイベントがオブジェクトをロックするという仕様が幽霊オブジェクト化の要因になっているのではないかと推測しています。

 

オブジェクトイベントに「オブジェクト作成」「オブジェクトを発射」を設定した場合は、ロックされずフレーム上から削除するとリストからも消えます。ただし、オブジェクトイベントにインポートして設定しているイベントは連動して削除されないので、手動で削除する必要があります。
今の所この方針に変えてからの自分の作品で幽霊オブジェクトは発生していません。

デモ録画機能について

フレームのプロパティにあるデモ録画機能ですが、使い方を誤るとエラーになり、最悪そのフレームが削除されてしまうようです。
こちらで詳しく解説されています

「アクションを制限」条件のバグ

「アクションを制限」条件にはフレームのタイマーが10分55秒を超えると誤動作すると言うバグがあります。
具体的には条件に設定された間隔を無視して毎フレーム実行されるようになってしまいます。
その条件でオブジェクトを作成していたりした場合は、オブジェクトが急に大量作成されるようになるので判るはずです。

移動するオブジェクトの最初のアニメーションシーケンスの終了が検出されない

設定された動作で移動している(またはオブジェクトを発射で撃ち出された)オブジェクトに設定されている最初のアニメーションシーケンスの終了は検出されません。
例えばバウンスボールで移動するオブジェクトの「アニメーション停止が終了」条件を設定しても停止に設定されたアニメーションの終了は検出されません。
ただし、動作の速度が0または停止している場合や発射の速度が0の場合は終了が検出されます。

DirectXモードで実行するとメモリ使用量が異常に増加する

アプリケーションプロパティの「表示モード」「DirectX」に設定して実行すると、オブジェクトが作成されるたびにメモリ使用量が増加するという症状が確認されました。
このモードは使用しないほうがいいと思われます。

 

2014-05-09追記:他のモードでも増加するので、このモード特有の問題ではないようです。

正弦波動作が停止する

sinewave_bug.png
正弦波動作の動作完了時に実行される動作は極端な処理落ちが発生すると動作が停止してしまいます(60フレームのアプリで約30FPS以下になった時)。
フレームプロパティのタイマーベース動作を無効にするとこの症状は発生しません。

V-Syncを有効にするとアプリが正常に終了しない

vsync.png
アプリケーションプロパティのV-Syncオプションを有効にすると、AMD社のグラフィックボード(Radeonシリーズ等)で正常にアプリが終了できない問題が確認されています。
この問題は表示モード「標準」「DirectX」「DirectX + VRAM」の場合に発生します。「Direct3D 9」「Direct3D 8」では発生しません。

 

この問題を回避するには、問題の発生する表示モードではV-Syncを有効にしないでください。

 

2014-05-09追記:「DirectX」「DirectX + VRAM」ではV-SyncをONにしていなくても終了しなくなります。

SWFアプリの仕様

アプリケーションの色数の設定は無意味

アプリのプロパティのグラフィックモードで色数を変更しても意味がないようです。
Flashでは常に24/32bitカラーで実行されるようです。
例として、256色設定でビルドしたSWFアプリにFlash External Filesというエクステンションで外部の画像を表示しても
その画像は256色に減色されず元の色で表示されました。
しかし、当然ですが画像自体の色数が少ないことはファイルサイズの削減には効果があります。

メインの音量とチャンネルの音量の関係

メインの音量が0であってもチャンネルの音量を上げる操作をすると音が聞こえてしまいます。
また、メインの音量を操作するとチャンネルの音量も同時に変更されてしまいます(値はどちらも同じになる)。

IEでのFlashの実行について

IEでSWFアプリを実行すると、動作が処理落ちしている状態では入力に遅延(もしくは入力自体を認識しないのかも)が発生することがあります。
キーを押すとフラグON、キーを離すとフラグOFF、フラグがONの時プレイヤー移動、というイベントを組んだ場合、
キーを離しているのにしばらく動き続けてしまうという症状が確認されました。
Firefox、Opera、Google Chromeなどの他のブラウザではそのようなことは確認されませんでした。

トランジションについて

フレームのトランジションは動作しません。オブジェクトのトランジションは何を設定してもフェードの動作になります。
トランジションと半透明を同時に設定すると、半透明が無効になります。

透明色が見えてしまう

オブジェクトを拡大縮小したり角度を変えたりすると、透明色の部分が薄っすらと見えてしまいます。
これはOSの画面の色数が16bitの場合に目立ちます。32bitではそのようなことはありません。

TGF2,MMF2,MMF2 Devでの機能の違い

通常の製品と同じく、SWFエクスポーターにもMMF2 Developer以外では機能制限があります。
日本語版公式サイトにはSWFの機能の比較は掲載されていないので、本家Clickteamのサイトを参照してください。
http://www.clickteam.com/website/usa/create-games-for-adobe-flash-player.html (Product Comparisons内)

SWFでINIを使用する方法

SWFでINIを利用する場合、データはFlash Playerのローカル記憶領域に記録されます。
よってイベントでファイルパスを指定する必要はありません。
また、そのためデフォルトデータが書かれたINIファイルを同梱するという方法は使えないので注意してください。

Round関数について

小数点以下の数字を四捨五入して整数に変換するRound関数ですが、Flashでは0.5でも切り捨てとなるようです。0.6なら切り上げになります。
SWFエクスポーターのヘルプには浮動小数点演算 は Windows アプリケーションの場合より精度が落ちます。と書いてあるのでこれもその影響によるものかもしれません。
PCランタイムで動かした場合は正常なのにFlashでは問題があるという場合、数式関連であればこの違いも検証してみましょう。

エクステンション関係

エクステンション解説に解説があるものについてはそちらを参照してください。

エクステンションの仕様

Progress Bar objectの色について

Progress Bar objectで色を変更する場合は、Windowsのテーマがクラシックである必要があります。
クラシック以外のテーマだと色を変更しても適用されません。
アプリのプロパティの「ビジュアルテーマを有効に」のチェックを外すと、アプリ内だけビジュアルテーマを無効にすることが出来ます。
これでプログレスバーの色を変える事が出来ます(見た目は地味になりますが)。

PXtone Playerが使えない場合の対応方法

Podunkian氏制作エクステンション「PXtone Player」は、Pixel氏制作の「ピストンコラージュ」で作成されたファイル「.pttune」をMMF2で再生することが出来るエクステンションですが、そのままインストールしてもMMF2のオプジェクトリストに追加されずに使用できない場合があります。
その場合は、「msvcr71.dll」を入手してシステムフォルダ(2000,XPだとsystem32)に入れましょう。これでリストに追加され使用できるようになります(アプリと同じフォルダに置いても良いようです)。
他にも、PXtone Playerを使用しているアプリケーションを実行すると「Cannot load pxPlay.mfx.」などというエラーが出て起動しないことがありますが、これも同様に「msvcr71.dll」の導入で解決します。

 

追記:PXtone Playerに同梱されている「pxtone.dll」は多少古い物らしく、最新のピストンコラージュで作成された一部の曲は再生されないことがあります。その場合は、最新のピストンコラージュに同梱されてるpxtone.dllを持ってきて、MMF2のData→Runtimeフォルダ内の pxtone.dllに上書きしてください。

 

最近のバージョンでは「msvcr71.dll」を同梱する必要は無くなった(?)みたいです。

Global Store Xでは小数点が使えない

MMF2本体の変数およびグローバル変数では小数点以下の値を設定することが出来ますが、多数のグローバル変数・グローバル文字列を扱うことが出来るエクステンションの「Global Store X」ではグローバル変数(Integer)において少数点以下の値を使用することが出来ません。
まあ、標準のグローバル変数がかなりの数扱えるので、あえてこれを使用する必要も無いと思います。

エクステンションのバグ

Joypadオブジェクト使用アプリでの処理落ち

Joypadオブジェクトを使用しているアプリケーションをパッドを接続しているPCで実行すると、初回起動時(PCを起動してからの最初の起動時)に処理落ちを起こしてしまうことがあります。
その場合は、速やかにアプリを終了させます。2回目以降の起動では処理落ちは解消されます。

グローバルイベント・オブジェクトイベントで使用してはいけないエクステンション

Advanced MathCelloSoftkcamath.mfx
Clipboard objectCelloSoftkcclip.mfx
Window Focus objectCellosoftkcfocus.mfx
Input objectCellosoftkcinput.mfx
Mouse objectCellosoftkcmouse.mfx
Popup Message 2 objectCellosoftkcpop.mfx
Timer objectCellosoftkctime.mfx
Tokens objectCellosoftkctoken.mfx
Direction CalculatorP. Williamskcdirect.mfx
 

これらのエクステンションのうち2種類以上をアプリで使用している場合、グローバルイベント・オブジェクトイベントでこれらのオブジェクトを使うと、エラーが発生します。
これはこれらのオブジェクトが全て同じ識別子で作成されているために競合してしまうというバグによるもので、それらを使用したグローバルイベントを開く時には以下の様なエラーダイアログが表示されます。
global_event_error.png
ここで使用しているオブジェクトを正しく選択する必要があるのですが、グローバルイベントで2種類以上使っている場合、MMF2がどの順番で尋ねているか分からないので正しく選択するのは困難です。正しく選択できなかった場合、オブジェクトの内容がそれぞれ入れ替わってしまい、正しく動作しなくなってしまいます。
オブジェクトイベントではこのダイアログは表示されないので確実におかしくなります。
上記のオブジェクトについてはグローバルイベントやオブジェクトイベントで使用するのは避けましょう(アプリ内でこれらのうち1種類しか使用していない場合はそもそも競合は起きないのでグローバルイベント・オブジェクトイベントで使用しても構いません)。

ドローオブジェクトの数式のバグ

ドローオブジェクトの数式のうち、文字列を返すもの(関数名の末尾が $ のもの)は数式を使用するとアプリケーションが強制終了します。

コメント

  • デモ録画機能は自分もフレームが破壊されて泣きをみました。別名で保存しておかないとやヴぁいですね。 -- 2010-04-11 (日) 23:08:10
  • 自分も知らずにボタンをポチして死にました。フレームどころか -- kousaku? 2010-04-13 (火) 00:41:02
  • 間違って改行してしまった・・・アプリケーションそのものが破壊されたです。一応バックアップ(2週間くらい前の)があったから復元は出来たけどorz -- kousaku? 2010-04-13 (火) 00:43:05
  • 弾丸オブジェクトでも速度が0ならばアニメ終了が効くんですね!! -- kousaku? 2010-10-15 (金) 23:02:10
  • 更新:「MMF2製アプリを(できるだけ)快適に動かす方法」を追加 -- 2012-01-23 (月) 00:40:05
  • 更新:「DirectXモードで実行するとメモリ使用量が異常に増加する」を追加 -- 2012-07-27 (金) 00:36:31
  • 更新:「Round関数について」を追加 -- 2012-08-14 (火) 22:39:56
  • 誤字を修正 -- 2013-06-11 (火) 18:25:00
  • プレイヤー2以降は、フレーム内に入力で直接動作するオブジェクトがないと認識されないようです。 -- 2014-03-06 (木) 10:36:18
  • アクティブピクチャーのホットスポットを変更すると衝突判定がおかしくなります -- 2014-03-13 (木) 00:48:09