Ejemplo n.º 1
0
        public override bool Update(GameTime gameTime)
        {
            double dt = gameTime.ElapsedGameTime.TotalSeconds;
            bool flg = true;
            time += gameTime.ElapsedGameTime;

            if (RecVisible.Width < maxSize)
            {
                double ex = Math.Min(maxSize, RecVisible.Width + expandSpeed * dt) / RecVisible.Width;
                RectangleD.ExtendRect(RecVisible, ex, ex, RecVisible);
                time = TimeSpan.Zero;
                Chase();
                flg = false;
            }
            else if (color != maxColor)
            {
                color = new Vector3(
                    (float)Math.Min(color.X + dColor.X * dt, 1),
                    (float)Math.Min(color.Y + dColor.Y * dt, 1),
                    (float)Math.Min(color.Z + dColor.Z * dt, 1)
                    );
                EmissiveColor = color;

                if (time > TimeSpan.FromSeconds(stopTime))
                {
                    // 敵(target1)を追尾する
                    velocity = target1.RecCollision.Center;
                    velocity -= RecVisible.Center;
                    if (velocity == Vector2.Zero)
                    {
                        velocity.X = 1;
                    }
                    velocity.Normalize();
                    velocity.X *= (float)speed;
                    velocity.Y *= (float)speed;
                    RecVisible.Offset(velocity.X * dt, velocity.Y * dt);

                    // 何かにあたったら爆発
                    flg = false;
                    ArrayList ls = new ArrayList(scene.SolidList);
                    if (owner != 0) ls.Add(scene.Character1P);
                    if (owner != 1) ls.Add(scene.Character2P);
                    Hashtable ht = Collision.GetColState(this, ls);
                    foreach (DictionaryEntry de in ht)
                    {
                        velocity = Vector2.Zero;
                        flg = true;
                        break;
                    }
                    if (flg == false)
                    {
                        ht = Collision.GetColState(this, scene.AttackerList);
                        foreach (DictionaryEntry de in ht)
                        {
                            if ((de.Key).GetType() == typeof(AttackArea))
                            {
                                AttackArea a = (AttackArea)(de.Key);
                                if (a.IsTarget[owner] == false)
                                {
                                    continue;
                                }
                            }
                            velocity = Vector2.Zero;
                            flg = true;
                            break;
                        }
                    }
                }
                else
                {
                    flg = false;
                }
            }
            else
            {
                flg = true;
            }

            Depth = RecVisible.Width;
            attackArea.RecCollision.Copy(RecVisible);

            if (flg)
            {
                Object o = scene.Parameters["AttackArea"];
                AttackArea tmp = null;
                if (o != null)
                {
                    tmp = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(RecVisible, eX, eY));
                    tmp.NotAttack(owner);
                    tmp.SetExpandSpeed(attackExpandSpeedX, attackExpandSpeedY);
                    tmp.SetTime(attackTime);
                    tmp.Power = power;
                    tmp.Damage = damage;
                    scene.EntityList.Add(tmp);
                    scene.AttackerList.Add(tmp);

                    Cue sound = GLOBAL.soundBank.GetCue("bomb");
                    sound.Play();
                }
                o = scene.Parameters["ExplosionParticles"];
                if (o != null)
                {
                    scene.EntityList.Add(new ParticleManager(scene, "ExplosionParticles", RecCollision.Center));
                }
                attackArea.Dispose();
                Dispose();
            }

            return base.Update(gameTime);
        }
