libGDX触ってる
なんかやることコロコロ変わってる感あるの、ほんとアレ…。 あんまり時間が無いので、メモ程度にまとめておく。。
libGDX
- Javaでマルチプラットフォーム対応なゲーム開発ができるツール
- Ingressも使ってるらしいので、導入事案もなかなか強力。
- クロスプラットフォームで、主要プラットフォームでの動作は可能ぽい。
- iOSではRoboVMっていうVM上でバイトコード動かすことで、動作を実現させてるらしい。
- IngressのCOMM開くとフリーズ場合があるのはその辺関係あるのかな?
- Gradleビルドに対応してて、Eclipse, IntelliJ IDEA, NetBeans で開発できるらしい。
- ちなみに僕はIntelliJでやってます
手の付け方みたいなの
あ、今触って見てるのは2D系です。
僕はゲーム制作ちゃんとやったことなくて、触ったことあるのは吉里吉里とNScripterくらい。ほとんどノベルゲーに特化したもので、ゲーム制作という程のものは使ったことなかった。Spriteとか名前しか聞いたこと無いよみたいな。iOS7でSpriteKitってでましたね。 なので、今はすごいコード書いては消してみたいなの繰り返してます。
現段階で、手をつけるキーワード的なのは以下。すごい雑多…
- 2Dでクロスプラットフォーム目指すのであれば、Scene2Dを基本使うのが良い
- ttfフォントを使用する場合は FreeTypeFontGenerator を利用する。
- ただ、初期化の段階で、利用する文字を列挙しておかないといけないっぽい感じ。僕はシナリオファイル的なのを作って、そこから文字をユニークに抽出し、テキストファイルにまとめるスクリプトを作った。
- BMFontっていうのもあって、libGDXの解説動画ではこれをつかってた。僕は上記でなんとかなったのでまだ使ってない
- BMFont以外にもいろいろあるっぽい: Hiero · libgdx/libgdx Wiki · GitHub
- 画面サイズは
Gdx.graphics.getWidth()
とかでとれる。わりと欲しくなる - Androidの 9-patch の仕組みがlibGDXにあり、利用可能。 Ninepatchesを参照。多解像度対応のゲーム作るのであればチェックしておいたほうが良い。
- 画像は1つずつ
Texture
にするのは、速度的にネックになってくるのでTextureAtlas
を利用する。 - RPGのフィールドマップみたいなの作りたい場合は、TiledMap とか使用するといけるらしい。
- データの簡単な保存は、簡易KVSである
Preferences
が使える。- libGDX入門 その05 ゲームデータの保存|ざる魂 がソースコードもあって良い
- desktop向けも考慮する場合、Preferenceの保存場所は、他のゲームも共通らしいので、プリファレンスの名前はパッケージ名入れておいたほうがいい。情報元:libgdxメモ
- キーボードの入力は、
if (Gdx.input.isKeyPressed(Input.Keys.ENTER))
みたいなので判定できる - クリック判定は、
Actor
へ#addListener(ClickListener)
を実装すればいける - 画面遷移時の、全体の部品のフェードアウトとか実装したい場合、Scene2Dだと
Stage
上に登録している要素全部をフェードアウトさせることで対応できそう。
Group root = stage.getRoot(); SequenceAction sequence = Actions.sequence(); sequence.addAction(Actions.fadeOut(1.f)); sequence.addAction(Actions.run(new Runnable() { @Override public void run() { // フェードアウト完了時 } })); root.addAction(sequence);
- リソース名散らからないようにしておいたほうが良いと思う。
#!/usr/bin/env bash # Print Header ########################################################### cat <<_EOT_ package myapp; /** * AUTO-GENERATED: `date +"%Y-%m-%d %H:%M:%S"` */ public interface RDef { _EOT_ # Print General data ########################################################### cd "./assets" echo " // Files" for rawPath in `find . |grep -v ".DS_Store" |grep -v "^./atlas/"` do if [ -f $rawPath ]; then filename=${rawPath##*/} filenameNoExt=${filename%.*} ext=${filename##*.} path=${rawPath%/*} extension=${rawPath##*.} pathNoDot=${path:2} variable=`echo "$pathNoDot/${filenameNoExt}" |tr '[a-z/\-]' '[A-Z__]'` echo " String $variable = \"$rawPath\";" fi done # print footer ########################################################### cat <<_EOT_ } _EOT_
以下のように生成される。
package myapp; /** * AUTO-GENERATED: 2015-04-14 00:09:15 */ public interface RDef { // Files String BGM_BGM = "./bgm/bgm.ogg"; String FONTS_YASASHISA = "./fonts/yasashisa.ttf"; String IMG_CHARACTERS_BOY_RAKU = "./img/characters/boy/raku.png"; }
- MicrosoftのXNAもちょいちょい引っかかる時がある。Frameworkとしては似たようなところがある(SpriteBatchとか)みたいなので、コードの組み方とかクラスの設計とかは参考になるかもしれないです
- Music/soundは未調査
よく分からないところ
- 画面遷移どうするのがベストなのかなぁというところ。
Screen
インターフェースやScene2DのStage
がキーワードになる感じだけど、どうするのがやりやすいのかまだ試行錯誤中。 libGDX入門 その04 画面遷移|ざる魂にも解説ある Stage
をdisposeするのはいいけど、なんかサンプルとか見てるとTexture#dispose
してないんじゃね?みたいなところがある。してなくて平気なのか、それとも解説のために省いてるのか、忘れているのか、よく分からない。。自分で確かめてみないといけないかなあ- 文章を一文字ずつ表示していくのどう実装するのが良いのかな。。今のところ
Actor
につけれるActions
という仕組みを使ってできないか見てるところ。なるべくScene2DのAPIを使って実装したい。速度とかも変更しやすくしたい。
参考ドキュメント
以下のドキュメントがすごい参考になってる
- 公式ドキュメント
- LibGDX Tutorial 9: Scene2D Part 1
- 1ページ目 - shinsan68kの投稿 - Qiita
- libGDX入門 その01 画像を表示したり音を鳴らしたり|ざる魂
- あとdesktop環境で実行するとき、多分Run Configurationで以下は一度ハマると思う
- libgdxメモ
- Androidに関して詳しい。僕はdesktop向けで今のところやってるのでまだちゃんと見てない。。
- libGDX関連情報まとめ 2014/4/19 (Androidで2Dゲーム) - Qiita
- 僕と同じような手探りの記事。実装サンプルとか
- libgdx/libgdx-demo-superjumper · GitHub
- 公式サンプル!これは勉強になる
ゲーム作れるようになりたいなあ。がんばるんば。
- (2015-04-25 LibGDX -> libGDXに表記変更)
- (2015-04-30 BitmapFontについて、BMFont以外の選択肢書いてるところ追加)
TypeScript触った
所感
- すごい手触りが良い。JavaScript好きだったらそこまで勉強しなくてもなんでも書けるような気がしてくる
- まだちょっとしか触ってなくて文法あんまりだけど、Java+JavaScript+ES4=TypeScript な感じ。TypeScriptのmoduleもJavaScriptのmodule触ってないからかもしれないけど。
- タスクランナー系は必須(gruntとか)。てか少なくともaltJS使う場合は全部そうか。。
- 出力されるソースがきれいって聞いてたけど本当。(これはCoffeeScriptもだけど)
- 型安全にする仕組みはすごい整備されてる(DefinitelyTyped/tsd, DefinitelyTyped/grunt-tsd)。
- 自分で勉強した内容とかは 自分のGitHubに置いていってる。まだあんまり無い
選んだ理由
どれかには手を出そうと思いながら、結婚したのもあって、全然時間とれてなくて。ようやくちょっと落ち着いてきたので、一番気になっていたTypeScriptに手を出した。 なんでこれを選んだのかというと、静的型付け魅力的だったのと、JavaScriptに類似していて学習コストが低そうだったことが理由。
僕はFlash/ActionScript3が青春だった
ので、一度はHaxe使おうと思っていたけど(参考:altJS勉強会「Haxeすごいからみんな使え!」)、僕はES4が好きではなかったのと、 package
とか import
がどうも受け入れられなかった。IDE整備されまくったJavaだと良いんだけれど。あと、
以前PHPのnamespaceが良いらしいから使ったら、SPL autoloadの仕組みがかっちりしすぎてて辛い目にあったこともトラウマなのです。柔軟なWebには合わないと思ってしまった。
WebはJavaScriptのように柔軟だからいろんなブラウザがでてもなんとか緩衝してこれたと思ってます。緩衝しなかったほうがまだよかったとか言えたほうがよかったとかもあると思うけれど、それよりも僕は、こうして共通プラットフォームが整備されてきたのは嬉しく思ってます。
JSXは、出た時すげえ!ってなったけど、僕はゲームはまだそんなに作ってなかったのとメンテナンス考えると辛いだろうなっていうことで、据え置きだった。流行ったら使おうかなという感じ。
Coffee Scriptは、そこまで魅力感じなかった。altJSって名前がなかった頃から出てたのもあって、「最終的にJavaScriptにになる」「C/C#/Java/JavaScriptとかしか見てこなかったペーペーなので空白開きすぎてるの変な感じがする」「コンパイルめんどくさ」みたいな今でいうと意味不明理論と、「JavaScriptの知識が結局必要になる」「文法ちょっと覚えるのめんどくさそう」っていう考えがいろいろ交錯して、「JavaScriptもっと詳しくなって綺麗にコードかけるようになろう」みたいになったので選ばなかった。
まあ結局のところJavaScriptが好きだったんだと思う。
今後
もっと勉強しようと思います!!!!!!!!!!!!!!! わかめさんプルリク捌きがんばって!!!!!
あとどうでもいいけどpackage.jsonやらbower.jsonやらtsd.jsonやらGruntfile.jsonやら作るのめんどくさい。コマンドラインが大体npmベースなのが救い。Yeomanとかwebpackとか使ったこと無いんだけどそういう環境の整備ってかなり助けてくれるんだろうか…よくわかってない…
Mac OS XにTmux powerline入れた
会社のパソコン新しいの使うようになったのでターミナルもかっこよくしたくなったので!
例によって Homebrew
は入ってること前提です。
Powerlineのインストール
$ brew install python $ pip install git+git://github.com/Lokaltog/powerline
Installation on OS X — Powerline beta documentation あたりに書いてあります。
powerline/fonts のインストール
$ git clone https://github.com/powerline/fonts.git
$ cd fonts
$ ./install.sh
上記でOK、次にターミナルで利用するフォントを変更。 僕はiTerm使ってるので以下の様な感じ。
Source Code Pro for Powerline
を選択すればおkです。
Tmux statusline のインストール
Tmux statuslineのページを見ると、tmuxの設定ファイル( ~/.tmux.conf
)へ、 source "{repository_root}/powerline/bindings/tmux/powerline.conf"
を追加すれば良いみたいに書いてる。
以下を実行して、powerlineのインストール先を調べて、
$ pip show powerline-status --- Name: powerline-status Version: dev-4b4964013be7f5205382b4a0a8595e2e0df19eb7 Location: /usr/local/lib/python2.7/site-packages Requires:
{repository_root}
を、 Location:
のところに出たパスで置き換えた文字列を、 .tmux.conf
へ追記。
$ echo 'source "/usr/local/lib/python2.7/site-packages/powerline/bindings/tmux/powerline.conf"' >> .tmux.conf
あと、なんか以下のパッケージもないとtmux起動した時にエラー出るので入れる。
$ pip install psutil
起動!
$ tmux
かっこいい!!ステキ!!
会社で、Mac→Macへデータをrsyncで移行してたんだけど
モノとしてrsync使うとデータ移行楽なの知ってたんですけど、社内PCのデータ移行として利用するの初めてでビクビクしてたけど、とっても便利でした!ファイルのパーミッションもそのままで同期してくれるのが最高に良い。ほとんど元のまま次のPCでも使える。
なんかいくつか思った点があったので、日記にかいとく。
Thunderbirdのデータ移行の例
メーラーはThunderbird使ってるけど、公式のバックアップ方法を見るとプロファイルのフォルダをそのまま移行すれば新しいPCでもそのまま利用できそうでした。ああ、じゃあここでrsync使えるかなと思ったので、下記でプロファイルのデータ送って、
$ rsync -av /Users/from/Library/Thunderbird/Profiles/ to@192.168.xxx.xxx:/Users/to/Library/Thunderbird/Profiles/
そいで、一度新しいPCでThnderbirdを開く→閉じるってして、公式の復元方法見ながらプロファイルのフォルダ名を合わせたら全部移行完了でした。 移行に際して、空いてるハードディスクとかなかったし、パーミッション関係心配だったので、すごい便利でした。
半角空白がパスにあると変な場所に送られた
ただちょっとハマったこと。 以下のコマンド使ってFirefoxのプロファイルを送ってたんだけど、なんか一発で指定したパスへ配置してくれなかった。
$ rsync -av /Users/from/Library/Application\ Support/Firefox/Profiles/ to@192.168.xxx.xxx:/Users/to/Library/Application Support/Firefox/Profiles/
上記でファイル送れるんだけど、実際には /Users/to/Library/Application/
へデータが送られた。パスを"
(ダブルクォート)で囲んでもダメ。回避する方法あるのかな?
最後は手動でプロファイルフォルダ移動させました。
あとrsync全然関係ないけど古い資料のアーカイブ
僕は全部、お仕事のディレクトリの階層って、 /path/to/work/<お客さんのとこの名前>/<案件の名前>/<いろんなファイル>
ってしてるんです。分かりやすいので。
ただ、終わった案件のファイルって大抵使わなくて、でも捨てるとあとあと面倒なことになるので、アーカイブにしておこうと思いました。
ただ、案件のフォルダがまためちゃめちゃ多いので、 /path/to/work/
に以下のシェルスクリプト作って実行、一括アーカイブしました。
#!/usr/bin/env bash echo "Start archive..." for comp in `ls` do echo if [ ! -d $comp ]; then echo "$comp is a file. Skip." continue fi echo "$comp" cd $comp for targetDir in `ls` do if [ ! -d $targetDir ]; then echo "$targetDir is not a directory. Skip." continue fi if [ -e $targetDir.tar.gz ]; then echo "$targetDir is already compressed. Skip." continue fi echo -n "Start compress $targetDir ..." tar zcf $targetDir.tar.gz $targetDir rm -rf $targetDir echo "Compressed." done echo echo "Finished $comp." cd ../ done
載せるほどじゃないんですけどね…なんにせようまくアーカイブできてよかった。
今年はあまり各方面で顔を出さなかったけれど、ぼちぼちやってるので、また来年はアウトプット増やせるように頑張るます。
iOS Simulatorからの通信にてmitmproxyを通す方法
mitmproxyご存知無い方は iPhone - iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法 - Qiita が詳しいと思います。
ADVTrustStoreのインストール
mitmproxy 0.10 - IOS Simulatorに書いてある通りにインストール。
$ git clone https://github.com/ADVTOOLS/ADVTrustStore.git $ cd ADVTrustStore $ ./iosCertTrustManager.py -a ~/.mitmproxy/mitmproxy-ca-cert.pem subject= CN = mitmproxy, O = mitmproxy Import certificate to iPhone/iPad simulator v6.1 [y/N] y Importing to /Users/esperia/Library/Application Support/iPhone Simulator/6.1/Library/Keychains/TrustStore.sqlite3 Certificate added Import certificate to iPhone/iPad simulator v7.1 [y/N] y Importing to /Users/esperia/Library/Application Support/iPhone Simulator/7.1/Library/Keychains/TrustStore.sqlite3 Certificate added Import certificate to iPhone/iPad simulator v7.1-64 [y/N] y Importing to /Users/esperia/Library/Application Support/iPhone Simulator/7.1-64/Library/Keychains/TrustStore.sqlite3 Certificate added
ネットワーク環境設定より、プロキシを設定
Macのネットワーク設定を起動。
プロキシタブから、Webプロキシを設定。
mitmproxy起動
$ mitmproxy -p 8080