예제 #1
0
 protected virtual void DoMessages(double elapsedTime)
 {
     foreach (CmpMessage msg in ComponentMessages)
     {
         //0号攻击判定
         if (msg.Tag == CmpMessage.CollisionMasseageNormal)
         {
             CollisionMessages.CollisionMasseageNormal m =
                 msg as CollisionMessages.CollisionMasseageNormal;
             if (attackMessageBox.AllowAttack[0])
             {
                 this.Direction.rotate(180);
                 attackMessageBox.ClosePort(0);
                 double x, y, x1, y1;
                 x  = Position.X; y = Position.Y;
                 x1 = m.Position.X; y1 = m.Position.Y;
                 Vector2D vct = new Vector2D();
                 vct.X = x - x1;
                 vct.Y = y - y1;
                 vct.Normalize();
                 this.Direction.X = vct.X;
                 this.Direction.Y = vct.Y;
             }
         }
     }
     ComponentMessages.Clear();
 }
예제 #2
0
 public Direct_BlueKnife(TextureManager texturemanager, Vector2D direction)
 {
     bulletbody = new BlueKnife(texturemanager);
     direction.Normalize();
     this.Direction.X = direction.X;
     this.Direction.Y = direction.Y;
     attack           = 20;
     speed            = 300;
 }
예제 #3
0
        Sprite BlueEsc;            //子弹消失时候的显示旋转蓝框

        public ReimuBullet_Follow(TextureManager texturemanager, Vector2D direction)
        {
            bulletbody = new BlueCard(texturemanager);
            direction.Normalize();
            this.Direction.X = direction.X;
            this.Direction.Y = direction.Y;
            attack           = 100;
            speed            = 400;

            BlueEsc = (new BlueBox(texturemanager)).GetSprite();
        }
예제 #4
0
        Sprite RedEsc;              //子弹消失时候的显示旋转红符


        public ReimuBullet_Dir(TextureManager texturemanager, Vector2D direction)
        {
            bulletbody = new RedCard(texturemanager);
            direction.Normalize();
            this.Direction.X = direction.X;
            this.Direction.Y = direction.Y;

            attack = 100;
            speed  = 800;

            RedEsc = (new RedBox(texturemanager)).GetSprite();
        }
예제 #5
0
        public override void Update(double elapsedTime)
        {
            base.Update(elapsedTime);
            double x   = Datas.CurrentPlayer.Position.X;
            double y   = Datas.CurrentPlayer.Position.Y;
            double dis = (Position.X - x) * (Position.X - x) + (Position.Y - y) * (Position.Y - y);

            if (dis < distance2)
            {
                Vector2D vct = new Vector2D(x - Position.X,
                                            y - Position.Y);
                vct.Normalize();
                x          = elapsedTime * vct.X * speed2;
                y          = elapsedTime * vct.Y * speed2;
                x          = Position.X + x;
                y          = Position.Y + y;
                Position.X = x;
                Position.Y = y;
            }
        }
예제 #6
0
        public override void Render(Renderer renderer)
        {
            //x,y是头的坐标位置,(以下是画出身体)
            float ag = 0;

            for (int i = bodycount - 1; i > 0; i--)
            {
                sprites[i].SetPosition(positions[i].X, positions[i].Y);
                //方向定义为指向前一个块
                Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
                                            positions[i].Y - positions[i - 1].Y);
                //如果点没有发生变化,则跳过本次循环
                if (vct.X == 0 && vct.Y == 0)
                {
                    continue;
                }
                vct.Normalize();
                ag = vct.getcurve();
                renderer.DrawSprite(sprites[i], positions[i].X, positions[i].Y, ag + 90);
            }
        }
