2014-05-09

OpenFlを使ってみる

NMEからOpenFlになってずいぶん経ちますが、久しぶりに使ってみようと思いました。

OpenFlの使い方

インストール

OpenFlのサイト 右上にあるDownloadを選択して指示に従ってインストールすればOK。
Haxe、Lime、OpenFLの順にインストールする。

直接ダウンロードするのはhaxeのインストーラだけ。後はhaxelib経由でダウンロード&インストールできる。

プロジェクトの作成

lime.bat create openfl:project ExampleProject

ExampleProjectは適切なプロジェクト名を入れる。
生成されたExampleProject.hxprojやproject.xmlを適切に修正する。com.exampleやCompany Nameと書いてある部分を適切な物に変える。

ソースコードの修正

試しに画面を余白10px空けて赤く塗りつぶしてみる。Source/Main.hxを次のようにする。

package;

import flash.display.Sprite;

class Main extends Sprite {
    public function new () {
        super ();

        graphics.beginFill(0xff0000, 1.0);
        graphics.drawRect(10, 10, stage.stageWidth-20, stage.stageHeight-20);
        graphics.endFill();
    }
}

ビルド

lime.bat build html5 とか lime.bat build flash とか。

(Cygwinのmakeから実行したいので.batを付けている)

実行

html5なら cygstart Export/html5/bin/index.html とか。

flashなら cygstart Export/flash/bin/ExampleProject.swf とか。

(cygstartは引数で指定されたファイルをWindowsで関連づけられたアプリケーションで開くCygwinのコマンド)

リサイズ対応

Webブラウザでhtml5を表示したにせよデスクトップのFlashプレイヤーでswfを実行したにせよ、ウィンドウサイズを変更したときに右端や下端の余白が10pxで無くなってしまいます。
なので、リサイズされたらグラフィックスを変更するようにします。

package;

import flash.display.Sprite;
import flash.events.Event;

class Main extends Sprite {
    public function new () {
        super ();

        resize();

        stage.addEventListener(Event.RESIZE, function(e:Event){resize();});
    }

    function resize():Void
    {
        // stage.stageWidth, stage.stageHeight変更直後の処理を書く。
        updateBackground();
    }

    function updateBackground():Void
    {
        graphics.clear();
        graphics.beginFill(0xff0000, 1.0);
        graphics.drawRect(10, 10, stage.stageWidth-20, stage.stageHeight-20);
        graphics.endFill();
    }
}

(アニメーション)フレーム毎の処理

試しに赤いボールを画面端でバウンドさせながら移動させてみる(超適当)。

package;

import flash.display.Sprite;
import flash.display.Shape;
import flash.events.Event;

class Main extends Sprite {
    public function new () {
        super ();

        // ボールを作る。
        var ballShape = new Shape();
        ballShape.graphics.beginFill(0xff0000, 1.0);
        ballShape.graphics.drawCircle(0,0,16);
        ballShape.graphics.endFill();
        addChild(ballShape);

        var ball = {
            x:100, y:100, vx:4, vy:4, shape:ballShape
        };

        // フレーム毎に移動させる。
        addEventListener(Event.ENTER_FRAME, function(e:Event){
            ball.x += ball.vx;
            ball.y += ball.vy;
            if(ball.x > stage.stageWidth){
                ball.x = stage.stageWidth;
                ball.vx = -ball.vx;
            }
            if(ball.y > stage.stageHeight){
                ball.y = stage.stageHeight;
                ball.vy = -ball.vy;
            }
            if(ball.x < 0){
                ball.x = 0;
                ball.vx = -ball.vx;
            }
            if(ball.y < 0){
                ball.y = 0;
                ball.vy = -ball.vy;
            }
            ball.shape.x = ball.x;
            ball.shape.y = ball.y;
        });
    }
}

(赤いボールはグラデーションで影を付けたかったのだけど、html5版のGraphics.beginGradientFillはまだ実装されていなかった)

2014-04-20

2014-04春の新番組

ようやく一通り見終わりました。キツイ。多すぎ。忙しすぎ。

  • × カリーノ・コニ
  • △ Blade&Soul -ブレイドアンドソウル-
  • ○ 僕らはみんな河合荘
  • ○ 蟲師 続章 (前期)
  • △ selector infected WIXOSS
  • △ 悪魔のリドル
  • × レディ ジュエルペット (第6期)
  • △ 魔法科高校の劣等生
  • △ 神々の悪戯
  • △ 金色のコルダ Blue♪Sky
  • ○+ それでも世界は美しい
  • △ ハイキュー!!
  • ○+ ベイビーステップ
  • △ 極黒のブリュンヒルデ
  • × 召ませロードス島戦記それっておいしいの?
  • × ブレイクブレイド
  • △ キャプテン・アース
  • ○ 一週間フレンズ。
  • × 星刻の竜騎士
  • ○ マンガ家さんとアシスタントさんと
  • × DIABOLIK LOVERS
  • △ ブラック・ブレット
  • △- 史上最強の弟子ケンイチ OVAシリーズ
  • △ ソウルイーターノット!
  • × 魔法少女大戦
  • △ ノーゲーム・ノーライフ
  • △ 棺姫のチャイカ
  • △ 風雲維新ダイショーグン
  • × エスカ&ロジーのアトリエ~黄昏の空の錬金術士~
  • ○ ご注文はうさぎですか?
  • ◎ ピンポン THE ANIMATION
  • × 龍ヶ嬢七々々の埋蔵金
  • ○ シドニアの騎士

