Crystal で Flappy Bird を作った

この記事は Akatsuki Advent Calendar 2018 - Adventar の 2 日目の記事です。 1 日目は GLSL SandBoxで手軽にレイマーチングで遊ぼう でした。

Crystal で Flappy Bird 作った時のことを簡単に書きます。

Crystal とは

C 言語の速さと Ruby の書き味を同時にもつ実用的なプログラミング言語を目指して開発されている言語です。

SFML とは

SFML ( Simple and Fast Multimedia Library ) とは、色々なマルチメディアの機能を使うためのライブラリです。

なぜ Crystal なのか

  • 速さ
  • C Bindings
  • Null 安全

速さ

Redis ライブラリの比較Web Framework の比較 にパフォーマンスの比較があります。

C Bindings

Crystal では簡単に C 言語のコードを呼び出せます。C で書かれた既存のゲームプログラミングのライブラリ を呼び出すコードを簡単に書けて、そこに学習コストをかけなくて良くなります。

Null 安全

最近のモダンなプログラミング言語は Null 安全性を取り入れていて、 Crystal も例外ではありません。 「Null 安全である」とは簡単に言うと「 Null が原因の実行時エラーが起こらない」ということです。

Crystal と SFML の例

Crystal と SFML を使ったゲームの例は crsfml-examples にあり、2048 や Tetrominos もあります。

環境構築

CrystalとSFMLをインストールします。 入っていなければ CMake もインストールします。mac なら homebrew が使えます。

$ brew update
$ brew install crystal
$ brew install sfml
$ brew install cmake

続いて Crystal で SFML を使うためのライブラリ CrSFMLGitHub から clone します。

$ git clone https://github.com/oprypin/crsfml
$ cd crsfml
$ cmake . && make
$ export LIBRARY_PATH=/full/path/to/crsfml/voidcsfml
$ export LD_LIBRARY_PATH="$LIBRARY_PATH"

CrSFML の使い方

公式のチュートリアルAPI ドキュメント が詳しいです。いくつか抜き出します。

Window を開く

require "crsfml"

window = SF::RenderWindow.new(SF::VideoMode.new(800, 600), "My window")

Keyboard のイベントを拾う

if SF::Keyboard.key_pressed?(SF::Keyboard::Left)
  # left key is pressed: move our character
end

Flappy Bird を作る

Flappy Bird を作りました。ソースコードTobiasGSmollett/flappy_bird.cr に置いてます。

やったことは Tetorominos のコード を眺めて大体の雰囲気を掴んだ後、flippy_bird という鳥が上下するだけのサンプルコードを見つけたので、そのコードに動く壁をつけました。

今後やること

CrSFML の window では OpenGL を使えるので、Crystal で OpenGL を触りつつ色々アウトプットしていきたいです。