예제 #7
0
        public override void Update(double elapsedTime, double x, double y)
        {
            _x = x; _y = y;
            multiSprite.Update(elapsedTime);
            multiSprites[1].Update(elapsedTime);
            effect.Update(elapsedTime);

            time_caculate += elapsedTime;
            if (l_x != _x || l_y != _y)
            {
                //向前移动一步
                for (int i = positions.Length - 1; i > 0; i--)
                {
                    Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
                                                positions[i].Y - positions[i - 1].Y);
                    if (vct.X != 0 && vct.Y != 0)
                    {
                        vct.Normalize();
                        float dis = Vector2D.distance(positions[i], positions[i - 1]);
                        //大于最大距离后加速
                        if (dis > max_distance)
                        {
                            speeds[i] = speeds[i - 1];
                        }
                        //小于最小距离后减速
                        else if (dis < min_distance)
                        {
                            float percent = 0;
                            percent   = (float)i / (bodycount - 1);
                            speeds[i] = speed - percent * speed * divide_percent;
                        }
                        positions[i].X -= vct.X * speeds[i] * (float)elapsedTime;
                        positions[i].Y -= vct.Y * speeds[i] * (float)elapsedTime;
                    }
                }
                positions[0].X = _x;
                positions[0].Y = _y;
                l_x            = _x; l_y = _y;
            }
        }
예제 #8
0
        public override void Render()
        {
            //for (int i = 1; i < dividecount; i++)
            //{
            //    Rays_sprites[i].SetPosition(positions[i].X, positions[i].Y);
            //    //方向定义为指向前一个块
            //    Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
            //        positions[i].Y - positions[i - 1].Y);
            //    vct.Normalize();
            //    ag = vct.getcurve();
            //    Stage1State._renderer.DrawSprite(Rays_sprites[i], positions[i].X, positions[i].Y, ag + 90);
            //}
            float ag = 0;

            for (int i = ((int)dividecount - 1); i > 0; i--)
            {
                Rays_sprites[i].SetPosition(positions[i].X, positions[i].Y);
                //方向定义为指向前一个块
                Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
                                            positions[i].Y - positions[i - 1].Y);
                //如果点没有发生变化,则跳过本次循环
                if (vct.X == 0 && vct.Y == 0)
                {
                    continue;
                }
                vct.Normalize();
                ag = vct.getcurve();
                double x = positions[i].X;
                double y = positions[i].Y;
                if (x < 200 && x > -200 && y > -10 && y < 450)
                {
                    Stage1State._renderer.DrawSprite(Rays_sprites[i], (float)positions[i].X, (float)positions[i].Y, ag + 90);
                }
            }

            ag = Direction.getcurve();
            Rays_sprites[0].SetPosition(positions[0].X, positions[0].Y);
            Stage1State._renderer.DrawSprite(Rays_sprites[0], (float)positions[0].X, (float)positions[0].Y, ag - 90);
        }
예제 #9
0
        float _alpha; //那段时间的透明值

        #endregion Fields

        #region Constructors

        public ReimuBullet_Dir(TextureManager texturemanager, Vector2D direction)
        {
            bulletbody = new RedCard(texturemanager);
            direction.Normalize();
            this.Direction.X = direction.X;
            this.Direction.Y = direction.Y;

            attack = 100;
            speed = 800;

            RedEsc = (new RedBox(texturemanager)).GetSprite();
        }
예제 #10
0
파일: Item.cs 프로젝트: lm458180997/Touhou
 public override void Update(double elapsedTime)
 {
     base.Update(elapsedTime);
     double x= Datas.CurrentPlayer.Position.X;
     double y = Datas.CurrentPlayer.Position.Y;
     double dis = (Position.X - x) * (Position.X - x) + (Position.Y - y) * (Position.Y - y);
     if (dis < distance2)
     {
         Vector2D vct = new Vector2D(x - Position.X,
                y - Position.Y);
         vct.Normalize();
         x = elapsedTime * vct.X * speed2;
         y = elapsedTime * vct.Y * speed2;
         x = Position.X + x;
         y = Position.Y + y;
         Position.X = x;
         Position.Y = y;
     }
 }
예제 #11
0
 public Direct_BlueKnife(TextureManager texturemanager , Vector2D direction)
 {
     bulletbody = new BlueKnife(texturemanager);
     direction.Normalize();
     this.Direction.X = direction.X;
     this.Direction.Y = direction.Y;
     attack = 20;
     speed = 300;
 }
