XNA Windows Phone 7 Sprite движение - PullRequest
0 голосов
/ 20 ноября 2011

Я работаю над игрой для Windows Phone и испытываю трудности с движением спрайтов.То, что я хочу сделать, это заставить спрайт постепенно перемещаться в положение, которого касаются на экране, когда есть только одно быстрое касание и отпускание.В ту минуту все, что я могу сделать, - это сделать мгновенный переход спрайта к месту прикосновения или перейти к месту прикосновения, когда прикосновение удерживается.

Код для перехода к месту прикосновения:

TouchCollection touchCollection = TouchPanel.GetState();
        foreach (TouchLocation tl in touchCollection)
        {
            if ((tl.State == TouchLocationState.Pressed)
                 || (tl.State == TouchLocationState.Moved))
            {
                Vector2 newPos = new Vector2(tl.Position.X,tl.Position.Y);

                    if (position != newPos)
                    {
                        while (position.X < newPos.X)
                        {
                            position.X += (float)theGameTime.ElapsedGameTime.Milliseconds / 10.0f * spriteDirectionRight;
                        }
                    }
            }
        }

Код для постепенного перемещения при удержании касания:

TouchCollection touchCollection = TouchPanel.GetState();
        foreach (TouchLocation tl in touchCollection)
        {
            if ((tl.State == TouchLocationState.Pressed)
                 || (tl.State == TouchLocationState.Moved))
            {
                Vector2 newPos = new Vector2(tl.Position.X,tl.Position.Y);

                    if (position != newPos)
                    {

                            position.X += (float)theGameTime.ElapsedGameTime.Milliseconds / 10.0f * spriteDirectionRight;

                    }
            }
         }

Это метод Update () класса Sprite.

1 Ответ

0 голосов
/ 20 ноября 2011

Примерно так ... извините, я не запускал его через компилятор, поэтому могут быть некоторые синтаксические ошибки.Объявите их как поля в классе:

Vector2 newPos;
bool moving = false;

, затем в методе обновления:

        TouchCollection touchCollection = TouchPanel.GetState();
        foreach (TouchLocation tl in touchCollection)
        {
            if ((tl.State == TouchLocationState.Pressed)
                 || (tl.State == TouchLocationState.Moved)
                 || (tl.State == TouchLocationState.Released))
            {
                newPos = new Vector2(tl.Position.X, tl.Position.Y);
                moving = true;
            }
        }
        if (moving && newPos != position)
        {
            Vector2 delta = newPos - position;
            Vector2 norm = delta;
            norm.Normalize();
            Vector2 distanceToMove = norm * ((float)gameTime.ElapsedGameTime.TotalMilliseconds * .5f);
            if (distanceToMove.LengthSquared() > delta.LengthSquared())
            {
                position = newPos;
                moving = false;
            }
            else
            {
                position += distanceToMove;
            }
        }
...