Ejemplo n.º 2
0
        public void Initialize()
        {
            Object o;
            minSize = double.Parse((o = parameters["minSize"]) != null ? (string)o : "0.2");
            maxSize = double.Parse((o = parameters["maxSize"]) != null ? (string)o : "0.2");
            double expandTime = double.Parse((o = parameters["expandTime"]) != null ? (string)o : "0.2");
            expandSpeed = (maxSize - minSize) / expandTime;
            double explosionTime = double.Parse((o = parameters["explosionTime"]) != null ? (string)o : "0.2");
            minColor = new Vector3(
                float.Parse((o = parameters["minColorX"]) != null ? (string)o : "1"),
                float.Parse((o = parameters["minColorY"]) != null ? (string)o : "1"),
                float.Parse((o = parameters["minColorZ"]) != null ? (string)o : "1")
                );
            maxColor = new Vector3(
               float.Parse((o = parameters["maxColorX"]) != null ? (string)o : "1"),
               float.Parse((o = parameters["maxColorY"]) != null ? (string)o : "1"),
               float.Parse((o = parameters["maxColorZ"]) != null ? (string)o : "1")
               );
            dColor = new Vector3(
                (float)((maxColor.X - minColor.X) / explosionTime),
                (float)((maxColor.Y - minColor.Y) / explosionTime),
                (float)((maxColor.Z - minColor.Z) / explosionTime)
                );
            color = minColor;
            power = double.Parse((o = parameters["attackPower"]) != null ? (string)o : "0.2");
            damage = double.Parse((o = parameters["attackDamage"]) != null ? (string)o : "0.2");

            velocity = Vector2.Zero;
            speed = double.Parse((o = parameters["speed"]) != null ? (string)o : "5");
            time = TimeSpan.Zero;

            MakeModel("");

            double ex = minSize / rect.Width;
            double ey = minSize / rect.Height;
            RectangleD.ExtendRect(rect, ex, ey, RecVisible);
            Depth = RecVisible.Width;
            RecCollision = RecVisible;

            attackMinSizeX = double.Parse((o = parameters["attackMinSizeX"]) != null ? (string)o : "1");
            attackMinSizeY = double.Parse((o = parameters["attackMinSizeY"]) != null ? (string)o : "1");
            attackMaxSizeX = double.Parse((o = parameters["attackMaxSizeX"]) != null ? (string)o : "1");
            attackMaxSizeY = double.Parse((o = parameters["attackMaxSizeY"]) != null ? (string)o : "1");
            attackTime = double.Parse((o = parameters["attackTime"]) != null ? (string)o : "1");
            attackExpandSpeedX = (attackMaxSizeX - attackMinSizeX) / attackTime;
            attackExpandSpeedY = (attackMaxSizeY - attackMinSizeY) / attackTime;

            EmissiveColor = minColor;

            // 自分を追尾するAttakAreaをつくる
            o = scene.Parameters["AttackArea"];
            if (o != null)
            {
                attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(RecVisible, 1, 1));
                attackArea.NotAttack(owner);
                attackArea.Power = power;
                attackArea.Damage = damage;
                scene.EntityList.Add(attackArea);
                scene.AttackerList.Add(attackArea);
            }

            if (owner != 0) target1 = scene.Character1P;
            if (owner != 1) target1 = scene.Character2P;

            stopTime = double.Parse((o = parameters["stopTime"]) != null ? (string)o : "0");
        }
