/// <summary>1フレーム分の描画処理を実行します。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> /// <param name="graphics">グラフィック データ。</param> public virtual void draw(IEntityAccessor accessor, Graphics graphics) { Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor; graphics.spriteBatch.Draw(graphics.gameThumbnail, chr.position, null, chr.color, 0f, new Vector2(Graphics.RECT * 0.5f), chr.size / Graphics.RECT, SpriteEffects.None, 0f); }
/// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> public override void setup(IEntityAccessor accessor) { Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor; chr.color = Color.White; chr.size = SIZE; chr.position = defaultPosition; amount = DEFAULT_AMOUNT; }
/// <summary>ダメージを与えます。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> /// <param name="value">ダメージ値(負数で回復)。</param> /// <returns>続行可能な場合、true。</returns> public override bool damage(Character.CharacterAccessor accessor, int value) { if (value > 0) { accessor.position = defaultPosition; } amount -= value; return(amount >= 0); }
/// <summary> /// 敵機の移動速度と方角を初期化します。 /// </summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> /// <param name="speed">速度。</param> protected override void initVelocity(Character.CharacterAccessor accessor, float speed) { base.initVelocity(accessor, speed); // ここでベクトルをわざと乱して、精度を落とす Quaternion q = Quaternion.CreateFromAxisAngle( Vector3.UnitZ, (float)random.NextDouble() - 0.5f); accessor.velocity = Vector2.Transform(accessor.velocity, q); }
/// <summary> /// 1フレーム分の更新を行う時に呼び出されます。 /// </summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> public override void update(IEntityAccessor accessor) { if (accessor.counter >= HOMING_LIMIT) { accessor.entity.nextState = StateEnemyStraight.homing; } Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor; initVelocity(chr, chr.velocity.Length()); base.update(accessor); }
/// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> public override void setup(IEntityAccessor accessor) { Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor; chr.counter = 0; chr.size = SIZE; chr.color = color; if (!chr.entity.contains) { start(chr); } }
/// <summary>敵機の移動速度と方角を初期化します。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> /// <param name="speed">速度。</param> protected virtual void initVelocity(Character.CharacterAccessor accessor, float speed) { Character player = ScenePlay.instance.player; Vector2 v = player.position - accessor.position; if (v == Vector2.Zero) { // 長さが0だと単位ベクトル計算時にNaNが出るため対策 v = Vector2.UnitX; } v.Normalize(); accessor.velocity = v * speed; }
/// <summary>1フレーム分の更新処理を実行します。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> public override void update(IEntityAccessor accessor) { Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor; chr.velocity = createVelocity(); Vector2 prev = chr.position; base.update(accessor); if (!chr.entity.contains) { chr.position = prev; chr.velocity = Vector2.Zero; } }
/// <summary>休眠している敵機を起動します。。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> private void start(Character.CharacterAccessor accessor) { float aroundHalf = Game1.SCREEN.Width + Game1.SCREEN.Height; float aroundHalf_plusQ = Game1.SCREEN.Width * 2 + Game1.SCREEN.Height; int around = (int)aroundHalf * 2; int p = random.Next(around); Vector2 pos; if (p < Game1.SCREEN.Width || p >= aroundHalf && p < aroundHalf_plusQ) { pos.X = p % Game1.SCREEN.Width; pos.Y = p < aroundHalf ? 0 : Game1.SCREEN.Height - 1; } else { pos.X = p < aroundHalf ? 0 : Game1.SCREEN.Width - 1; pos.Y = p % Game1.SCREEN.Height; } accessor.position = pos; initVelocity(accessor, accessor.entity.firstVelocity + random.Next(1, 3)); }
/// <summary>ダメージを与えます。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> /// <param name="value">ダメージ値(負数で回復)。</param> /// <returns>続行可能な場合、true。</returns> public abstract bool damage(Character.CharacterAccessor accessor, int value);
/// <summary>1フレーム分の更新処理を実行します。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> public virtual void update(IEntityAccessor accessor) { Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor; chr.position += chr.velocity; }
/// <summary>ダメージを与えます。</summary> /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param> /// <param name="value">ダメージ値(負数で回復)。</param> /// <returns>続行可能な場合、true。</returns> public override bool damage(Character.CharacterAccessor accessor, int value) { accessor.entity.reset(); return(true); }