Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ご注文はライブラリですか?

2,955 views

Published on

2014/8/24の京都マイクラもぢんぐ会で発表したスライド

  • Be the first to comment

  • Be the first to like this

ご注文はライブラリですか?

  1. 1. 俺九番 @orekyuu
  2. 2. 自己紹介 • 俺九番です。 • 以前は石炭MODと幼女MOD作ってました。not ロリコン • 最近は公開してないけどBukkitプラグインが中心。
  3. 3. 今日する話 • 最近製作中のライブラリ「RabbitHouse」の概要 • RabbitHouse内部の実装の話 • RabbitHouseでアイテムを作るデモ • スクリプトでGUIをこねる話
  4. 4. 合同モド 日本ではいくつか合同MODを作る企画ができては消えていった 僕も挑戦して失敗した経験あり ・例 ed◯craft ケ◯Craft 料理M◯D ←僕が失敗したやつ
  5. 5. 失敗の原因 • アイデアは出るけど実装する人が少ない →プログラム出来ない人も参加できるようにすればええんちゃう?
  6. 6. RabbitHouse 今はBlockやItemをツールを使って製作できるのが主な機能 独自の動きはプログラマが用意する。 ・対象 合同MOD 中規模以上のMOD ・効能 開発の進捗がぴょんぴょんします。
  7. 7. どんなツールを作るか • ソースコードの生成 →コンパイル必要なのでプログラム書けない人には難しい。 変更はプログラマしか出来ない。 • データファイルを読み込んで使う →実行時にロードして使うことが可能。 ファイルの入れ替えで対応可能なので、開発環境整える必要なし。
  8. 8. データ形式 { “blocks” : [ { “name” : “ExampleBlock”, “resource” : “IconName.png” } ] }
  9. 9. ロード処理 class MyBlocks { @BlockField(name = “TestBlock”) public static Block testBlock; } BlockLoader loader = new BlockLoader(new MyBlocks(), “MODID”); loader.load(); loadメソッドのタイミングで、変数にインスタンスが入る。
  10. 10. 独自の機能をもつ classパラメータの指定があった場合は、指定されたクラスを使用して インスタンスを生成する。
  11. 11. 内部の実装 1.Gsonを使ってJsonをロード 2.classパラメータが存在すれば、Class.forNameでClassクラスのインスタンス を取ってインスタンス化。なければ普通にnewして作る。 3.パラメータを設定していく。 4.BlockLoaderのコンストラクタから受け取ったインスタンスからgetClassして、 getDeclaredFieldsでFieldの配列を取る。 5.FieldにBlockFieldアノテーションがついていれば手順2で作ったインスタン スをsetする リフレクション結構使ってるけど、MODのロード時の処理のため、速度が遅 くても問題なし。
  12. 12. フォーマットのミスに対処する ロード時に不正なパラメータが見つかればBlockDataFormatException を発生させてプログラムを終了するようにしている。 フォーマットが間違っていた時点で正常に動かない可能性が高いから、 見つけたら即終了。
  13. 13. デモ • 村人を殴るとゾンビになるアイテムを作ってみる
  14. 14. 今後の課題 • 自由度が低いし、まださほど便利に感じない • json吐き出すツールまだ作ってない • プログラマ向けの機能も用意しなければ・・・ ↑ここの話するよ
  15. 15. スクリプトでGUI マインクラフトを起動したままGUIのレイアウトを変更する。 某ロリコンホモ氏と通話してる時にアイデアを頂きました
  16. 16. 某ロリコンホモ曰く スクリプトマジ便利だよ GUIとかで使うと捗る アナルソイヤ
  17. 17. ロリコンホモはさておきやってみる
  18. 18. スクリプト言語の選択 • JRuby • Jython • JavaScript
  19. 19. GUIをJavaScriptで描画できるようにする • javax.scriptパッケージのJavaScriptエンジンを使う。 • Java7まではMozila Rhinoが搭載されている。 • Java8だとNashornが搭載されて、かなり早いらしいので使いたかった けど、まだ対応してないから仕方がない・・・。
  20. 20. JavaScriptエンジンの使い方 //JavaScriptのエンジンを作成 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName(“js”);
  21. 21. JavaScriptファイルを読み込む evalメソッドでReaderを渡して読み込む。 デバッグ中は必ず絶対パスで渡すこと。 //デバッグ中 engine.eval(new FileReader(“jsの絶対パス”)); //配布時 InputStream is = getClass().getResourceAsStream(“hoge.js”); engine.eval(new InputStreamReader(is));
  22. 22. jsのメソッド呼び出し ScriptEngineをInvocableでキャストし、invokeFunctionで呼び出す //jsのdrawForeground呼び出し invocable.invokeFunction("drawForeground", xSize, ySize, width, height, this, fontRendererObj);
  23. 23. JavaScriptからJavaのオブジェクトを生成 //import文に相当 importPackage(net.minecraft.util); //オブジェクト作成 var resource = new ResourceLocation(“hoge.png”);
  24. 24. バインド Java側のスコープをバインドします。 //バインドオブジェクトを作成 Bindings bindings = new SimpleBindings(); //第二引数の値が第一引数の変数名でJS側から使用できる bindings.put(“js側の変数名”, 値); //スコープを指定してバインド engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
  25. 25. 読み込むタイミング • GUIを開くごとに読み込みなおしても今のところ問題なかった。 • 開く時に固まるとかはない。 • 変更を反映するにはGUI開き直しでOK • ファイル変更通知を受け取ってリロードとか、一定時間ごとにすると マイクラの状態みながら編集できるし楽そう!
  26. 26. デモ
  27. 27. スクリプトの使い所 • GUIのような微調整が必要なもの。 • トライアンドエラーが多い場所。 速度がやっぱり遅いので、速度が求められるような所では使えない
  28. 28. まとめ • 簡単な単純作業はRabbitHouse使って別の人に任せる。 • GUIとかはスクリプト使って楽に作る。 • スクリプト使った処理はRabbitHouseに将来入れる予定。
  29. 29. おしまい

×