Ejemplo n.º 3
0
        bool UpSmashAnimation(GameTime gameTime)
        {
            #region 1.初期化
            if (time <= gameTime.ElapsedGameTime)
            {
                mi.recVisible.Copy(normalRectangle);
                mi.depth = 1;

                normalizeRectangle = false;

                pileFlg = piling;
                upSmashRot = upSmashRotSpeed = 0;
                upSmashRotAccel = Math.Abs(upSmashRotAccel) * (direction.X > 0 ? -1 : 1);
                upSmashA = 0;

                tmpEmissiveColor = mi.emissiveColor;
                upSmashTime = 0;
            }

            #endregion

            #region 2.アニメーション

            double dt = gameTime.ElapsedGameTime.TotalSeconds;

            // Write your logic
            switch (pileFlg)
            {
                case piling:
                    if (time.TotalSeconds >= maxPileTime || input.isOn(BUTTON.A, player.dev) == false)
                    {
                        pileFlg = finishPiling;
                    }

                    upSmashRotSpeed += upSmashRotAccel * dt;
                    upSmashRot += upSmashRotSpeed * dt;

                    mi.recVisible.Top3D = normalRectangle.Top3D - maxUpSmashA * Math.Sin((float)(0.5 * MathHelper.Pi * time.TotalSeconds / maxPileTime));
                    break;
                case finishPiling:
                    pileFlg = afterPiling;
                    upSmashTime = time.TotalSeconds + GetSmashPower(minUpSmashTime, maxUpSmashTime);
                    upSmashA = GetSmashPower(0, maxUpSmashA);

                    Object o = scene.Parameters["AttackArea"];
                    if (o != null)
                    {
                        attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(mi.recCollision, upSmasheX, upSmasheY));
                        attackArea.Follow(this);
                        attackArea.NotAttack(player.id);
                        attackArea.Power = GetSmashPower(minUpSmashPower, maxUpSmashPower);
                        attackArea.Damage = GetSmashPower(minUpSmashDamage, maxUpSmashDamage);
                        scene.EntityList.Add(attackArea);
                        scene.AttackerList.Add(attackArea);
                    }
                    Cue c = GLOBAL.soundBank.GetCue("smash");
                    c.Play();
                    break;
                case afterPiling:
                    if (mi.recVisible.Top3D < normalRectangle.Top3D + upSmashA)
                    {
                        mi.recVisible.Top3D += upSmashExtendSpeed * dt;
                    }
                    if (time.TotalSeconds > upSmashTime)
                    {
                        endAnimation = true;
                    }
                    break;
                default:
                    break;
            }

            upSmashRot += upSmashRotSpeed * dt;

            // 横方向の拡大
            ey = mi.recVisible.Height / normalRectangle.Height;
            ex = 1 / Math.Sqrt(ey);
            double t = mi.recVisible.Top3D;
            RectangleD.ExtendRect(normalRectangle, ex, ey, mi.recVisible);
            mi.depth = mi.defaultDepth * ex;
            mi.recVisible.Offset(0, (mi.recVisible.Height - normalRectangle.Height) * 0.5);
            if (attackArea != null)
            {
                RectangleD.ExtendRect(mi.recVisible, upSmasheX, upSmasheY, attackArea.RecCollision);
            }
            mi.depth = ex;

            if (CheckFloat(gameTime))
            {
                AnimFloat(gameTime);
            }
            else
            {
                if (pileFlg == piling)
                {
                    AnimStop(gameTime);
                }
            }

            mi.rotation = new Vector3(0, (float)upSmashRot, 0);
            mi.emissiveColor = new Vector3(
                (float)Math.Min(mi.emissiveColor.X + 1.0 * dt / maxPileTime, 1),
                (float)Math.Min(mi.emissiveColor.Y + 1.0 * dt / maxPileTime, 1),
                (float)Math.Min(mi.emissiveColor.Z + 1.0 * dt / maxPileTime, 1));

            #endregion

            #region 3、次のアニメーションへの遷移判定
            Animation prevAnim = anim;
            NextAnimation[] nextAnim = new NextAnimation[]{
                new NextAnimation(Animation.Dead,false,CheckDead,true),
                new NextAnimation(Animation.Attacked,false,CheckAttacked,true),
                new NextAnimation(Animation.Ground,false,CheckGround,endAnimation),
                new NextAnimation(Animation.Float,false,CheckFloat,endAnimation),
                new NextAnimation(Animation.Run,true,null,endAnimation),
                new NextAnimation(Animation.Walk,true,null,endAnimation),
                new NextAnimation(Animation.Stop,false,null,endAnimation),
                new NextAnimation(Animation.UpSmash,false,null,true),
            };

            anim = FindNextAnimation(nextAnim, gameTime);
            if (anim == Animation.None)
            {
                anim = prevAnim;
            }

            #endregion

            #region 4、アニメーションが遷移するときの処理
            if (anim != prevAnim)
            {
                commandFlg[(int)Animation.A] = false;
                commandFlg[(int)Animation.UpA] = false;
                commandFlg[(int)Animation.DownA] = false;
                commandFlg[(int)Animation.UpA] = false;
                commandFlg[(int)Animation.UpSmash] = false;
                commandFlg[(int)Animation.UpSmash] = false;
                commandFlg[(int)Animation.DownSmash] = false;
                normalizeRectangle = true;
                if (attackArea != null) attackArea.Dispose();
                mi.emissiveColor = tmpEmissiveColor;
                mi.rotation = Vector3.Zero;
            }

            #endregion

            return true;
        }