一押しはピンポンですね。普通に面白い。

蟲師はそこそこですね。1話完結で話毎に善し悪しはありそうですが、今後面白い話はありそう。

ベイビーステップはテニスものですが、話の流れがスムーズですし、主人公の性格も面白いですね。

2014-03-01

gitをautocrlf=trueで使っているとel-getでWanderlustがインストールできない

el-getをインストールし、el-get-installでapelのインストールから先に進まない問題を解決したのですが、今度は次のようなエラーが出ました。

Generating autoloads for wanderlust/site-lisp/wl/wl-highlight.el...done
Generating autoloads for wanderlust/site-lisp/wl/wl-mailto.el...done
Generating autoloads for wanderlust/site-lisp/wl/wl-message.el...done
Generating autoloads for wanderlust/site-lisp/wl/wl-mime.el...done
wanderlust failed to install: (error Local variables entry is missing the suffix)
el-get-installation-failed: Local variables entry is missing the suffix

なんのこっちゃい。

原因

wl-mime.elの後くらいでエラーになっていたので、その後のファイルを見て原因が分かりました。

例えばwl-news.elの先頭は次のようになっています。

;;; wl-news.el --- Create notification from NEWS(.ja) for Wanderlust. -*-coding: iso-2022-jp-unix;-*-

;; Copyright (C) 2002 Yoichi NAKAYAMA

coding-systemがunix。つまり、改行コードがLFと指定されているのです。
でも私は普段Windows環境ではgitをcore.autocrlf=trueにして使用しています。
リポジトリにはLFで保存されるが、ワーキングコピーはCRLFになるようにしているのです。
つまり、このwl-news.elはCRLFになっているのです。
どうもヘッダーではunix(LF)と書いてあるのに、実際のファイルはdos(CRLF)なのでエラーが出るようなのです。

対策

普段 core.autocrlf=true にしているのには訳があります。なので、 git config --global core.autocrlf false にするのは却下です。

ワーキングコピーのローカルでgit configしようにも、el-getがこれからcloneしようとしているファイルに対しては意味がありません。

git cloneするときに、最初から git config core.autocrlf false の状態になるような方法を探したのですが、良い方法は見つかりませんでした。

ただ、 git -c core.autocrlf=false のようにオプションで指定してやれば、cloneして取り出したファイルはunix(LF)になりました。
残念ながらローカルなconfigにこのオプションは反映されません。
なので、毎回オプションをつけてgitを呼び出す必要があります。

つまり、el-getがgitを呼び出すときに、強制的にargsに("-c" "core.autocrlf=false")を付加してやれば良いわけです。

el-getでは、呼び出すコマンド列は全てリスト化されてまとめて el-get-start-process-list に渡されます(たぶん非同期対応のためだと思います)。

なので、 el-get-start-process-list に渡されるそのリスト(commands)の中に、:programがgitのものを見つけ出し、その:argsの先頭に("-c" "core.autocrlf=false")を付加します。

;;; el-getがgitを呼び出すとき、 -c core.autocrlf=false 引数を付加する。
;;; wanderlustがLF改行でなければバイトコンパイルに失敗するので。
;;;
;;; 普段autocrlf=trueでgitを使っているので、gitのglobal configを変えたくない。
;;;
;;; 注意: cloneしたワーキングコピーのconfigにこの設定は反映されない。
;;;       el-get以外から直接 ~/.emacs.d/el-get/ にあるワーキングコピーを
;;;       gitで操作しようとすると、問題が起きる場合があるので注意すること。
;;;       そのようなことをする前に git config で明示的に設定すると良いと思う。
(defadvice el-get-start-process-list (around my-el-get-start-process-list--modify-git-args activate)
  (let* ((commands (ad-get-arg 1))
         (git-executable (el-get-executable-find "git"))
         (new-commands
          (loop for c in commands collect
                (if (string= (plist-get c :program) git-executable)
                    ;; gitならargsプロパティに -c core.autocrlf=falseをつける。
                    ;; @todo 破壊的だけどOK?
                    (plist-put c :args (append '("-c" "core.autocrlf=false") (plist-get c :args)))
                  ;; gitでないならそのまま
                  c))))
    (ad-set-arg 1 new-commands)
    ad-do-it))

これで無事にWanderlustがバイトコンパイルできるようになりました。
……これだからel-getは使いたくなかったんだ。

その他の解決策

git -c core.autocrlf=false %* という内容のgit-lf.batを作って、それをel-getに使わせる(el-get-git-executableを書き換える)という方法もあります。

その他のトラブル

gitは空白が無いパスに入れた方が無難かも?(詳しく確認してないがverboseで追っているときに、checksumのところでProgram Filesがらみの変なエラーメッセージを見たことがある)