Sunflat のブログ

ソフトウェア開発についての話題が多いかも

自作ゲーム配布方法の歴史

2000年頃のインターネットを懐かしむ会(インターネット老人会)というイベントで発表したので、スライドを貼っておきます。

Chromeだと埋め込みスライドのボタンが効かないっぽいので、下のリンク先で見てください)

書ききれなかったけど、他にも、ベクター PACK5000 とかの、CD-ROMに沢山のフリーソフトシェアウェア(無料アプリ・有料アプリのこと)が収録されたムックとかもありましたね。

Vimで、ファイルの存在するディレクトリ単位で、インデントの設定とかを変える

Haxe用の使いやすそうなエディタを調べていくうちに、vaxeというVimプラグインがなかなか良さげな感じだったので、結局 Vimを使い始めることにした。

ファイルタイプごとにインデントの設定を変えるには、vimrcに、例えば autocmd FileType haxe setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 などと書いておけば良い。 しかし、ファイルタイプに加えて、さらにプロジェクト単位で、インデントの設定を変えたくなることがよくある。(参加しているプロジェクトごとにインデントの規則が違うとか、ある日突然好きなインデントのタイプが変わったとか)

そこで、localvimrc というvimプラグインを入れて、プロジェクトごと(ファイルが存在するディレクトリごと)に追加のvimrcを設定できるようにしてみた。

プロジェクトのトップディレクトリに .lvimrc というファイルを作っておくと、そのディレクトリ以下(サブディレクトリ含む)のファイルを開いたときに、自動的に .lvimrc の内容を実行してくれるので、ここにインデントの設定などを書いておけば良い。

NeoBundleを使っているので、vimrcに、プラグインの場所を追加してインストール

" vimrcに追記
NeoBundle 'embear/vim-localvimrc'


デフォルトのままだと、毎回 .lvimrc を実行するか聞かれて面倒なので、選択を保存する設定にする。ただし、あらかじめ空のファイル ~/.localvimrc_persistent を作成しておく必要があるみたい。

" vimrcに追記
let g:localvimrc_persistent=2


デフォルトのままだと、sandboxで実行されるため、インデントの設定とかを変えられないようなので、無効にしておく(実はsandboxが何なのかよく分かっていない...)

" vimrcに追記
let g:localvimrc_sandbox=0


あとは、プロジェクトのトップディレクトリに、以下のような .lvimrc をおけば、このプロジェクト専用のインデントの設定ができる。(この例の場合、filetypeがhaxeの場合のみインデントの設定を変更している)

if &filetype=='haxe'
    setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4
endif


やったね!

Windows 8 で簡単シャットダウン

Windows 8をシャットダウンするのが面倒臭いので、ショートカットを作った。

以下のファイルを"confirm-shutdown.js"等の名前で作成し

var sh = new ActiveXObject("WScript.Shell");
if (sh.Popup("Are you sure you want to shutdown?",0, "Confirmation", 1+32) == 1) {
    sh.Exec("shutdown -s -t 0")
}

"wscript.exe [confirm-shutdown.jsのパス]"という内容のショートカットを作っておく。起動すると、シャットダウンを確認するダイアログが出る

おまけ1

こっちのほうがいいかも?(試してない)
http://crystaldew.info/2012/07/16/windows-8-sleep-shortcut/

おまけ2

Windows8アプリを出したよ
http://www.sunflat.net/windows/

Haxe NME

NMEという、Haxe言語用のクロスプラットフォームライブラリがあり、Flash風のAPIを使って書いた単一のコードから、Flashhtml5iOSandroidmacwindowsなど、色々なプラットフォーム向けの実行ファイルを出力できる。

JavaScript (中略) ハッカソンに参加したので、NMEを使って生成されたアプリの、いくつかのプラットフォーム上での実行時間を比較してみた。

比較には、id:yoshihiro503さん作のAOBench Haxe版を、NME用に移植したものを使った。ソースはこちらhtml5版の生成されたアプリはこちら


実行にかかった時間(ms)

10回(iPhone 4shtml5のみ3回)測定した平均値です。

MacBook Pro (15-inch Mid 2010, Core i7 2.66GHz) で実行
html5 (JavaScript) Chrome html5 (JavaScript) Safari Mac nativeアプリ (C++) Flash
1574.1 ms 2812.3 ms 1092.9 ms 3601.8 ms
iPhone 4s で実行
html5 (JavaScript) Safari iOS nativeアプリ (C++)
47691.3 ms 7271.2 ms
感想

NME のセットアップメモ

追記:NMEのインストーラを使うと、いくつかの手順やコマンドの名前を省略てきて便利なようです(コメント欄参照)。

haxelibのインストール方法はこちら

Mac上でのNMEのセットアップ手順(うろ覚え)

sudo haxelib install nme
sudo haxelib run nme setup html5
   (jeashライブラリをインストール)
