2011-11-19 3 views
0

Windows 전화 게임을하고 있는데 스프라이트 이동에 어려움이 있습니다. 내가 원했던 것은 스프라이트가 화면에 터치 된 위치로 점차적으로 이동하도록하는 것입니다. 내가 할 수있는 모든 순간은 스프라이트를 즉시 터치 위치로 점프하거나 터치를 누르고 있으면 터치 위치로 이동하는 것입니다. 위치를 터치 점프에 대한XNA Windows Phone 7 스프라이트 이동

코드 : 터치가 개최되는 동안

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; 

        } 
      } 
     } 

다음은 Sprite 클래스의 업데이트() 메소드에 있습니다.

답변

0

다음과 같은 것 ... 죄송합니다. 컴파일러를 통해 실행하지 않아 일부 구문 오류가있을 수 있습니다. 클래스의 필드 이러한 선언 :

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; 
      } 
     } 
+0

"타입의 피연산자에 적용 할 수 없습니다 연산자 '*' '무효'와 '부동'"그것의 저를주는 이 Error for Vector2 distanceToMove = delta.Normalize() * (float) theGameTime.ElapsedGameTime.Milliseconds * 10f; " –

+0

죄송합니다. Normalize가 기존 Vector2를 수정하고 하나도 반환하지 않는다는 것을 잊어 버렸습니다. 나는 그것을 실행하기 위해 갔다,이 하나는 테스트를 마쳤다. –

+0

그건 완벽하게 작동합니다, 고마워요. –