2012/05/16

【Processing】eclipse上での開発でフルスクリーンを行うためのだいたい3つぐらいの方法

■まえおき
Processing(1.5.1)は自前でIDEを持っており、ソースコードの拡張子はpdeです。
中身はJavaなのですが、電子アートやビジュアルデザインを目的に作られたこともあり、簡単にコーディングできる反面、あまりJavaらしい開発(?)ができないと感じています。

そこで、私はPAppletを継承してeclipse上で開発しています。その方法はgoogleで検索すればでてきますので割愛しますが、要点を3つ挙げます。
  1. processing-1.5.1/lib/core.jarをライブラリに読み込む(その他必要がなれば追加する)
  2. PAppletを継承する
  3. 実行はJava アプレットで起動する
■本題 
さて、Processingで開発したものをフルスクリーンで表示したいとき、ProcessingのIDEでは「Sketch」メニュー>「Present」でフルスクリーンで表示することができる(*1)。また、ライブラリとして個人の人が開発したAPIが提供されている。
FullScreen API For Processing

このライブラリは
processing-1.5.1\modes\java\libraries
に配置する。
ライブラリの設定は、Javaプロジェクトを右クリック>プロパティでプロパティを開き、Java のビルド・パスを選択し、ライブラリー>外部 Jar の追加ボタンをクリックし、さきほど配置したライブラリを選択し、OKボタンを押すと追加できる。

以上のステップでfullscreenのAPIが利用できるようになるので、さっそくサンプルと同じように記述してみる。

import fullscreen.*;

FullScreen fullScreen;  @Override
  public void setup(){
    size(640, 480);
 
  frameRate(5);

 
  // Create the fullscreen object
 
  fullScreen = new FullScreen(this); ・・・(*2) 
 
  // enter fullscreen mode
 
  fullScreen.enter();
}


  @Override
  public void draw() {

    // 省略
  }


さて、Java アプレットとして起動すると、(残念なことに)以下のエラーが出る。

Exception in thread "Animation Thread" java.lang.NullPointerException
    at fullscreen.FullScreen.(FullScreen.java:93)
    at fullscreen.FullScreen.(FullScreen.java:108)
    at jp.sample.fullscreen.SampleFullScreen.setup(SampleFullScreen.java:17)
    at processing.core.PApplet.handleDraw(Unknown Source)
    at processing.core.PApplet.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:662)


(*2)で FullScreenのインスタンスを作成している際、FullScreen.javainitメソッドjava.lang.NullPointerException が発生している。

public FullScreen( PApplet dad ){{
  this( dad, 0 );・・・(108行目)
}

public FullScreen( final PApplet dad, int screenNr ){
    super( dad );
    this.dad = dad;
    // 一部省略

    fsFrame = new Frame( dad.frame == null? "":dad.frame.getTitle() );
    fsFrame.setTitle( dad.frame.getTitle() ); ・・・(93行目)
    // 以下省略
}


この93行目のdad.frame.getTitle()java.lang.NullPointerException が発生している。正確には dad.frame がnull である。

この java.lang.NullPointerException が発生しないようにする対策はぱっと思いつくもので2つあると思う。
  1. dad.frame にインスタンスを与える
  2. 93行目を削除し、自分でFullScreenのAPIを再ビルド、fullscreen.jarを作成する(未検証)
 1の方法は実際にやってみてある程度の成果が挙がっている。2に関しては予想した範囲でやり方をまとめる。

■1. dad.frame にインスタンスを与える
(*2) で FullScreen のインスタンスを作成する前に、以下のプログラムを1行追加する

this.frame = new Frame( "" );// ""には文字列を入れてもよい

これで93行目で null ではない(dad は this を参照している)のでエラーが発生しなくなり、フルスクリーンすることができる。
しかし、新しいフレーム ができる・・・ようは2つのウィンドウが起動している状態になるので少しスマートではないのが惜しむところ。動作自体は特に問題はないと思う。

もしかしたら、最初に立ち上がるウィンドウを this.frame に与えればよいかもしれない。


■2. 93行目を削除し、自分でFullScreenのAPIを再ビルド、fullscreen.jarを作成する(未検証)
93行目の行っていることは、フルスクリーンのフレームのタイトルに名前をつけるだけであり、また92行目でタイトルを設定しているので余分な処理である。

FullScreen APIのソースコードは配布されているので、ソースコードをダウンロードし、93行目を削除して再ビルドを行い、fullscreen.jarを作成することで java.lang.NullPointerException は発生しないと推測している。


以上、いずれかの方法でeclipse上でProcessingの開発を行ってもフルスクリーン化することができる。
これでまとめを終わりたいところであるが、その他の方法もあるので少しだけ触れたい。


■3. その他の方法
さて、ここで(*1)を思い出してほしい。ProcessingのIDEは「Present」で fullscreen.jar を使うことなくフルスクリーンを行っている。
したがって、「Present」で行っていることと同じようなアプローチをすればフルスクリーンできることが推測できる。

processing.core.PApplet.java,  processing.mode.java.JavaEditor.java, processing.mode.java.PresentMode.java

などのソースをおっかけてみると良いと思う。
もしくは、自前でフルスクリーンを実装する。以下のサイトを参考にすると良さそう。
フルスクリーンモード  - 人工知能に関する断創録

Processingのソースを解析してみると、上のサイトと同じようなことをやっている(当たり前と言えば当たり前だが)。


■まとめ
1の方法が手軽です。


0 件のコメント:

コメントを投稿