読者です 読者をやめる 読者になる 読者になる

C++の勉強その5(ゲームエンジン)

わからないものはわからないままに、C++ゲームエンジン&実装の勉強へと進む。まずはゲームエンジン最右翼のcocos2d-xから。


Cocos2d-x: オープンソースゲーム開発プラットフォーム

http://jp.cocos.com/

表紙だけ日本語でドキュメントは英語の模様。
http://cocos2d-x.org/docs/programmers-guide/about/

読み進めていると…audioファイル対応がwindowsはwavのみ。macにいたっては対応ファイルタイプについて何も書いていない。audio関連が不足していると考える人々はCricket Audioなど外部のものを使うのが常套手段になっている。

そんな背景から、他のエンジンは無いものかと調べた。するとSFMLというのが海外では受けが良いらしい。

SFML

http://www.sfml-dev.org/index.php


SFMLは 正確にはゲームエンジンではなくマルチプラットフォーム対応のマルチメディアライブラリだと思うけど、端的に言ってゲーム用と言ってしまって良いと思われる。こちらにはWAV, OGG/Vorbis and FLAC対応と書かれている。しかもメモリロードやバイナリストリームロードなどイロイロ機能がある。

一方、Cocos2d-xはさらに物理エンジンとか3D対応とかVR対応なんてのもついてる。いらないものはいいんだけど、例えば衝突判定が入ってたり、UI簡単に作れたり、外部ツールが整ってたり。機能の数だけで言えば圧倒的にCocos2d-xに軍配があがる。

5分くらい考えて、SFMLを採用した。勉強になるし、ブラックボックス化した部分に躓いてプロジェクトが停滞するのはちょっと避けたかった。衝突判定はさらに別のライブラリ(Box2Dなんか)でやろう。

ただ、cocos2d-xのチュートリアルは後ほど全部目を通す事にする。全体設計や実装コードのアイデアになるものが多い。

サイトA:プログラミング SFMLチュートリアル 非公式日本語翻訳版

http://www.site-a.info/programming/sfml/SFML_unofficialTranslation.html

ありがたいことにSFMLチュートリアルとFAQを和訳してくださっているサイトを発見したので、そちらで読み進める。しかも最新版対応! かわいい日本語訳なのでとっても読みやすい。

ここでは、全体の設計をイメージできる程度に機能の確認をしつつ流し読み。

  • スレッド化の感所について
    • ゲーム開発経験が無いのでスレッドを使うポイントが良くわからない。非同期処理は別のもので出来るよね?→必要に迫られたら使うものらしい
    • ちょっと良くわからないので、マルチメディアのロード処理なんかで重くなってから使う気持ちでいる
  • ファイルデータ入力ストリームについて
    • リリース段階ではzip圧縮して.dat拡張子にするのが一般的らしいがSFMLにはzipを扱う機能は無さそうなので、外から引っ張ってこないといけない? 自分でバイナリデータの結合仕様とかは書きたくない
    • とりあえずあるもので実装して後で書き直しやすいようにしておく
  • 2dオブジェクトの衝突判定に使えるバウンディングボックスはオブジェクトのサイズと等しいらしい。オブジェクトのサイズ=読み込み時のスプライトサイズ(多分)このままじゃちょっと衝突判定には使えないかな? 動かない壁とかには使えるかな?
チュートリアルを呼んだ感想
  • SFMLはスプライトのアニメーションも自分で書くくらいにシンプルなものらしい

http://www.gamefromscratch.com/post/2015/10/26/SFML-CPP-Tutorial-Spritesheets-and-Animation.aspx

  • 実際のゲーム開発に役立しそうなソースコード群。こちらにスプライトアニメーションクラスなどのソースがある(有志による)

https://github.com/SFML/SFML/wiki/Sources

  • メモリ管理を自前でやらない方がいいのはなぜ?(FAQより)
    • C++だけどメモリ管理とか今更手動でするなや! といった論調
    • もうSTLで自動管理してもらおうと思う。。
    • フレームワークというよりはやはりライブラリ群という印象

Tutorial: Basic Game Engine

https://github.com/SFML/SFML/wiki/Tutorial%3A-Basic-Game-Engine

  • main()には起動(とexit)に関わる事のみ入れて、run()以下にゲームの初期化など。その下のGameLoop()内に実際のゲームを置く。これってエンジンの実装なのか、エンジンを使ったゲームの実装なのか…?
  • 英語だし、初学者がざっと流し読みしただけでは理解できる内容ではなかった。リアルなTIPSが多そうなので、自分で作る際にじっくり読み込む

Cocos2d-x Programmers Guide

http://cocos2d-x.org/docs/programmers-guide/about/

  • ゲーム機能毎にシーンというオブジェクトを用意して、各シーンにされにその機能のオブジェクトを管理させる、という構造らしい。わかりやすい
  • 全ての変数でauto型(c+11の型推定)を使っている
  • ツリー構造によるz値(奥行き)の管理、アクション関連のキュー取り扱いなどとても参考になった。使いたいけど…我慢

次は、SFMLで作ったBasic Game Engineとやらのドキュメントを読み込んで、僕のゲームの全体設計の手がかりにする。それが終わったらそろそろ手を動かそう。文章を読むのに飽きてきた。