예제 #12
0
 protected virtual void DoMessages(double elapsedTime)
 {
     foreach (CmpMessage msg in ComponentMessages)
     {
         //0号攻击判定
         if (msg.Tag == CmpMessage.CollisionMasseageNormal)
         {
             CollisionMessages.CollisionMasseageNormal m =
                 msg as CollisionMessages.CollisionMasseageNormal;
             if (attackMessageBox.AllowAttack[0])
             {
                 this.Direction.rotate(180);
                 attackMessageBox.ClosePort(0);
                 double x, y,x1,y1;
                 x = Position.X; y = Position.Y;
                 x1 = m.Position.X; y1 = m.Position.Y;
                 Vector2D vct = new Vector2D();
                 vct.X = x-x1;
                 vct.Y = y-y1;
                 vct.Normalize();
                 this.Direction.X = vct.X;
                 this.Direction.Y = vct.Y;
             }
         }
     }
     ComponentMessages.Clear();
 }
예제 #13
0
파일: Enemy.cs 프로젝트: lm458180997/Touhou
        public override void Update(double elapsedTime , double x,double y)
        {
            _x = x; _y = y;
            multiSprite.Update(elapsedTime);
            multiSprites[1].Update(elapsedTime);
            effect.Update(elapsedTime);

            time_caculate += elapsedTime;
            if (l_x != _x || l_y != _y)
            {
                //向前移动一步
                for (int i = positions.Length - 1; i > 0; i--)
                {
                    Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
                   positions[i].Y - positions[i - 1].Y);
                    if (vct.X != 0 && vct.Y != 0)
                    {
                        vct.Normalize();
                        float dis = Vector2D.distance(positions[i], positions[i - 1]);
                        //大于最大距离后加速
                        if (dis > max_distance)
                        {
                            speeds[i] = speeds[i - 1];
                        }
                        //小于最小距离后减速
                        else if (dis < min_distance)
                        {
                            float percent = 0;
                            percent = (float)i / (bodycount - 1);
                            speeds[i] = speed - percent * speed * divide_percent;
                        }
                        positions[i].X -= vct.X * speeds[i] * (float)elapsedTime;
                        positions[i].Y -= vct.Y * speeds[i] * (float)elapsedTime;
                    }

                }
                positions[0].X = _x;
                positions[0].Y = _y;
                l_x = _x; l_y = _y;
            }
        }
