質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

1246閲覧

Processingでライブラリを利用する際に初期化する理由がわからない

Nakajima_Taichi

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

0クリップ

投稿2021/09/30 02:44

質問の背景

Processingでプログラミングをしている中で、Fisicaという物理シミュレーションができるライブラリを利用しています。
その中で、ライブラリを初期化する処理が必要なのですが、その理由がわからずひっかかっています

質問詳細

fisica
http://www.ricardmarxer.com/fisica/

その中で、Fisica.init(this)という形でインポートしたライブラリを初期化する部分があります。

Processing

1import fisica.*; //Fisicaのライブラリインポート 2FWorld world; //FWorldの宣言 3 4 5void setup(){ 6 size(800, 600); 7 frameRate(60); 8 Fisica.init(this);//Fisicaを初期化 9 world = new FWorld();//FWorldを初期化する 10 world.setEdges();//上下左右に壁を生成する 11}

なぜ、ライブラリをインポートした際に、初期化が必要なのでしょうか?
ライブラリはインポートされたタイミングによって初期化しないと何かが変わってしまう可能性があるのでしょうか?

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

その中で、ライブラリを初期化する処理が必要なのですが、その理由がわからずひっかかっています

そのためにはProcessingの仕組みを知る必要があります。

Processingのコードを書く場合、通常ひとつあるいは数個のタブ(.pde)を書きますね?
これは最終的には(スケッチ名)クラスにまとめられます(.javaのタブに書いたクラスは別)

Java

1class スケッチ名 extends PApplet { 2 // すべての .pde は、ココの中に書いていることになる 3}

そのためスケッチ名と同名のクラスを作ると怒られます。

The class "スケッチ名" cannot have the same name as your sketch or its enclosing class

(一見グローバル変数のように見える)自分で定義した変数やprintln()等の組み込み関数は、実はクラスのフィールドとメソッドだったのです。

.javaのタブに書いたクラスやライブラリのクラスは、PAppletとは無関係のためそのままでは組み込み関数が軒並み使えません。
そのため初回にthisPApplet)を渡してもらい、それ経由で組み込み関数を呼び出せるような作りになっているライブラリが多いです。
あとは本当に何か初期化処理が必要な場合もあるでしょう。

なぜ、ライブラリをインポートした際に、初期化が必要なのでしょうか?

インポートとは直接関係ありません(詳しくは「java import」でggってください)

例えばProcessingに用意されていないより高度な数学の関数を提供するライブラリ(そういうのがあるのかは知りませんが)とか、組み込み関数を使わない(PAppletが必要ない)ライブラリであれば初期化処理はいらないはずです。

ライブラリはインポートされたタイミングによって初期化しないと何かが変わってしまう可能性があるのでしょうか?

fisicaの場合はFisica.init(this)しないと、Fisica$LibraryNotInitializedExceptionが出ます。
そもそも動かなくなってしまいます。


よほど高度なことをしたいと思わない限りPAppletが出てくることはまずないのですが、もっと詳しく知りたくなったらソースコードを眺めてみるといいです^^

fisica/Fisica.java at master · rikrd/fisica

processing4/PApplet.java at master · processing/processing4

投稿2021/09/30 09:13

編集2023/07/29 06:28
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nakajima_Taichi

2021/10/02 11:43

ありがとうございます! タブが大きなクラスを実は作っている話や、javaとの関係もイメージが湧きました。 自分でもソースコード読んでみます。
guest

0

TN8001 さんが既に回答されていますが、Processing の PApplet をライブラリに渡して紐づけしているようですね。それと画面の単位と物理演算の単位のスケール設定も行っているようです。初期値としては20ピクセルを1メートルとなるような設定になっているようです。

ライブラリにソースが付いていたので興味があれば中身を覗いてみて下さい。
http://www.ricardmarxer.com/fisica/download/fisica.zip

fisica/src/fisica/Fisica.java

java

1 /** 2 * Initialize the library. Must be called before any use of the library. Must be called by passing the PApplet. e.g. {@code Fisica.init(this)} 3 * 4 * @param applet The applet on which to use the library. This library can only be used with one applet 5 */ 6 public static void init(PApplet applet){ 7 m_parent = applet; 8 m_initialized = true; 9 10 m_viewport = new FViewport(); 11 m_viewport.setScaleTransform(20); 12 } 13

投稿2021/09/30 19:10

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nakajima_Taichi

2021/10/01 09:41

ご回答ありがとうございます。一度自分で該当箇所のソースコードを読んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問