Ejemplo n.º 4
0
        public override bool Update(GameTime gameTime)
        {
            double dt = gameTime.ElapsedGameTime.TotalSeconds;
            bool flg = true;

            if (RecVisible.Width < maxSize)
            {
                double ex = Math.Min(maxSize, RecVisible.Width + expandSpeed * dt) / RecVisible.Width;
                RectangleD.ExtendRect(RecVisible, ex, ex, RecVisible);
                time = TimeSpan.Zero;
                Chase();
                flg = false;
            }
            else if (color != maxColor)
            {
                color = new Vector3(
                    (float)Math.Min(color.X + dColor.X * dt, 1),
                    (float)Math.Min(color.Y + dColor.Y * dt, 1),
                    (float)Math.Min(color.Z + dColor.Z * dt, 1)
                    );
                EmissiveColor = color;

                if (velocity == Vector2.Zero)
                {
                    flg = false;
                    Hashtable ht = Collision.GetColState(this, scene.AttackerList);
                    foreach (DictionaryEntry de in ht)
                    {
                        Entity he = (Entity)(de.Key);
                        if (he.GetType() == typeof(AttackArea) && ((AttackArea)he).IsTarget[owner] == true)
                        {
                            flg = true;
                            break;
                        }
                        else
                        {
                            velocity = RecCollision.Center - he.RecCollision.Center;
                            if (velocity == Vector2.Zero)
                            {
                                velocity.X = 1;
                            }
                            velocity.Normalize();
                            velocity.X *= (float)speed;
                            velocity.Y *= (float)speed;
                            tmp = he;
                            Cue c = GLOBAL.soundBank.GetCue("B2");
                            c.Play();
                            break;
                        }
                    }
                }
                else
                {
                    RecVisible.Offset(velocity.X * dt, velocity.Y * dt);
                    flg = false;
                    ArrayList ls = new ArrayList(scene.SolidList);
                    if (owner != 0) ls.Add(scene.Character1P);
                    if (owner != 1) ls.Add(scene.Character2P);
                    Hashtable ht = Collision.GetColState(this, ls);
                    foreach (DictionaryEntry de in ht)
                    {
                        velocity = Vector2.Zero;
                        flg = true;
                        break;
                    }
                    if (flg == false)
                    {
                        ht = Collision.GetColState(this, scene.AttackerList);
                        foreach (DictionaryEntry de in ht)
                        {
                            if (de.Key == tmp)
                            {
                                continue;
                            }
                            velocity = Vector2.Zero;
                            flg = true;
                            break;
                        }
                    }
                }
            }
            else
            {
                flg = true;
            }

            Depth = RecVisible.Width;

            if (flg)
            {
                Object o = scene.Parameters["AttackArea"];
                AttackArea attackArea = null;
                if (o != null)
                {
                    Vector2 v = RecVisible.Center;
                    attackArea = new AttackArea(scene, (Hashtable)o, new RectangleD(v.X - attackMinSizeX * 0.5, v.Y - attackMinSizeY * 0.5, attackMinSizeX, attackMinSizeY));
                    attackArea.NotAttack(owner);
                    attackArea.SetExpandSpeed(attackExpandSpeedX, attackExpandSpeedY);
                    attackArea.SetTime(attackTime);
                    attackArea.Power = attackPower;
                    attackArea.Damage = attackDamage;
                    scene.EntityList.Add(attackArea);
                    scene.AttackerList.Add(attackArea);

                    Cue sound = GLOBAL.soundBank.GetCue("bomb");
                    sound.Play();
                }

                scene.EntityList.Add(new ParticleManager(scene, "ExplosionParticles", RecCollision.Center));

                Dispose();
            }

            return base.Update(gameTime);
        }
Ejemplo n.º 5
0
        bool UpAAnimation(GameTime gameTime)
        {
            #region 1.初期化
            if (time <= gameTime.ElapsedGameTime)
            {
                mi.recVisible.Copy(normalRectangle);

                normalizeRectangle = false;

                attackArea = null;
                Object o = scene.Parameters["AttackArea"];
                if (o != null)
                {
                    attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(mi.recCollision, upAeX, upAeY));
                    attackArea.Follow(this);
                    attackArea.NotAttack(player.id);
                    attackArea.Power = upAPower;
                    attackArea.Damage = upADamage;
                    attackArea.manual = true;
                    scene.EntityList.Add(attackArea);
                    scene.AttackerList.Add(attackArea);
                }

                ex = ey = 1.0;
                ox = oy = 0;
                Cue c = GLOBAL.soundBank.GetCue("SA");
                c.Play();
            }

            #endregion

            #region 2.アニメーション

            double dt = gameTime.ElapsedGameTime.TotalSeconds;

            // Write your logic

            // モデルを伸縮
            if (time < TimeSpan.FromSeconds(upATime1))          // 伸ばす
            {
                ey += upAExtendSpeed * dt;
                double s = 1 / Math.Sqrt(ey);
                mi.depth = mi.defaultDepth * s;
                ex = s;
            }
            else if (time < TimeSpan.FromSeconds(upATime2 + upATime1))
            {

            }
            else if (time < TimeSpan.FromSeconds(upATime3 + upATime2 + upATime1))  // 縮める
            {
                ey -= upAExtendSpeed * dt;
                double s = 1 / Math.Sqrt(ex);
                mi.depth = mi.defaultDepth * s;
                ex = s;
            }
            else
            {
                endAnimation = true;
            }

            RectangleD.ExtendRect(normalRectangle, ex, ey, mi.recVisible);

            // ちょっと上下にずらす
            oy = mi.recVisible.Height - normalRectangle.Height;
            oy *= 0.5;
            mi.recVisible.Y += oy;
            RectangleD.ExtendRect(mi.recVisible, AeX, AeY, attackArea.RecCollision);

            if (CheckFloat(gameTime))
            {
                AnimFloat(gameTime);
            }
            else
            {
                AnimStop(gameTime);
            }

            mi.rotation = new Vector3(0, 0, 0);

            #endregion

            #region 3、次のアニメーションへの遷移判定
            Animation prevAnim = anim;
            NextAnimation[] nextAnim = new NextAnimation[]{
                new NextAnimation(Animation.Dead,false,CheckDead,true),
                new NextAnimation(Animation.Attacked,false,CheckAttacked,true),
                new NextAnimation(Animation.Ground,false,CheckGround,endAnimation),
                new NextAnimation(Animation.Float,false,CheckFloat,endAnimation),
                new NextAnimation(Animation.Run,true,null,endAnimation),
                new NextAnimation(Animation.Walk,true,null,endAnimation),
                new NextAnimation(Animation.Stop,false,null,endAnimation),
                new NextAnimation(Animation.UpA,false,null,true),
            };

            anim = FindNextAnimation(nextAnim, gameTime);
            if (anim == Animation.None)
            {
                anim = prevAnim;
            }

            #endregion

            #region 4、アニメーションが遷移するときの処理
            if (anim != prevAnim)
            {
                mi.recCollision = mi.recVisible;
                commandFlg[(int)Animation.A] = false;
                commandFlg[(int)Animation.UpA] = false;
                commandFlg[(int)Animation.DownA] = false;
                commandFlg[(int)Animation.SideA] = false;
                commandFlg[(int)Animation.SideSmash] = false;
                commandFlg[(int)Animation.UpSmash] = false;
                commandFlg[(int)Animation.DownSmash] = false;
                normalizeRectangle = true;
                if (attackArea != null) attackArea.Dispose();
            }

            #endregion

            return true;
        }
