2017-03-12 5 views
0

개인 작업으로 WPF에서 산불 시뮬레이션을 수행해야합니다.어떻게 wpf에서 루프를 재사용 할 수 있습니까? Forest Fire Simulation

모든지도를 그리드로 만들고 배열을 사용했습니다. 화재는 난수를 통해 추가됩니다 (예 : ex : case = "Forest"일 때 배열에 있음). 불은 모든 "산림 사건"을 태우고 있으며 바람에 의존합니다 (N S E W 등). 모든 것이 잘 작동합니다!

그러나 "불의 루프"를 통해 사소한 문제가 발생합니다. 내 단추 '화재 진도'(화재 확장을 수행함)를 클릭하면 모든 숲 사건이 동시에 발생합니다. (방향은 정확하고 올바른 방향의 경우 만 화상을 입습니다. 문제는 여기에 없습니다.)

경우이 같은 연소 될 것입니다 후 나는 각각의 경우로이 루프를 쿨 다운 싶었 :...

케이스 숲 레코딩합니다 모든 경우를 사례 숲이 화상을 기다립니다 등등 그리고 없습니다.. 오른쪽 방향 (바람의)

디스패처 타이머 (TimeSpan)를 사용하려고했지만 성공하지 못했습니다. 유일한 방법은 루프의 속도가 느려지는 것입니다 (초, 밀리 초, 일 등) .하지만 모든 경우 c 같은 시간에 매달린다. 그리고 하나씩 하나씩.

제 영어가 문법적으로 맞지 않으면 사과드립니다!

private void DeclencherLeFeu() 
     { 
      TempsDuJeu = new DispatcherTimer(); 
      TempsDuJeu.Interval = TimeSpan.FromSeconds(1); 
      TempsDuJeu.Tick += new EventHandler(OnTimerGameEvent); 
      TempsDuJeu.Start(); 

      TempsQueMetLeFeuPourBrulerLaForet = new DispatcherTimer(); 
      TempsQueMetLeFeuPourBrulerLaForet.Interval = TimeSpan.FromSeconds(8); 
      TempsQueMetLeFeuPourBrulerLaForet.Tick += new EventHandler(LesArbresSontCalcines); 
      TempsQueMetLeFeuPourBrulerLaForet.Start(); 
     } 

참고 : LesArbresSontCalcines이 나무가 연소 것을 영어로 의미

여기 내 코드입니다.

private void LesArbresSontCalcines(object sender, EventArgs e) 
     { 
      for (int i = 0; i < 7; i++) 
      { 
       for (int j = 1; j < 10; j++) 
       { 
        if (MonTableau[i, j].Name == "Feu") 
        { 
         MonTableau[i, j].Source = new BitmapImage(new Uri(@"E:\tp999\wpfapplication13\wpfapplication13\ArbreMort1.gif", UriKind.RelativeOrAbsolute)); 
         ImageBehavior.SetAnimatedSource(MonTableau[i, j], new BitmapImage(new Uri(@"E:\tp999\wpfapplication13\wpfapplication13\ArbreMort1.gif", UriKind.RelativeOrAbsolute))); 

         MonTableau[i, j].Name = "Noir"; 
        } 
       } 
      } 
     } 

참고 : 모든 레코딩의 경우는 (내가 숲 케이스에 fire.gif 사용) ArbreMort1.gif로 교체하는 것은 (A 검게 나무를 나타냅니다) 그냥 아래와 같이 함수를 호출합니다.

내 코드의이 부분에서 모든 레코딩 케이스는 같은 시간에 죽은 트리로 변경됩니다. 그리고 하나씩.

첫 번째 레코딩 케이스가 (ArbreMort1.gif와 함께) 어둡게 처리되고 끝 레코딩 케이스 (변형 될 마지막 것까지)가 될 것입니다.

이 디스패처 타이머는 어떻게 사용해야합니까?

답장을 보내 주셔서 감사합니다. :)

+0

'LesArbresSontCalcines'의 각 타이머 틱에 대해 하나 또는 두 개의 "Feu"만 변경하려고한다고 생각합니다. 끝나면 끝내야합니다. 그런 다음 또 다른 8 초 후 하나 또는 두 개 더. 어쩌면 Math.Random을 통해 당신은 얼마나 많은 것을 선택할 것인가. 현재 for 루프는 모든 것을 한 번에 실행합니다. – user326608

답변

0

처리기를 다시 설계해야합니다. 클래스 멤버 생성 int [7] j 및 int i = 0;

그런 다음 j 인덱스가 무엇인지 결정하기 위해 i 값이있는 내부 처리기 인덱스 j 배열. 그런 다음 j 인덱스를 증가시키고 i mod 7을 증가시킵니다. 이제 시퀀스 완성에 560 초가 걸립니다.

0

답장을 보내 주셔서 감사합니다. 나는 그것을 고치려고 노력할 것이다! :)

좋은 하루 되세요!