2012-05-30 6 views
0

나는 화면을 가로 질러 달리는 괴물들을 가지고이 비디오 게임을하고있다. 문제는 한 지점에서 몬스터가 한 지역을 지나가고 (y 좌표 위로 올라가는) 맨 위로 돌아 가야한다는 것입니다. 하단에서 상단으로 임의의 시간 (0, 1, 2 또는 3 초) 지연된 제안을 받았습니다. 지금 당장은 아무런 휴식없이 정상에 올라갑니다. 내 문제는이 휴식을 구현하는 것입니다.스레드가없는 프로그램을 멈추기

  // if(monster is below 400 on y-axis 
     if(sbgBackFootY[ i ] >= 400) { 
      // random number that determines how long it will take to go to top 
      int randCo = (int) (Math.random() * 3); 

      if(randCo == 0) { 
       //moves monster to top 
       sbgHeadX[ i ] = 200; 
       sbgHeadY[ i ] = 80; 
       sbgMouthX[ i ] = 206; 
       sbgMouthY[ i ] = 110; 
       sbgBackX[ i ] = 190; 
       sbgBackY[ i ] = 95; 
       sbgBackFootX[ i ] = 190; 
       sbgBackFootY[ i ] = 115; 
       sbgFrontFootX[ i ] = 197; 
       sbgFrontFootY[ i ] = 115; 
       sbgLeftEyeX[ i ] = 205; 
       sbgLeftEyeY[ i ] = 90; 
       sbgRightEyeX[ i ] = 215; 
       sbgRightEyeY[ i ] = 90; 
       sbgLeftEyebrowStartX[ i ] = 203; 
       sbgLeftEyebrowStartY[ i ] = 83; 
       sbgLeftEyebrowEndX[ i ] = 210; 
       sbgLeftEyebrowEndY[ i ] = 90; 
       sbgRightEyebrowStartX[ i ] = 220; 
       sbgRightEyebrowStartY[ i ] = 83; 
       sbgRightEyebrowEndX[ i ] = 215; 
       sbgRightEyebrowEndY[ i ] = 90; 

      } 

      if(randCo == 1) { 
       //loop is supposed to stall program 
       for(int w = 0; w <= 1000000000; w++){ 
        SBGco[ i ]++; 
       } 

       if(SBGco[ i ] == 1000000000) { 
        //moves monster to top 
        sbgHeadX[ i ] = 200; 
        sbgHeadY[ i ] = 80; 
        sbgMouthX[ i ] = 206; 
        sbgMouthY[ i ] = 110; 
        sbgBackX[ i ] = 190; 
        sbgBackY[ i ] = 95; 
        sbgBackFootX[ i ] = 190; 
        sbgBackFootY[ i ] = 115; 
        sbgFrontFootX[ i ] = 197; 
        sbgFrontFootY[ i ] = 115; 
        sbgLeftEyeX[ i ] = 205; 
        sbgLeftEyeY[ i ] = 90; 
        sbgRightEyeX[ i ] = 215; 
        sbgRightEyeY[ i ] = 90; 
        sbgLeftEyebrowStartX[ i ] = 203; 
        sbgLeftEyebrowStartY[ i ] = 83; 
        sbgLeftEyebrowEndX[ i ] = 210; 
        sbgLeftEyebrowEndY[ i ] = 90; 
        sbgRightEyebrowStartX[ i ] = 220; 
        sbgRightEyebrowStartY[ i ] = 83; 
        sbgRightEyebrowEndX[ i ] = 215; 
        sbgRightEyebrowEndY[ i ] = 90; 

       } 
      } 

아래 도시하지만 변수 w가 너무 빠른 방법 1000000000가되도록 컴퓨터가 너무 빨리 계산으로 I는, 이러한 루프 실속과 같은 다양한 방법을 시도했다. 이 작업을 수행하는 다른 방법은 스레드를 만들고 Thread.sleep (randCo) 또는 무언가를 사용하는 것이지만 다중 스레드를 사용하지 않으려 고합니다. 내가 할 수있는 다른 방법이 있습니까?

답변

1

스프라이트의 경로를 미리 계산 한 다음 속도를 지정하는 것이 좋습니다. 그런 다음 "그리기"단계에서 스프라이트의 경로, 속도 및 시간을 기반으로 위치를 계산합니다.

1

저는 Thread.sleep (..)이 최선의 선택이라고 생각합니다. 만약 당신이 하나의 쓰레드를 가지고 있고 그것을 잠자기했다는 것이 멀티 스레딩을 의미하지는 않습니다.

+0

그가 잠을 자고 있다고 생각하지 마십시오. 내가 그를 제대로 이해한다면, 단일 스레드는 그의 모든 몬스터를 렌더링하므로 잠을 자면 모든 몬스터가 멈 춥니 다. (경계를 여행하는 몬스터와는 반대로) – Michael

+0

@Michael 질문에 대한 두 번째 읽기에서 나는 맞아. 그는 앤드류의 해결책을 찾아야한다. – tibtof

0

왜 그가 화면 밖으로가 얼마나 긴 시간을 유지하고 그가 다시 화면에있을 때 그를 다시 넣어하지 않습니다

int initTime= 0; 
int elapsedTimeOffScreen = 0 

if(sbgBackFootY[ i ] >= 400) { 
if(initTime!= 0) 
    initTime= DateTime.Now; 
elapsedTimeOfScreen = DateTime.Now - initTime; 

if(elapsedTimeOffscreen > 1000) 
{ 
    initTime = 0 
    elapsedTimeOffScreen = 0; 
//go back on screen 
} 

initTime 때마다 문자를 다시 얻을 것이다 이것은 문자가 화면에서 얼마나 오래 떨어져 있었는지 확인하는 시간을 사용합니다. 확실히 CPU주기를 사용하는 것보다 훨씬 더 신뢰할 수 있습니다.

+0

낙심하지 마십시오. 당신도 좋았습니다. 시스템 시간 사용을 제안한 부분을 사용했습니다. 고맙습니다. – kullalok

관련 문제