Ejemplo n.º 6
0
        bool SideSmashAnimation(GameTime gameTime)
        {
            #region 1.初期化
            if (time <= gameTime.ElapsedGameTime)
            {
                mi.recVisible.Copy(normalRectangle);

                normalizeRectangle = false;

                pileFlg = piling;
                sideSmashRot = sideSmashRotSpeed = sideSmashSpeed = 0;
                sideSmashRotAccel = Math.Abs(sideSmashRotAccel) * (direction.X > 0 ? -1 : 1);

                tmpEmissiveColor = mi.emissiveColor;
                sideSmashTime1 = 0;
            }

            #endregion

            #region 2.アニメーション

            double dt = gameTime.ElapsedGameTime.TotalSeconds;

            // Write your logic
            switch (pileFlg)
            {
                case piling:
                    if (time.TotalSeconds >= maxPileTime || input.isOn(BUTTON.A, player.dev) == false)
                    {
                        pileFlg = finishPiling;
                    }

                    sideSmashSpeed = 0;
                    sideSmashRotSpeed += sideSmashRotAccel * dt;
                    break;
                case finishPiling:
                    pileFlg = afterPiling;
                    sideSmashTime = time.TotalSeconds + GetSmashPower(minSideSmashTime, maxSideSmashTime);

                    sideSmashSpeed = GetSmashPower(minSideSmashSpeed, maxSideSmashSpeed);
                    sideSmashSpeed *= direction.X > 0 ? 1 : -1;
                    velocity.X += (float)sideSmashSpeed;

                    Object o = scene.Parameters["AttackArea"];
                    if (o != null)
                    {
                        attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(mi.recCollision, sideSmasheX, sideSmasheY));
                        attackArea.Follow(this);
                        attackArea.NotAttack(player.id);
                        attackArea.Power = GetSmashPower(minSideSmashPower, maxSideSmashPower);
                        attackArea.Damage = GetSmashPower(minSideSmashDamage, maxSideSmashDamage);
                        scene.EntityList.Add(attackArea);
                        scene.AttackerList.Add(attackArea);
                    }
                    Cue c = GLOBAL.soundBank.GetCue("smash");
                    c.Play();
                    break;
                case afterPiling:
                    if (time.TotalSeconds >= sideSmashTime)
                    {
                        endAnimation = true;
                    }
                    break;
                default:
                    break;
            }

            sideSmashRot += sideSmashRotSpeed * dt;

            if (CheckFloat(gameTime))
            {
                AnimFloat(gameTime);
            }
            else
            {
                if (pileFlg == piling)
                {
                    AnimStop(gameTime);
                }
                else
                {
                    // 速度のy方向は0に
                    velocity.Y = 0;

                    // 速度*時間だけ動かす
                    OffsetWithAdjust(gameTime);
                }
            }

            mi.rotation = new Vector3(0, 0, (float)sideSmashRot);
            mi.emissiveColor = new Vector3(
                (float)Math.Min(mi.emissiveColor.X + 1.0 * dt / maxPileTime, 1),
                (float)Math.Min(mi.emissiveColor.Y + 1.0 * dt / maxPileTime, 1),
                (float)Math.Min(mi.emissiveColor.Z + 1.0 * dt / maxPileTime, 1));

            #endregion

            #region 3、次のアニメーションへの遷移判定
            Animation prevAnim = anim;
            NextAnimation[] nextAnim = new NextAnimation[]{
                new NextAnimation(Animation.Dead,false,CheckDead,true),
                new NextAnimation(Animation.Attacked,false,CheckAttacked,true),
                new NextAnimation(Animation.Jump,true,CheckJump,true),
                new NextAnimation(Animation.Ground,false,CheckGround,endAnimation),
                new NextAnimation(Animation.Float,false,CheckFloat,endAnimation),
                new NextAnimation(Animation.Run,true,null,endAnimation),
                new NextAnimation(Animation.Walk,true,null,endAnimation),
                new NextAnimation(Animation.Stop,false,null,endAnimation),
                new NextAnimation(Animation.SideSmash,false,null,true),
            };

            anim = FindNextAnimation(nextAnim, gameTime);
            if (anim == Animation.None)
            {
                anim = prevAnim;
            }

            #endregion

            #region 4、アニメーションが遷移するときの処理
            if (anim != prevAnim)
            {
                commandFlg[(int)Animation.A] = false;
                commandFlg[(int)Animation.UpA] = false;
                commandFlg[(int)Animation.DownA] = false;
                commandFlg[(int)Animation.SideA] = false;
                commandFlg[(int)Animation.SideSmash] = false;
                commandFlg[(int)Animation.UpSmash] = false;
                commandFlg[(int)Animation.DownSmash] = false;
                normalizeRectangle = true;
                if (attackArea != null) attackArea.Dispose();
                mi.emissiveColor = tmpEmissiveColor;
                mi.rotation = Vector3.Zero;
                velocity.X -= (float)sideSmashSpeed;
                if (direction.X > 0)
                {
                    velocity.X = Math.Max(velocity.X, 0.0f);
                }
                else
                {
                    velocity.X = Math.Min(velocity.X, 0.0f);
                }
            }

            #endregion

            return true;
        }
