Class: TonCharacter
TonCharacter は、2DアクションゲームやRPGにおける「キャラクター(エージェント)」を統合管理するための高レベルAPIクラスです。
このクラスを使用することで、個々のキャラクターの座標管理、物理演算(重力・摩擦)、状態遷移(待機・歩行・ジャンプ)、そしてアニメーション描画を極めて少ないコードで実装できます。
つまり、会話シーンでちびキャラを動かすのに便利なクラスです!
ユーザーが行うのはアニメーションの設定と、移動やアクションのコマンドの入力だけです!!
主な機能:
- マルチエージェント管理: 複数のキャラクターをID(文字列)で識別し、一括して更新・描画します。
- 簡易物理エンジン: 重力、床との衝突判定、摩擦抵抗、速度制御を自動で行います。
- アニメーション・ステートマシン: キャラクターの状態(Idle, Walk, Jumpなど)に応じて、登録されたアニメーションを自動的に切り替えます。
- 自律移動: 指定座標への移動 (MoveTo) や、一定区間の往復 (RoundTrip) などの自律行動をサポートします。
- 座標系: 内部計算は秒単位 (px/sec) で行われ、可変フレームレート下でも安定した動作を提供します。
- クリッピング: キャラクターの移動範囲を制限できます。範囲外に出ると反転します。
Methods
void AddCharacter(string id, int x, int y, float gravity = 1800.0f)
キャラクターを追加します。
id: キャラクター識別用IDx, y: 初期座標(yは地面の高さとして設定されます)gravity: 重力加速度 (px/sec²)。デフォルトは 1800.0f です。
void RemoveCharacter(string id)
キャラクターを削除します。nullを指定すると全削除します。
id: キャラクターID
void AddAnim(string id, CharacterAnimType type, string imageName, int x1, int y1,
int w, int h, int frameCount, int
duration, bool isLoop = true)
キャラクターにアニメーションパターンを登録します。
id: キャラクターIDtype: アニメーションの種類 (Idle, Walk, Jump, panick, UserDefine etc.)imageName: 画像名x1, y1: 画像内の開始座標w, h: 1フレームの幅と高さframeCount: アニメーションのフレーム数duration: フレーム更新間隔(ms)isLoop: ループするかどうか
void SetPhysics(string id, bool useGravity, bool checkGround, float friction)
物理挙動パラメータを設定します。
useGravity: 重力を適用するかcheckGround: 地面(初期Y座標)で停止するかfriction: 摩擦抵抗係数 (例: 5.0f)。大きいほど早く停止します。
void MoveTo(string id, int targetX, float speed)
指定X座標へ移動させます。
targetX: 目標X座標speed: 移動速度
void PlayAction(string id, CharacterAnimType type)
登録済みのアニメーションを再生します。終了後はIdleに戻ります。
void Stop(string id)
移動やアクションを強制停止し、Idle状態に戻します。
void SetClipping(string id, bool enable, int minX, int maxX)
移動範囲制限(クリッピング)を設定します。範囲外に出ると反転します。
enable: 有効無効minX, maxX: 制限範囲(X座標)
void Jump(string id, float vx, float vy)
キャラクターに速度を直接与えてジャンプさせます。
vx, vy: 初速 (Yは上方向がマイナス)
bool IsMoving(string id)
自動移動中(MoveTo)かどうかを返します。
bool IsOnGround(string id)
接地しているかどうかを返します。
Vector2 GetPos(string id)
キャラクターの現在座標を取得します。
- 戻り値: 座標 (Vector2)。存在しない場合は Vector2.Zero を返します。
Sample Code
// In Initialize()
// 1. Add Character "player" at (100, 300)
Ton.character.AddCharacter("player", 100, 300);
// 2. Register Animations
Ton.character.AddAnim("player", CharacterAnimType.Idle, "player_sheet", 0, 0, 32, 32, 4, 200);
Ton.character.AddAnim("player", CharacterAnimType.Walk, "player_sheet", 0, 32, 32, 32, 4, 100);
Ton.character.AddAnim("player", CharacterAnimType.Jump, "player_sheet", 0, 64, 32, 32, 4, 100);
Ton.character.AddAnim("player", CharacterAnimType.Surprise, "player_sheet", 0, 96, 32, 32, 4, 100, false);
// 3. Set Physics
Ton.character.SetPhysics("player", true, true, 5.0f);
// In Update()
// 4. Control (Example: Move when key is pressed)
if (Ton.Input.IsKeyDown(Keys.Right))
{
// Move to X=500 with speed 240.0 (px/sec)
Ton.character.MoveTo("player", 500, 240.0f);
}
// Perform One-shot Action
if (Ton.Input.IsTrigger(Keys.Z))
{
Ton.character.PlayAction("player", CharacterAnimType.Surprise);
}
// Patrol (Round Trip) - usually called once, maybe in Initialize or event
// Ton.character.RoundTrip("enemy1", 100, 120.0f);