Ejemplo n.º 1
0
 /// <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);
 }
Ejemplo n.º 2
0
 /// <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;
 }
Ejemplo n.º 3
0
 /// <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);
 }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
 /// <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);
 }
Ejemplo n.º 6
0
 /// <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);
     }
 }
Ejemplo n.º 7
0
        /// <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;
        }
Ejemplo n.º 8
0
        /// <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;
            }
        }
Ejemplo n.º 9
0
        /// <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));
        }
Ejemplo n.º 10
0
 /// <summary>ダメージを与えます。</summary>
 /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param>
 /// <param name="value">ダメージ値(負数で回復)。</param>
 /// <returns>続行可能な場合、true。</returns>
 public abstract bool damage(Character.CharacterAccessor accessor, int value);
Ejemplo n.º 11
0
 /// <summary>1フレーム分の更新処理を実行します。</summary>
 /// <param name="accessor">この状態を適用されたオブジェクトへのアクセサ。</param>
 public virtual void update(IEntityAccessor accessor)
 {
     Character.CharacterAccessor chr = (Character.CharacterAccessor)accessor;
     chr.position += chr.velocity;
 }
Ejemplo n.º 12
0
 /// <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);
 }