Ejemplo n.º 7
0
        bool SideAAnimation(GameTime gameTime)
        {
            #region 1.初期化
            if (time <= gameTime.ElapsedGameTime)
            {
                mi.recVisible.Copy(normalRectangle);

                normalizeRectangle = false;

                attackArea = null;
                Object o = scene.Parameters["AttackArea"];
                if (o != null)
                {
                    attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(mi.recCollision, sideAeX, sideAeY));
                    attackArea.Follow(this);
                    attackArea.NotAttack(player.id);
                    attackArea.Power = sideAPower;
                    attackArea.Damage = sideADamage;
                    attackArea.manual = true;
                    scene.EntityList.Add(attackArea);
                    scene.AttackerList.Add(attackArea);
                }

                if (input.isOn(BUTTON.LEFT, player.dev))
                {
                    direction = new Vector3(-1, 0, 0);
                    tmpVelocity = new Vector2(-(float)sideASpeed, 0);
                }
                else
                {
                    direction = new Vector3(1, 0, 0);
                    tmpVelocity = new Vector2((float)sideASpeed, 0);
                }
                velocity += tmpVelocity;

                ex = ey = 1.0;
                Cue c = GLOBAL.soundBank.GetCue("SA");
                c.Play();
            }

            #endregion

            #region 2.アニメーション

            double dt = gameTime.ElapsedGameTime.TotalSeconds;

            // Write your logic

            // モデルを伸縮
            if (time < TimeSpan.FromSeconds(sideATime1))
            {
                ex += sideAExtendSpeed * dt;
                double s = 1 / Math.Sqrt(ex);
                mi.depth = mi.defaultDepth * s;
                ey = s;
            }
            else if (time < TimeSpan.FromSeconds(sideATime2 + sideATime1))
            {

            }
            else if (time < TimeSpan.FromSeconds(sideATime3 + sideATime2 + sideATime1))
            {
                ex -= sideAExtendSpeed * dt;
                double s = 1 / Math.Sqrt(ex);
                mi.depth = mi.defaultDepth * s;
                ey = s;
            }
            else
            {
                endAnimation = true;
            }

            RectangleD.ExtendRect(normalRectangle, ex, ey, mi.recVisible);
            RectangleD.ExtendRect(mi.recVisible, AeX, AeY, attackArea.RecCollision);

            mi.recCollision = new RectangleD(RecVisible.X, normalRectangle.Y, RecVisible.Width, normalRectangle.Height);

            if (CheckFloat(gameTime))
            {
                AnimFloat(gameTime);
            }
            else
            {
                // 速度のy方向は0に
                velocity.Y = 0;

                // 速度*時間だけ動かす
                OffsetWithAdjust(gameTime);
            }

            mi.rotation = new Vector3(0, 0, 0);

            #endregion

            #region 3、次のアニメーションへの遷移判定
            Animation prevAnim = anim;
            NextAnimation[] nextAnim = new NextAnimation[]{
                new NextAnimation(Animation.Dead,false,CheckDead,true),
                new NextAnimation(Animation.Attacked,false,CheckAttacked,true),
                new NextAnimation(Animation.Float,false,CheckFloat,endAnimation),
                new NextAnimation(Animation.Run,true,null,endAnimation),
                new NextAnimation(Animation.Walk,true,null,endAnimation),
                new NextAnimation(Animation.Stop,false,null,endAnimation),
                new NextAnimation(Animation.SideA,false,null,true),
            };

            anim = FindNextAnimation(nextAnim, gameTime);
            if (anim == Animation.None)
            {
                anim = prevAnim;
            }

            #endregion

            #region 4、アニメーションが遷移するときの処理
            if (anim != prevAnim)
            {
                commandFlg[(int)Animation.A] = false;
                commandFlg[(int)Animation.UpA] = false;
                commandFlg[(int)Animation.DownA] = false;
                commandFlg[(int)Animation.SideA] = false;
                commandFlg[(int)Animation.SideSmash] = false;
                commandFlg[(int)Animation.UpSmash] = false;
                commandFlg[(int)Animation.DownSmash] = false;
                normalizeRectangle = true;
                mi.recVisible.Copy(normalRectangle);
                mi.recCollision = mi.recVisible;
                if (attackArea != null) attackArea.Dispose();
                velocity -= tmpVelocity;
                if (direction.X > 0)
                {
                    velocity.X = Math.Max(velocity.X, 0.0f);
                }
                else
                {
                    velocity.X = Math.Min(velocity.X, 0.0f);
                }
            }

            #endregion

            return true;
        }