예제 #14
0
        public override void Update(double elapsedTime)
        {
            if (!working)
            {
                if (disposing)
                {
                    if (disposingTime > 0)
                    {
                        angle += (float)elapsedTime * 360 * 3;
                        _alpha = disposingTime / 12.0f;
                        disposingTime--;          //注销计时-1
                    }
                    else
                    {
                        disposing = false;
                        disabled  = true;         //在最后的旋转特效以后,同意注销此子弹
                    }
                }
                return;
            }

            speed += 2;         //每帧速度+1
            if (Datas.CurrentEnemys.Count > 0)
            {
                double distance     = 100000000;                      //取一个极端数值,使每一个求得值都会小于这个值
                double lastdistance = distance;
                foreach (Enemy e in Datas.CurrentEnemys)              //将离Player距离最短的作为跟踪对象
                {
                    if (e.Position.X < -200 || e.Position.X > 200 || e.Position.Y < -40 || e.Position.Y > 500)
                    {
                        continue;
                    }
                    distance = (Datas.CurrentPlayer.Position.X - e.Position.X) * (Datas.CurrentPlayer.Position.X - e.Position.X) +
                               (Datas.CurrentPlayer.Position.Y - e.Position.Y) * (Datas.CurrentPlayer.Position.Y - e.Position.Y);
                    if (distance < lastdistance)
                    {
                        FollowEnemy = e;
                    }
                    lastdistance = distance;
                }
            }
            if (Position.X < -190 || Position.X > 190 || Position.Y < -20 || Position.Y > 450)
            {
                speed    = 0;
                working  = false;
                disabled = true;
            }

            move(elapsedTime);
            //跟踪旋转
            if (FollowEnemy != null && !FollowEnemy.disabled && FollowEnemy.living)
            {
                Vector2D vct = new Vector2D(FollowEnemy.Position.X - Position.X,
                                            FollowEnemy.Position.Y - Position.Y);
                if (!(vct.X == 0 && vct.Y == 0))
                {
                    double distance = vct.X * vct.X + vct.Y * vct.Y;
                    double percent  = distance / 40000;
                    if (percent > 1)
                    {
                        percent = 1;
                    }
                    percent = 1 - percent;
                    float addangle = (float)percent * 1080;

                    vct.Normalize();
                    double vct_angle = vct.GetAngle();                 //目标的角度值
                    double dir_angle = Direction.GetAngle();           //当前方向的角度值
                    if (vct_angle < dir_angle)
                    {
                        if (dir_angle - vct_angle < 180)
                        {
                            Direction.rotate((addangle + rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 > dir_angle)        //如果左旋转后反而比原本角度更大,则证明旋转过度
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                            else if (d_2 < vct_angle)   //如果旋转后跑到方向角左边,则证明旋转过度
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                        }
                        else
                        {
                            Direction.rotate((-addangle - rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 < dir_angle)         //如果旋转后反而比原本角度更小,则证明旋转过了一周
                            {
                                if (d_2 > vct_angle)
                                {
                                    Direction.X = vct.X;
                                    Direction.Y = vct.Y;
                                }
                            }
                        }
                    }
                    else if (vct_angle > dir_angle)
                    {
                        if (vct_angle - dir_angle < 180)
                        {
                            Direction.rotate((-addangle - rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 < dir_angle)
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                            else if (d_2 > vct_angle)
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                        }
                        else
                        {
                            Direction.rotate((addangle + rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 > dir_angle)
                            {
                                if (d_2 < vct_angle)
                                {
                                    Direction.X = vct.X;
                                    Direction.Y = vct.Y;
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #15
0
        float _alpha; //那段时间的透明值

        #endregion Fields

        #region Constructors

        public ReimuBullet_Follow(TextureManager texturemanager, Vector2D direction)
        {
            bulletbody = new BlueCard(texturemanager);
            direction.Normalize();
            this.Direction.X = direction.X;
            this.Direction.Y = direction.Y;
            attack = 100;
            speed = 400;

            BlueEsc = (new BlueBox(texturemanager)).GetSprite() ;
        }
예제 #16
0
        public override void Render()
        {
            //for (int i = 1; i < dividecount; i++)
            //{
            //    Rays_sprites[i].SetPosition(positions[i].X, positions[i].Y);
            //    //方向定义为指向前一个块
            //    Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
            //        positions[i].Y - positions[i - 1].Y);
            //    vct.Normalize();
            //    ag = vct.getcurve();
            //    Stage1State._renderer.DrawSprite(Rays_sprites[i], positions[i].X, positions[i].Y, ag + 90);
            //}
            float ag = 0;
            for (int i = ((int)dividecount-1); i > 0; i--)
            {
                Rays_sprites[i].SetPosition(positions[i].X, positions[i].Y);
                //方向定义为指向前一个块
                Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
                    positions[i].Y - positions[i - 1].Y);
                //如果点没有发生变化,则跳过本次循环
                if (vct.X == 0 && vct.Y == 0)
                    continue;
                vct.Normalize();
                ag = vct.getcurve();
                double x = positions[i].X;
                double y = positions[i].Y;
                if (x < 200 && x > -200 && y > -10 && y < 450)
                    Stage1State._renderer.DrawSprite(Rays_sprites[i], (float)positions[i].X, (float)positions[i].Y, ag + 90);
            }

            ag = Direction.getcurve();
            Rays_sprites[0].SetPosition(positions[0].X, positions[0].Y);
            Stage1State._renderer.DrawSprite(Rays_sprites[0], (float)positions[0].X, (float)positions[0].Y, ag - 90);
        }
예제 #17
0
        public override void Update(double elapsedTime)
        {
            if (!working)
            {
                if (disposing)
                {
                    if (disposingTime > 0)
                    {
                        angle += (float)elapsedTime * 360 * 3;
                        _alpha = disposingTime / 12.0f;
                        disposingTime--;          //注销计时-1
                    }
                    else
                    {
                        disposing = false;
                        disabled = true;          //在最后的旋转特效以后,同意注销此子弹
                    }
                }
                return;
            }

            speed += 2;         //每帧速度+1
            if (Datas.CurrentEnemys.Count > 0)
            {
                double distance = 100000000;                            //取一个极端数值,使每一个求得值都会小于这个值
                double lastdistance = distance;
                foreach (Enemy e in Datas.CurrentEnemys)              //将离Player距离最短的作为跟踪对象
                {
                    if (e.Position.X < -200 || e.Position.X > 200 || e.Position.Y < -40 || e.Position.Y > 500)
                        continue;
                    distance = (Datas.CurrentPlayer.Position.X - e.Position.X) * (Datas.CurrentPlayer.Position.X - e.Position.X) +
                        (Datas.CurrentPlayer.Position.Y - e.Position.Y) * (Datas.CurrentPlayer.Position.Y - e.Position.Y);
                    if (distance < lastdistance)
                    {
                        FollowEnemy = e;
                    }
                    lastdistance = distance;
                }
            }
            if (Position.X < -190 || Position.X > 190 || Position.Y < -20 || Position.Y > 450)
            {
                speed = 0;
                working = false;
                disabled = true;
            }

            move(elapsedTime);
            //跟踪旋转
            if (FollowEnemy != null && !FollowEnemy.disabled && FollowEnemy.living)
            {
                Vector2D vct = new Vector2D(FollowEnemy.Position.X - Position.X,
                    FollowEnemy.Position.Y - Position.Y);
                if (!(vct.X == 0 && vct.Y == 0))
                {
                    double distance = vct.X * vct.X + vct.Y * vct.Y;
                    double percent = distance / 40000;
                    if (percent > 1)
                        percent = 1;
                    percent = 1 - percent;
                    float addangle = (float)percent * 1080;

                    vct.Normalize();
                    double vct_angle = vct.GetAngle();                 //目标的角度值
                    double dir_angle = Direction.GetAngle();           //当前方向的角度值
                    if (vct_angle < dir_angle)
                    {
                        if (dir_angle - vct_angle < 180)
                        {
                            Direction.rotate( (addangle + rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 > dir_angle)        //如果左旋转后反而比原本角度更大,则证明旋转过度
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                            else if (d_2 < vct_angle)   //如果旋转后跑到方向角左边,则证明旋转过度
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                        }
                        else
                        {
                            Direction.rotate((- addangle -rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 < dir_angle)         //如果旋转后反而比原本角度更小,则证明旋转过了一周
                            {
                                if (d_2 > vct_angle)
                                {
                                    Direction.X = vct.X;
                                    Direction.Y = vct.Y;
                                }
                            }
                        }
                    }
                    else if (vct_angle > dir_angle)
                    {
                        if (vct_angle - dir_angle < 180)
                        {
                            Direction.rotate((-addangle -rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 < dir_angle)
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                            else if (d_2 > vct_angle)
                            {
                                Direction.X = vct.X;
                                Direction.Y = vct.Y;
                            }
                        }
                        else
                        {
                            Direction.rotate((addangle + rotateSpeed) * (float)elapsedTime);
                            double d_2 = Direction.GetAngle();
                            if (d_2 > dir_angle)
                            {
                                if (d_2 < vct_angle)
                                {
                                    Direction.X = vct.X;
                                    Direction.Y = vct.Y;
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #18
0
파일: Enemy.cs 프로젝트: lm458180997/Touhou
 public override void Render(Renderer renderer)
 {
     //x,y是头的坐标位置,(以下是画出身体)
     float ag = 0;
     for (int i = bodycount-1; i > 0; i--)
     {
         sprites[i].SetPosition(positions[i].X, positions[i].Y);
         //方向定义为指向前一个块
         Vector2D vct = new Vector2D(positions[i].X - positions[i - 1].X,
             positions[i].Y - positions[i - 1].Y);
         //如果点没有发生变化,则跳过本次循环
         if (vct.X == 0 && vct.Y == 0)
             continue;
         vct.Normalize();
         ag = vct.getcurve();
         renderer.DrawSprite(sprites[i], positions[i].X, positions[i].Y, ag + 90);
     }
 }