2014-11-11 2 views
2

적을 무작위로 산란시키고 화면의 한 지점으로 이동하는 게임을 만들려고합니다. 내 문제는 프로그램이 스폰하기를 기다리고 이동하기 시작한다는 것입니다. 나는 그들이 산란하면서 움직이기 시작하고 각각의 사이에 잠시 휴식을 취하기를 원합니다.주기적으로 적을 산란시키는 방법

은 여기에서 이동하게 뒤의 두 가지 주요 방법이있다 :

public void newLevel() { 
    runOnUiThread(new Runnable(){ 
     public void run() { 
      int i = 0; 
      while(i < 10){ 
       addSpeks(); 
       i++; 
       try { 
        Thread.sleep(2000); 
       } 
       catch(InterruptedException ie){ 
        ie.printStackTrace(); 
       } 
      } 
     } 
    }); 
} 

public void addSpeks() { 
    Spek newSpek = new Spek(this); 

    setRandomRegion(); 

    newSpek.setX(spawnX); 
    newSpek.setY(spawnY); 

    relativeLayout.addView(newSpek); 
    spekList.add(newSpek); 
    newSpek.setOnClickListener(spekListener); 
    newSpek.animate().x(finalX).y(finalY).setDuration(8000); 
} 

Spek 보낸이 이미지 뷰와 setRandomRegion()을 임의의 X를 선택 연장 간단한 클래스이고, Y는 화면의 테두리에 좌표. while 루프에는 단순화를 위해 카운터가 있지만 결국 게임을 잃어 버리면 중지되는 조건부 무한 루프로 이동하려고합니다.

도움을 주셔서 감사 드리며 문제가 더 명확하게 설명되어 져야하는지 알려주세요.

첫째, 당신의 Runnable 작성 :

답변

1

당신은 완료되면 안드로이드에서이 같이 할 수있는, 스레드를 다시 실행해야 그 다음

private Runnable SpawnEnemies = new Runnable(){ 
    public void run(){ 
     //Your code here... 

     spawnHandler.postDelayed(2000, this); 
    } 
}; 

만들 핸들러를, 어떤 (실행 가능한, 음, 나) 스레드를 실행하는 클래스를하고 시작됩니다 Runnable이 같은 :

Handler spawnHandler = new Handler(); 
spawnHandler.post(new SpawnEnemies()); 

이것은 당신이 수, 2 초마다 실행됩니다 루게릭 병 루프를 수동으로 중지하려면 부울 또는 simmilar를 추가하십시오.

+0

예심 !!!!! 고맙습니다. 나는 이것을 며칠 동안 알아 내려고 노력했습니다. – Filipe

+0

코드에 약간의 수정을 가하면, 처음'SpawnEnemies'를 실행할 때'postDelayed (new SpawnEnemies(), 0)'가 필요 없다. 단지'post (new SpawnEnemies())'를 할 수있다. – Squeazer

1

newLevel() 메서드는 UI 스레드에서 완전히 실행되며 Thread.sleep(2000);은 UI 스레드가 반복 될 때마다 2 초 기다립니다. 실행 가능한 인스턴스를 선언하는 것입니다

public void newLevel() { 
    mHandler.postDelayed(new Runnable(){ 
     public void run() { 
      if (i > 10) { 
       mHandler.removeCallbacks(this); 
       return; 
      } 
      addSpeks(); 
      i++; 
      mHandler.postDelayed(this, 2000);     
     } 
    }), 2000); 
} 

또 다른 optmization을 : 멤버 클래스로

final Handler mHandler = new Handler(); 
int i = 0; 

을 핸들러를 선언

따라 newLevel을 변경 지연의 이런 종류를 추가하려면 당신은 핸들러를 사용할 수 있습니다 newLevel이 호출 될 때마다 인스턴스를 피하기 위해 마지막 멤버로 사용됩니다. 오타 확인

+0

,하지만 오직 하나의 적을 생성합니다. 또한 while 루프를 추가했지만 여전히 한 마리의 적을 생성했습니다. – Filipe

+0

'if (i> 10)'대신에 타입이 있다면'if (i> 0)' – Blackbelt