Ejemplo n.º 8
0
        bool CubeUpBAnimation(GameTime gameTime)
        {
            #region 1.初期化
            if (time <= gameTime.ElapsedGameTime)
            {
                mi.recVisible.Copy(normalRectangle);
                mi.depth = 1;

                normalizeRectangle = false;

                attackArea = null;
                Object o = scene.Parameters["AttackArea"];
                if (o != null)
                {
                    attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(mi.recVisible, AeX, AeY));
                    attackArea.NotAttack(player.id);
                    attackArea.Follow(this);
                    attackArea.Power = APower;
                    attackArea.Damage = ADamage;
                    scene.EntityList.Add(attackArea);
                    scene.AttackerList.Add(attackArea);
                    Cue c = GLOBAL.soundBank.GetCue("UpB");
                    c.Play();
                }
            }

            #endregion

            #region 2.アニメーション

            double dt = gameTime.ElapsedGameTime.TotalSeconds;

            // Write your logic
            if (time < TimeSpan.FromSeconds(cubeUpBTime1))
            {
                mi.recVisible.Top3D = normalRectangle.Top3D - cubeUpBA * Math.Sin(MathHelper.Pi * time.TotalSeconds / cubeUpBTime1);
                OffsetWithAdjust(gameTime);
                cubeUpBBottom3D = cubeUpBBottom3D2 = mi.recVisible.Bottom3D;
            }
            else if (time < TimeSpan.FromSeconds(cubeUpBTime1 + cubeUpBTime2))
            {
                mi.recCollision = normalRectangle;
                velocity.X = 0;
                velocity.Y = (float)cubeUpBSpeed1;
                OffsetWithAdjust(gameTime);
                mi.recVisible.Bottom3D = cubeUpBBottom3D;
            }
            else if (time < TimeSpan.FromSeconds(cubeUpBTime1 + cubeUpBTime2 + cubeUpBTime3))
            {
                double A = normalRectangle.Bottom3D - cubeUpBBottom3D2;
                double t = MathHelper.PiOver2 * (time.TotalSeconds - cubeUpBTime1 - cubeUpBTime2) / cubeUpBTime3;
                mi.recVisible.Bottom3D = normalRectangle.Bottom3D - A * Math.Cos(t);
            }
            else
            {
                velocity = new Vector2(0, (float)cubeUpBSpeed2);
                endAnimation = true;
            }

            attackArea.RecVisible = RectangleD.ExtendRect(mi.recVisible, AeX, AeY);

            #endregion

            #region 3、次のアニメーションへの遷移判定
            Animation prevAnim = anim;
            NextAnimation[] nextAnim = new NextAnimation[]{
                new NextAnimation(Animation.Dead,false,CheckDead,true),
                new NextAnimation(Animation.Attacked,false,CheckAttacked,true),
                new NextAnimation(Animation.Ground,false,CheckGround,endAnimation),
                new NextAnimation(Animation.Float,false,CheckFloat,endAnimation),
                new NextAnimation(Animation.Run,true,null,endAnimation),
                new NextAnimation(Animation.Walk,true,null,endAnimation),
                new NextAnimation(Animation.Stop,false,null,endAnimation),
                new NextAnimation(Animation.UpB,false,null,true),
            };

            anim = FindNextAnimation(nextAnim, gameTime);
            if (anim == Animation.None)
            {
                anim = prevAnim;
            }

            #endregion

            #region 4、アニメーションが遷移するときの処理
            if (anim != prevAnim)
            {
                commandFlg[(int)Animation.B] = false;
                commandFlg[(int)Animation.UpB] = false;
                commandFlg[(int)Animation.DownB] = false;
                commandFlg[(int)Animation.SpecialB] = false;

                mi.recCollision = mi.recVisible;
                mi.recVisible.Copy(normalRectangle);
                Depth = 1;
                normalizeRectangle = true;
                upBFlg = false;

                if (attackArea != null) attackArea.Dispose();
            }

            #endregion

            return true;
        }
