2011-02-23 2 views
0

새로운 열거 값을 할당, 나는 변수를 생성자에서캔트 내가 열거가과 같이 정의 변수

private Direction direction; 

를 할당 :

direction = Direction.Right; 

그런 다음, 같은 클래스의 메소드에, 나는 새로운 열거 값을 할당하려고 :

direction = Direction.Down; 

하지만 내게 허락하지 않습니다! 올바른 값으로 돌아가는 것은 그것이 설정되는 유일한 장소가 생성자에 있다고 생각하는 것입니다.

무슨 일 이니? 편집

O_O - ... 더 많은 코드

namespace MyFirstGame 
{ 
    public enum Direction 
    { 
     Left, 
     Right, 
     Up, 
     Down 
    } 
} 

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 

namespace MyFirstGame 
{ 
    public class Invader : Sprite, IMovable 
    { 
     private InvaderType invaderType { get; set; } 
     private Direction direction; 
     private Vector2 speed; 

     public Invader(Texture2D image, Vector2 position) 
      : base(image, position, new Point(30, 16), new Point(0, 0), new Point(2, 0)) 
     { 
      direction = Direction.Right; 
      speed.X += 30; 
     } 

     public override void Update(GameTime gameTime, Rectangle clientBounds) 
     { 
      timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds; 

      if (timeSinceLastFrame > milliSecondsPerFrame) 
      { 
       timeSinceLastFrame -= milliSecondsPerFrame; 

       ++currentFrame.X; 

       if (currentFrame.X >= SheetSize.X) 
       { 
        currentFrame.X = 0; 
       } 

       Move(direction, clientBounds); 
      } 
     } 

     public void Move(Direction direction, Rectangle clientBounds) 
     { 
      if (direction == Direction.Right) 
      { 
       //is invader 3 px from the right edge? 
       //if yes: then drop 
       //else keep on truckin' to the right! 
       if (position.X >= (clientBounds.Width - (Image.Width + 3))) 
       { 
        //position.X = 0; 
        position.Y += speed.X; 

        direction = Direction.Down; 
       } 
       else 
       { 
        position.X += speed.X; //Speed 
       } 
      } 
      else if (direction == Direction.Down) 
      { 
       speed.X *= -1; 
       position.X += speed.X; 
      } 
     } 
    } 
} 

방법

+0

'깨끗한 솔루션'을 작성한 다음 '빌드 솔루션'을 작성 했습니까? – Oded

+1

귀하의 질문에 대한 이해를 돕기 위해 더 많은 코드를 게시해야합니다. – vissi

+0

당신이 제안했지만 그래도 똑같습니까? – TheDude

답변

0

예, 나는 그것이 작동하지 않은 이유에 대해서는

:-) 내 자신의 질문에 대답하고있다. 나는 왜 한 부분에 대해 그리고 다른 부분에 대해서는 내가 알지 못합니다.

이 부분은 내가 알고 :

내 업데이트에서() 메소드이 메소드 호출을했다 :

이동 (방향, clientBounds을);

그러나 Enums는 구조체입니다. 이동 (방향, 클라이언트 바운드) 메서드의 매개 변수가 실제로 복사 중입니다! 메소드 내에서 발생하는 모든 변경 사항은 변수의 원래 값에 영향을 미치지 않습니다. 그래서 언제든지 Move() 메서드를 벗어날 때 원래 값으로 끝났습니다.

내가 지금 당장 의지 할 수없는 것은 Move 메서드 호출에서 매개 변수로 방향을 제거했고 이제 클래스 수준 변수에 직접 새 방향을 할당한다는 것입니다. 개인 방향 방향;. 이것은 완벽하게 작동하는 것 같습니다 :-)하지만 왜?

+0

이것이 문제가 되었다면, 단순히 값으로 전달하는 대신 참조로 전달하지 않는 것이 어떻습니까? 'Move (ref direction, clientBounds);'와 비슷하게 메소드 시그니처를 갱신하십시오. 'Move()'*가'direction '의 값을 전혀 바꾸지 않으면 안됩니다 - 확실히 저에게는 분명하지 않은 부작용처럼 보입니다. –

+0

예, ref 수정 자 :-)'Move()'메소드가 direction 매개 변수와 같은 클래스에 있기 때문에 지금은 방향 매개 변수를 제거했습니다. 바깥에서 방향을 제공하는 대신 방향을 바꿀 때 클래스 자체가 결정하게합니다. 정확히 무엇을 의미합니까? Move()가 방향의 가치를 변경해야합니다. 분명히 나에게는 분명하지 않은 부작용처럼 보입니다. 왜? – TheDude

0

당신이 (오뎃에 의해 지적) 오래된 바이너리를하지 않아도 가정

는에 중단 점을 설정 할당을 확인하고 실제로 실행되는지 확인하십시오. 그런 다음 할당 직후에 (Step Over 사용) direction 값을 확인하십시오.

그 시점에서 올바른 경우 무언가를으로 설정하면 재설정 될 수 있습니다.

+0

할당 후 값이 Down입니다.하지만 그것에서 벗어나 다시 메서드로 돌아갑니다 (XNA 게임 루프입니다), 다시 오른쪽으로 돌아갑니다. – TheDude

+0

제 생각에 그것은 인베이더의 다른 인스턴스입니다. –

+0

하지만 그렇다면 생성자가 다시 실행되지 않을까요? 침입자는 게임이 시작될 때 XNA의 Game1의 LoadContent 메소드에서 게임에 "로드"됩니다. – TheDude

관련 문제