sudo haxelib run nme setup flash
sudo haxelib run nme setup ios
  (XCode4を別途インストール)
sudo haxelib run nme setup mac
sudo haxelib install hxcpp
  (これを忘れると、Source Path "libstd..." does not exists、などのエラーが出る)
sudo /usr/bin/xcode-select -switch  /Applications/Xcode.app/Contents/Developer
  (これを忘れると、/Developer パスが無いと言われる)

実行

haxelib run nme test application.nmml html5
haxelib run nme test application.nmml flash
haxelib run nme test application.nmml mac
haxelib run nme test application.nmml ios

HaxeでJavaScriptゲームを作ってみた

最近、JSXやHaxeなどのJavaScriptを生成できる言語が流行っているみたいなので、Haxeを少し勉強してみた。
試しに、以前OCaml(ocamljs)で書いたシューティングゲームを、Haxeで書き直してみた。

Haxeの特徴と使い方

Haxeのインストール

  • Mac用のものもhomebrewにあったけど、現時点のバージョンではhaxelibがエラーが出て動かなかった。
    • 追記:@choplin さんが 解決法 を書かれています
  • 結局、Ubuntu 12.04 に入れた

実行したコマンド:

sudo add-apt-repository ppa:eyecreate/haxe
sudo apt-get update
sudo apt-get install haxe libneko0

html5ライブラリのインストール

  • haxelibをセットアップする前に、ライブラリ用のディレクトリ(/usr/lib/haxe/lib)を作っておく必要あり

実行したコマンド:

sudo mkdir -p /usr/lib/haxe/lib
sudo haxelib setup
sudo haxelib install html5

コンパイル方法

haxe -lib html5 -js game1.js -main Game1

または、ビルドファイルを使って: haxe compile.hxml

感想

  • 良さげな点
    • ActionScript3やJavaに近い文法なので、似たような感覚で書ける
    • 静的型チェックがあるので、メソッド名の間違いとかのエラーがコンパイル時に分かる
    • 生成されたJavaScriptのコードが読みやすい。インデントもされていて、そのままデバッグに使える
    • 型推論が強力なので、メソッドの引数/返り値の型を多くの場合省略出来る
    • インライン展開もできる
    • 他の言語(AS3/C++/PHP/C#)も出力できるらしい。Java出力も現在開発中らしいので、Androidアプリ開発にも使えそうで期待。
  • 気になった点(単に勉強不足なだけかも)
    • 整数の割り算や、整数用のmin, max, abs関数が、標準で用意されていない???
    • 無名クラスが書けないので、haxe.Timerを継承したクラスを作るために、別の場所に名前付きクラスを書く必要があった
    • インスタンスフィールドの宣言の場所に初期値を書けない。コンストラクタで代入する必要あり

MSXでプレゼン

MSXでプレゼンしてみました。


プレゼン生成に使ったツールも公開しています:
https://bitbucket.org/sunflat/mlnagoya/

こんな感じのScalaコードから、プチコンのBASIC風の中間形式を経て、こんな感じのMSX-BASICコード(UTF-8版)を生成します。

補足

  • MSX2以降なら、「SHIFT+かな」でローマ字入力できるそうです(Twitterで教えてもらいました)。昔使ってたのはMSX1だったので知らなかった…
  • MSXでは、こんな感じの文字コード(半角ひらがなやグラフィック文字がある)を使っているので、Unicodeからの変換テーブルを作って変換しています
  • 実は、DEF FN文を使って1つの式だけの簡単な関数なら定義できたりします。でも、条件式や再帰などが使えないので、共通の処理をまとめたりするのには使いづらい(代わりにサブルーチンコールを使う)

Macのサウンド出力先を切り替えるAppleScript

iMac用にHDMI出力コネクタを買ったのだが、音声の出力先をHDMI(外部ディスプレイ)と内蔵スピーカで切り替えたいことが良くあるので、AppleScriptにしてみた。
システム環境設定をUI操作しているので、「ユニバーサルアクセス>補助装置にアクセスできるようにする」にチェックする必要あり。AppleScriptスクリプトメニューに登録しておくと便利かも。
環境によって、row番号やラベル文字列が違うかもしれないので、適当に修正して。

tell application "System Preferences"
	activate
	set current pane to pane id "com.apple.preference.sound"
end tell

tell application "System Events"
	tell process "System Preferences"
		tell tab group 1 of window "サウンド"
			click radio button "出力"
			if (selected of row 1 of table 1 of scroll area 1) then
				set selected of row 2 of table 1 of scroll area 1 to true
			else
				set selected of row 1 of table 1 of scroll area 1 to true
			end if
		end tell
	end tell
end tell

quit application "System Preferences"

参考:http://www.oreillynet.com/mac/blog/2006/07/applescript_audio_output_switc.html