Tips : ProcessingでWindows 64 bit 用Screensaverを作成する方法

Processingの作品をScreensaverにする方法を試行錯誤してみました。

Screensaverにするために①

まず、Screensaverにするためにexit()を追加します。

void mousePressed() {
    exit();
}

void keyPressed() {
    exit();
}

これで、キー押下もしくはマウスクリックでアプリを抜けられるようになります。

なぜmouseMoved()で抜けないのかというと、WindowsアプリにExportすると最初の起動はいいのですが、2回目以降から起動と同時にアプリ終了してしまう現象が発生するためです。 所有する2台のWindows 7で共に同様の現象だったので、Processing生成によるWindowsアプリに依存した挙動のようです。

ちなみにログを仕込んで回避方法も検討したので、mouseMoved()で抜けたい人は下記の方法で実装できます。
といってもたいした話ではなくて、

int cnt = 0;
void mouseMoved() {
    cnt++;
    if (cnt > 10) {
        exit();
    }
}

こんな感じで、数回mouseMoved()がCallされたらexit()するようにすればいいだけです。 ログを入れてExportしてみたところ、どうも起動時にランダムに数回mouseMoved()が発行されていることがわかったので、ある程度マウスが動いたら抜けるようにすることで回避できました。

Screensaverにするために②

もしvlwファイルなど、リソースを利用している場合は/data以下にもう一階層ディレクトリを掘っておきます。 たとえば、/data/application_nameなど、アプリを識別できる名前がいいと思います。理由は最後に記載してあります。

WindowsアプリのExport

ProcessingにはWindowsアプリとしてExportする機能がIDEについていますが、windows 64bit向けのExportはexeファイルではなくて、batファイルになっています。

f:id:tomoyukim:20140319222400p:plain

batファイルを開くと、下記のように出力されていて実体はlib以下にあることがわかります。

@echo off
java -Djava.ext.dirs=lib -Djava.library.path=lib filament

Screensaverとして後ほどインストールするときに他のアプリとコンフリクトしないよう、ここでも一部書き換えをします。

f:id:tomoyukim:20140319223103p:plain

ここでは適当にアプリ名+libにしました。
そして、batファイルの中身もそれに対応するよう書き換えます。

@echo off
java -Djava.ext.dirs=filamentlib -Djava.library.path=filamentlib filament

これで、準備ができました。

scrファイル (exeファイル) を作成

そして、scrファイルを作成します。scrファイルはWindowsアプリケーションのexeファイルの拡張子を変更しただけなので、exeファイルが作れれば作成できます。
こちらのサイトにbatファイルをexeファイルに変換するオンラインアプリが公開されていましたので、利用させていただきました。

先ほど作ったbatファイルをこのアプリでexeファイルに変換してDLします。 これでScreensaverが完成しました。最後にインストールです。

Windowsにインストールする

下記がアプリとして1セットなので、これをC¥windows¥sysWOW64以下に配置します。

  • /data以下
  • /lib以下
  • scrファイル

ここで、最初にdata以下にアプリ独自名でディレクトリを切った効果があります。

もし既に/data を利用するアプリが配置されていた場合、/data 直下にファイルを置いていると他のアプリリソースとコンフリクトする可能性があるので、もう一段階層を掘っておくことで/data以下がアプリ毎に分かれるのでコンフリクトを防ぐことができます。

また、/libの名前も変えておくことで他のアプリとの競合を防ぎ、どのアプリに関するディレクトリなのかを識別できるようにしています。

あとは、スクリーンセーバーの設定画面でアプリを選択するだけです。 これでWindows 64bit向けスクリーンセーバーを作成、配布することができると思います。