2012-10-19 6 views
0

XNA 게임의 상태 관리자로 스위치를 사용하고 있습니다. 스위치는 주요 업데이트 방법의 일부이므로 모든 프레임에서 실행됩니다. 때로는 타이머 값을 설정해야하며 메서드 호출 당 한 번만 설정해야합니다. 한 케이스 당 타이머를 설정하는 여러 가지 방법이 있으므로 이전 및 현재 상태 번호를 사용하여 이전 시간을 덮어 쓸 수 있는지 확인할 수는 없습니다.한 번만 루프에서 메서드를 실행하는 방법?

case "state 34": { 
SetTime(theTime); // should run only once 
// other things 
if (TheTimeisRight(time)) // runs every call 
    { 
     SetTime(theTime); // should run only once 
     if (TheTimeisRight(time)) 
     { /* some methods */ } 
    } 
break; } 

이 작업을 수행하려면 어떻게해야합니까? 아니면 스위치 외부로 나가지 않고이 작업을 수행 할 수있는 더 좋은 방법이 있습니까? (SetTime 메서드를 변경하는 것은 괜찮지 만 추가 코드로 스위치를 어지럽히고 싶지는 않습니다.)

+2

완전한 스위치 코드를 추가하고 더 자세히 설명해주십시오. – andy

+0

@Anandkumar 스위치에 대해 명확하지 않은 점은 무엇입니까? 질문에 대한 나의 전환의 예를 보여주었습니다. 모든 사례는 당신이 보는 것과 비슷합니다. 수표, 방법 및 매개 변수 만 다릅니다. – user1306322

+0

프레임마다 메소드 호출 당인가? IE는 프레임마다 한 번? – Alan

답변

0

HashSet<int>을 사용하여 if (!hashSet.Contains(num))으로 이전에 현재 SetTime(time, num) 메서드가 호출되지 않았는지 확인해야합니다.

void SetTime(int time, int num) 
{ 
    if (!hashSet.Contains(num)) 
     { 
      theTime = time; 
      hashSet.Add(num); 
     } 
} 
물론 너무 근사하지 않습니다

하지만, 작품과 너무 많은 (시각), 스위치의 가독성이 저장되도록 메소드 호출에 손상을주지 않습니다.

0

루프 밖에서 호출을 둡니다.
전혀 실행해야 하는지를 결정하기 위해 별도의 조건문이 필요할 수도 있지만 플래그 및/또는 다양한 반복 코드 접근법을 사용하여 호출 반복을 제어하는 ​​것보다 훨씬 뛰어납니다.

편집 :

if (someCondition && someOtherCondition && yetAnotherCondition) 
    setTime(theTime); // just one call, in one place, gets executed once 

switch(someValue) 
{ 
    case "state 34": { 
     //SetTime(theTime); // no longer necessary 
     // other things 
     if (TheTimeisRight(time)) // runs every call 
     { 
      //SetTime(theTime); // no longer necessary 
      if (TheTimeisRight(time)) 
      { /* some methods */ } 
     } 
     break; 

    ...etc... 
} 

조언의 말씀 : : 오히려 스위치 값에 대해 열거를 사용 여기

내가 스위치의 한 곳에서 외부 퍼팅 무엇을 의미하는 것입니다 문자열보다.

무자비하게 정직하게 말하자면,이 코드는 더 완벽한 코드 샘플을 보지 않고도 누구에게나 현실적으로 도움이 될 수 있습니다 (필자가 제공 한 샘플은 사용자가 가지고있는 샘플에 대해 다소 인위적이며 정확하지 않습니까?) . 이 문제를 해결하는 가장 좋은 방법은 switch 문을 해체하고 상태 시스템을 유지하는 것이이 상황을 처리하는 가장 좋은 방법이 아니거나 다른 상태를 도입해야하기 때문에 다시 시작하는 것입니다.

+0

나는 모든 것을 한 곳에서 지키려고 노력하고있다. 그러나 쉬운 방법은 아닌 것 같다. – user1306322

+0

@ user1306322하지만 여러 곳에서 전화가 왔기 때문에 실제로 "같은 장소에있는 것은 아닙니다". '스위치 (switch) '의 바깥에 놓으면 분명히 한 곳에서 유지하게 될 것입니다. – slugster

+0

'바깥에 놓고'한 곳에 보관하는 것이 ... 글쎄, 내게 이해가 안되네 :) – user1306322

0

부울 변수 ala hasSetTimeAlready을 사용하지 않으려면 메소드를 호출하는 다른 상태를 도입 한 다음 원래 상태로 진행하십시오.

+0

지구의 반경이 긴 스위치로 이미 다른 상태를 사용하고 싶지 않습니다. – user1306322

+0

스위치가 너무 긴 경우에는 주마다 수업을 사용해야합니다. 소규모 클래스의 폭발로 이어지지 만 코드를 읽을 수 있도록 유지합니다. – lbruder

+0

정보에 대한 링크를 제공 할 수 있습니까? – user1306322

1

또 다른 방법 :

public sealed class RunOnceAction 
    { 
     private readonly Action F; 
     private bool hasRun; 

     public RunOnceAction(Action f) 
     { 
      F = f; 
     } 

     public void run() 
     { 
      if (hasRun) return; 
      F(); 
      hasRun = true; 
     } 
    } 

그런 다음 스위치 문 앞에 var setTimeOnce = new RunOnceAction(() => SetTime(theTime));를 만들고, setTimeOnce.run() 거기 전화 : 통화 할 방법 래퍼를 소개합니다. 필요에 따라 매개 변수/반환 값을 조정하십시오.

관련 문제