Ejemplo n.º 9
0
        bool AAnimation(GameTime gameTime)
        {
            #region 1.初期化
            if (time <= gameTime.ElapsedGameTime)
            {
                mi.recVisible.Copy(normalRectangle);
                ARot = 0;

                attackArea = null;
                Object o = scene.Parameters["AttackArea"];
                if (o != null)
                {
                    attackArea = new AttackArea(scene, (Hashtable)o, RectangleD.ExtendRect(mi.recCollision, AeX, AeY));
                    attackArea.NotAttack(player.id);
                    attackArea.Follow(this);
                    attackArea.Power = APower;
                    attackArea.Damage = ADamage;
                    scene.EntityList.Add(attackArea);
                    scene.AttackerList.Add(attackArea);
                }
                Cue c = GLOBAL.soundBank.GetCue("A");
                c.Play();
            }

            #endregion

            #region 2.アニメーション

            double dt = gameTime.ElapsedGameTime.TotalSeconds;

            if (-360 < ARot && ARot < 360)
            {
                ARot += ARotSpeed * dt * (direction.X > 0 ? 1 : -1);
            }
            else
            {
                ARot = 0;
                endAnimation = true;
            }

            if (CheckFloat(gameTime))
            {
                AnimFloat(gameTime);
            }
            else
            {
                AnimStop(gameTime);
            }

            mi.rotation = new Vector3(0, (float)ARot, 0);

            #endregion

            #region 3、次のアニメーションへの遷移判定
            Animation prevAnim = anim;
            NextAnimation[] nextAnim = new NextAnimation[]{
                new NextAnimation(Animation.Dead,false,CheckDead,true),
                new NextAnimation(Animation.Attacked,false,CheckAttacked,true),
                new NextAnimation(Animation.Ground,false,CheckGround,endAnimation),
                new NextAnimation(Animation.Float,false,CheckFloat,endAnimation),
                new NextAnimation(Animation.Run,true,null,endAnimation),
                new NextAnimation(Animation.Walk,true,null,endAnimation),
                new NextAnimation(Animation.Stop,false,null,endAnimation),
                new NextAnimation(Animation.A,false,null,true),
            };

            anim = FindNextAnimation(nextAnim, gameTime);
            if (anim == Animation.None)
            {
                anim = prevAnim;
            }

            #endregion

            #region 4、アニメーションが遷移するときの処理
            if (anim != prevAnim)
            {
                commandFlg[(int)Animation.A] = false;
                commandFlg[(int)Animation.UpA] = false;
                commandFlg[(int)Animation.DownA] = false;
                commandFlg[(int)Animation.SideA] = false;
                commandFlg[(int)Animation.SideSmash] = false;
                commandFlg[(int)Animation.UpSmash] = false;
                commandFlg[(int)Animation.DownSmash] = false;
                if (attackArea != null)
                {
                    attackArea.Dispose();
                    attackArea = null;
                }
            }

            #endregion

            return true;
        }