Esenthel Engine怒涛の付属チュートリアルサンプルプログラム一覧

**この記事は[Esenthel Engineというゲームエンジンが予想外に面白かったのでメモ](http://qiita.com/yasei_no_otoko/items/a85c677714fb12903f81)の補完です**

# インストール方法
1. [公式ストア](http://www.esenthel.com/?id=store)で「Esenthel Engine 2.0」をクリック
2. Downloadをクリックし、  
Esenthel Engine 2.0 for Windows (creates games for Windows and Android)  
Esenthel Engine 2.0 for Mac (creates games for Mac, iOS and Android)  
の自分のOSに合ったものをダウンロード
3. ダウンロードした実行ファイルを立ち上げ、インストールフォルダを指定
4. Esenthel.exe(.app)を起動
5. Run as Demoをクリックし、Projects欄でTutorialプロジェクトを立ち上げる（新規プロジェクト作成はNew Projectボタン）
6. 実行したいアプリにチェックを入れ、左下の再生ボタンを押す（ショートカットはF5）

# チュートリアル
Esenthelを素晴らしいと思った最大の理由が、付属チュートリアルの量だ。
以下にその全てを記す。
数が多すぎるので、ソースコードと出力結果は自分の目で確かめてほしい。
品質が他のメジャーゲームエンジンと比べてそこまで優れているわけでは無いが、技術書数冊分には及ぶその量に圧倒させられる。
**なお、いくつかそのままではコンパイルが通らなかったので修正が必要なサンプルプログラムがあるが、エラーが出ている項目の一部をエディタで入力するとコード補完で新名称の関数がすぐに見つかったので数秒で直すことが出来た。**

## 1. Start(はじめに)

### 1. Basic App（基本アプリ）
画面に「Hello to Esenthel Engine 2.0 !」とテキストを表示するだけのプログラム。

### 2. Drawing（描画）
Esenthelの2Dグラフィックス関数を使ったデモ

### 3. Input（入力）
マウス位置の取得と、キーボードの矢印キー操作による移動処理

### 4. Using Resource（リソースの利用）
プロジェクトの画像リソースを読み込み描画

### 5. Gui(グラフィカルユーザーインターフェース）
タイトルバーと1行テキスト、OKボタンしか無いダイアログの表示

### 6. Simple 3D（シンプルな3D）
Esenthelの3Dプリミティブ関数で箱、球（左クリック）、柱（右クリック）のポリゴンを描画し、マウスの移動に合わせてカメラを回転する

## 2. File（ファイル）
### 1. File（ファイル）
起動時にバイト型、符号無し整数型、文字列型をバイナリファイルに書き込んでそれを読み込み、内容をテキスト表示する

### 2. Xml
今度はデータをXMLファイルとして保存し、読み込み時に型を指定する

### 3. Text Data（テキストデータ）
テキストファイルによるファイル操作

### 4. File Find（ファイル検索）
指定したディレクトリ内を検索し、ファイル一覧を表示する

### 5. Chunks（チャンク）
チャンク構造のファイル操作

## 3. Geometry（ジオメトリ：幾何学）
### 1. Camera（カメラ）
4×4個の箱ポリゴンを描画し、マウスの動き、矢印キー、Z/Xキーでカメラを操作する

### 2. Matrix（マトリックス：行列）
Matrixを用いてポリゴンの配置・回転を行い、スペースキーで各オブジェクトのMatrixのX/Y/Z軸を描画する

## 4. Graphics（グラフィックス）
### 2D Effects（二次元効果）
Esenthelロゴに2Dエフェクトを適用する（1～6キーでエフェクトを切り替え）

### Batched Drawing（束ねた描画）
複数の描画処理を1度にまとめることで、負担を減らす（スペースキーで通常描画）

### Color Transformations（色の変換）
Esenthelロゴの色を変化させる

### Dynamic Image（動的画像）
256x256ピクセルのグラデーション画像を作成して描画する

### Image Mask（画像マスク）
真っ白なウィンドウの中でマウスの下にある部分だけEsenthelロゴを描画する

## 5. Gui(グラフィカルユーザーインターフェース）
### 1. Bars（バー）
スライドバー、プログレッシブバー、スライダーの表示

### 2. Buttons（ボタン）
単一クリックのボタンと、一度クリックすると処理が継続するボタンの表示

### 3. Tabs（タブ）
クリックうすると表示が切り替わる3つのタブを表示

### 4. Window Menu（ウィンドウメニュー）
普通のアプリケーションのような左上メニューを表示

### 5. List（リスト）
要素を一覧表示するためのリストボックスを表示

### 6. ComboBox（コンボボックス）
クリックすると選択肢が複数表示されるコンボボックスを表示

### 7. Game Menu（ゲームメニュー）
ゲームのタイトル画面のようなメニューを表示

### 8. Loading Gui Objectｓ（GUIオブジェクトの読み込み）
予め作成されたGUIオブジェクトを読み込んで使用する

### 9. Extending Gui Objects（GUIオブジェクトの拡張）
グラフィックス関数を用いてボタンの見た目を変更する
**そのままでは実行できないので、14行目のColorLerpをLerpに書き換える**

### 10. Extending and Loading Gui Objects（GUIオブジェクトの拡張と読み込み）
読み込んだオブジェクトに自作のボタンを追加する
**これもそのままでは実行できないので、14行目のColorLerpをLerpに書き換える**

### 11. Non Rectangle Objects（四角じゃないオブジェクト）
四角形ではない円形のGUIオブジェクトを表示する（当たり判定も円形）

### 12. Multiple Viewports（複数の表示領域）
ビューポート（表示領域）を2つ作成し、それぞれ別のカメラを表示する

### 13. Window IO（ウィンドウによる入出力）
F2でセーブウィンドウ、F3でロードウィンドウを表示する

### 14. Screen Proportions（スクリーンの比率）
画面中心を0.0/0.0とした、マウスの位置のスクリーン上での相対座標を表示する

### 15. Color Picker（色の選択）
色を選択するウィンドウを表示する

### 16. Properties(プロパティ：特性)
変数と連動したGUIオブジェクトの表示

### 17. Chatbox（チャットボックス）
チャットウィンドウの表示

### 18. Tree List（ツリーリスト）
階層構造のある枝分かれしたリストの表示

## 6. Memory（メモリー：記憶）
### Cache（キャッシュ）
通常のC++ポインタを用いた画像と、参照カウントによるキャッシュ実装のポインタによる画像の表示

### Map（マップ）
キーとデータを持つマップコンテナ

### Memory Containers - 1 - Basixs（メモリコンテナ1：基本）
単純なメモリコンテナ（表示無し）

### Memory Containers - 2 - Advances（メモリコンテナ2：発展）
上記よりも複雑で高機能なメモリコンテナ

## 7. Misc（miscellaneous：雑多）
### Application States（アプリケーションの状態）
起動するとMenu状態から始まり、Enterキーを押すとGame状態に移り、Escキーを押すとGameを終了してMenuに戻る。MenuでEscを押すとウィンドウが閉じる。

### Compression（ファイル圧縮）
容量が大きくなるが超高速なSnappy、圧縮が遅いが容量が小さくなりバランスの良いzlib、圧縮が遅いが一番小さくなるLZMAを使ってファイルの圧縮/解凍を行う

### Drag & Drop（ドラッグ　アンド　ドロップ）
ファイルをウィンドウにドラッグアンドドロップするとそのファイルパスを表示する

### High Precision Number（高精度数）
整数と実数を両方扱えるNumber型の計算を実行

### JoyPad（ゲームパッド）
ゲームパッドのデジタル入力、アナログ入力×2を取得する

### JoyPad Vibrations(ゲームパッドの振動）
ゲームパッドが振動対応なら振動させる

### Mouse Cursor（マウスカーソル）
1/2キーを押すとウィンドウ内にマウスカーソルがある時にカーソルアイコンを切り替える

### Pathfind 2D（二次元経路探索）
クリックした始点と終点の経路を障害物を考慮して結ぶ

### Random（ランダム：乱数）
乱数を発生させ、その座標にドットをひたすら打ちノイズグラフィックスを描画する

### Sorting（並び替え）
ランダム生成した浮動小数点数、クラス、メモリをスペースキーで小さい順に並び替える

### Threads （スレッド：織り交ぜる）
x、y0、y1それぞれのスレッドを作成し別々のCPUで加算命令を行う

### Threads 2（スレッド2）
三角関数、累乗、立方根の計算1000回×2セットを1つのCPUでやる場合と、2つのスレッドを立ち上げた場合で比較

### Touch Screen（タッチスクリーン）
マルチタッチの座標と、ある場合は加速度センサとジャイロスコープの値も表示する

### Video Playback（ビデオ再生）
動画を画面に再生する

## 8. Net（ネットワーク）
### Connection （接続）
Client（クライアント）からServer(サーバー）に接続し、サーバー経由でテキストデータを送信する
**Server→Client×2の順に起動する**

### Connection 2（接続2）
複数のクライアントからサーバーに接続し、サーバー経由で位置情報を同期する

### Donwload （ダウンロード）
Esenthelの公式サイトからロゴをダウンロードして表示する
**そのままではビルドできないので50行目のDWNL_WAITをDWNL_CONNECTINGに書き換える**

### Ftp（ファイル転送プロトコル）
FTPサーバーからファイルをダウンロードする
**10行目のftp.login関数の引数を自前のFTPサーバーのアドレス、ID、パスワードに変更しなければ実行できない**

### Sql
SQLデータベースを操作する
**SQL Server ExpressかSQLiteが必要**

## 9. Sound（サウンド：音）
### Music（音楽）
1～4キーを押すと音楽を再生する（切り替えクロスフェード対応）

### Sound（音）
スペースキーを押すと金属音、Enterキーを押すと継続して流れる水の音を再生する
マウスホイールで音量を調節でき、左右クリックで速度を変えられる

### Sound 3D（立体音響）
マウスを動かすと球体が周囲を回るように動き、その位置によって音が変わる（ヘッドホン推奨）

### Sound Callback（音を繰り返す）
プログラムでサイン波の音を生成し、継続して再生する

### Sound Capture（音の取り込み）
マイクが接続されていたらそこから音声を取り込んで波形を描画する

### Volume Groups（音量グループ）
FX（効果音）、Music（音楽）、Ambient(環境音）の3種類それぞれ音量を調節する

## 10. Animation（アニメーション）
### 1. Animation（アニメーション）
スペースキーを押すと人型モデルの歩行アニメーションを再生する
Ctrlキーを押すとアニメーションしているSkeletons（スケルトン）を表示する

### 2. Item Slots（アイテムスロット）
スケルトンに設定したアイテムスロットに棍棒モデルを表示して歩行アニメーションに追従させる

###  3. Blending（ブレンディング：混ぜ合わせる）
スペースボタンを押すと走行アニメーションから歩行アニメーションに切り替わるが、
2つのアニメーションを混ぜることによって自然な切り替わりを実現

### 4. Manual Editing（手動編集）
プログラムによって頭のスケルトンを動かし、周りを見渡しているような動きをさせる

## 11. Physics（物理）
### 1. Physics（物理）
地面、箱、ボールを表示し、物理的な動作をさせる
矢印キー、W/A/S/Dキー、スペースキーでボールに力を加える

### 2. Multi shaped actors（複数形状のアクター：役者）
複数の形状からなるアクターを作成する

### 3. Joints(ジョイント：継ぎ目)
ジョイント構造を作成しドアのようなオブジェクトを作成する

### 4. Joints 2（ジョイント2）
ジョイントの上しか動かない引き戸のようなオブジェクトを作成する

### 5. Controllers（コントローラー）
W/A/S/Dキーでカプセルに力を加えることで移動させる

### 6.Ray testing（光線検査）
光線にボールが当たっているか判定する（X線検査=X-ray testing）

### 7. Collision detection（衝突判定）
ボールが箱に当たっているか判定する

### 8. Sweeping（スウィープ）
ボールを平行運動させ、動かないボールに当たっている分の動きを制限する

### 9. Detecting objects under cursor（カーソルの下にあるオブジェクトの検出）
マウスカーソルの下に見えないRayを飛ばし、オブジェクトがあったらその情報を表示する

### 10. Grabbing（ひっつかまえる）
Ctrlを押している間、W/A/S/Dキーを押すと箱を引っ張る

### 11. Ragdoll（ラグドール：人形）
人型モデルの関節を物理運動で折り曲げる

### 12. Simple Vehicle（単純な車両）
W/A/S/Dキーで動かせる物理演算で走る車

### 13. Vehicle（車両）
ギアチェンジも備えた本格的な車両

## 12. Rendering（レンダリング：描画・表現）
### 1. Rendering（レンダリング）
石組みテクスチャとライティングを適用した球体ポリゴンの表示

### 2. Sky（空）
1~3キーで背景画像を切り替える

### 3. Astronomical Objects（天体）
画面にatmospheric（大気）を設定し、太陽と月を配置してライティングを変化させる

### 4. Viewport（ビューポート表示領域）
2つのカメラ作成し、2つの画面をウィンドウ内に表示する

### 5. Shadows（シャドウ：影）
ライトを動かしそれに合わせて影を表示する

### 6. Motion Blur（モーションブラー：動きの霞み）
1～3キーでモーションブラーを切り替える
1. 何も無し
2. カメラだけの動きに応じる
3. カメラとオブジェクトの動きに応じる

### 7. Local Fog（局所的な霧）
0～3キーでそれぞれ違った形の霧を表示する

### 8. Holographic Images（ホログラフィックイメージ）
レーザーで投影したような物体を表示する

### 9. Object Clouds（雲）
Esenthelの機能を利用して雲を表示する

### 10. Mesh Outline（メッシュの輪郭）
スペースキーを押すとカメラから見える部分のメッシュの輪郭を表示する

### 11. Laser and Electricity（レーザーと電気）
重なると輝きが強くなる赤色レーザーと、常にアニメーションしている電気を表示する

### 12. Cel Shading（セルシェーディング）
アニメ風にライティングされたボールを描画する（Cel＝セル画のセル）

### 13. Combining Render with Background（背景と結合したレンダー）
背景画像の上に3Dモデルを描画する

### 14. Render to Texture（テクスチャにレンダリングする）
画面中央に箱とボールを配置し、副カメラの表示を箱のテクスチャとしてレンダリングする

### 15. Swing Trail Effect（振る軌跡のエフェクト）
回転する棍棒に合わせて白い軌跡を表示する

## 13. Mesh（メッシュ：編み物）
### Armor Rendering（鎧の描画）
人型モデルに鎧、ブーツ、篭手モデルを被せ、アニメーションを再生する

### Blocks（ブロック：塊）
複数の箱ポリゴンをランダムで固めたブロックメッシュを表示する

### Constructive Solid Geometry（空間領域構成法）
2つの物体の集合演算を用いてメッシュを構成する
1～4キー、Q/W/E/Rキー、A/S/D/Fキーで切り替える

### Dynamic Mesh（動的メッシュ）
頂点とテクスチャを1つ１つ指定して三角形メッシュを作成する

### Heightmap（ハイトマップ：高度図）
二次元のハイトマップを２つ利用して地面の高さと草テクスチャを描画する

### Mesh Part Draw Group（メッシュパーツの描画グループ化）
スペースキーを押すことで体と首のどちらを描画するか切り替える

## 14. Game Basics（ゲームプログラミングの基本）
### 1. Character（キャラクター）
メッシュ、アニメーション、物理演算を利用してキーボード操作でキャラクターを動かす

### 2. World（ワールド：世界）
World Editor（ワールドエディタ）で作成したサンプルワールドを描画する

### 3. World with Character（ワールドとキャラクター）
ワールドの上でキャラクターを動かす

### 4. Lights（ライト：光）
別々の色を持ったライトを使って部屋を照らす

### 5. Day Night Cycle（昼夜サイクル）
時間に合わせて太陽を動かし昼夜を再現する

### 6. Saving and Loading（セーブとロード）
F2でワールドの状態を保存し、F3で復元する

### 7. Dynamically Created Objects（オブジェクトの動的生成）
スペースキーを押すとワールドに樽オブジェクトを追加する

### 8. Pathfinding（経路探索）
地面をクリックするとその地点への経路を割り出し、プレイヤーを自動的に走らせる

### 9.Custom Parameters（カスタムパラメータ）
オブジェクトの名前を取得して画面にテキスト表示する

### 10.Waypoints(<del>道の駅</del>経路の地点)
World Editor（ワールドエディタ）で設定した地点を用いて経路を作る

### 11. Fast Shadows（高速な影）
影を計算せず、予め作っておいた影マテリアルを地面の上に被せることで影に見せかける

### 12. Animations（アニメーション）
Enterキーを押すと右手で殴るアニメーションを再生する

### 13. Ragdoll（ラグドール：人形）
スケルトンアニメーションにラグドールで物理演算したアニメーションをブレンドする

### 14. Camera Modes（カメラモード）
Tabキーを押すとカメラの種類が切り替わる

### 15. Camera Collisions（カメラの衝突）
カメラを回転させても、地面を突き抜けない

### 16. Object Referenes（オブジェクトの参照）
スペースキーを押すと、参照しているアイテムオブジェクトを削除する

### 17. Small Overlays（小さな上敷き）
画面の中央に十字の照準が描画し、樽オブジェクトに照準が合っている時にスペースキーを押すと銃で撃ったように吹き飛ぶ

### 18. Behind Effect（陰のエフェクト）
キャラクターが地面の陰に隠れている時だけエフェクトを表示する

### 19. Loading Screen（ロード画面）
ワールドとは別のスレッドでロード画面を表示し、完了したら画面を切り替える

### 20. Multiple Worlds（複数のワールド）
複数のワールドを読み込み、1/2キーで切り替える

### 21. Inventory（インベントリ：持ち物）
棍棒をクリックするとインベントリGUIに移り、インベントリの棍棒を左右の四角形にドラッグするとプレイヤーの左右の手に装備される

### 22. Lights and Particles（ライトとパーティクル：粒子）
ライトを使って暗い地面を照らし、パーティクルで炎エフェクトを表示する

### 23. Oculus Rift（オキュラス　リフト：眼球 割れ目）
[Oculus Rift](http://www.oculusvr.com)があったら立体表示し、センサーでカメラを動かす

## 15. Demo（デモンストレーション：実演）
### Earth（地球）
一見ただ地球を描画しているだけのように見えるが、現実の時間を元に太陽の位置を動かしている

## 16. Editor Interface（プログラムからエディタへのインターフェース）
### 1. Projects（プロジェクト）
Esenthelに登録されているプロジェクト名を取得して一覧表示する

### 2. Elements（エレメント）
プロジェクトに登録されているエレメント（ソースコード、GUI、画像、サウンド、モデル、アニメーション、ワールド等）を全て表示する

### 3. Element Preview（エレメントのプレビュー）
画像エレメントだけを取得し、一番最初のエレメントを画面に表示する

### 4. Creating Terrain（地形の作成）
ハイトマップを使った新しい地形を作成し、ワールドエレメントとして保存する（Programatic World）

### 5. Placing Objects（オブジェクトの配置）
樽オブジェクトを配置したワールドエレメントを保存する（Programatic World）