마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

슈팅 게임 미사일 질문...

0 추천
현재 슈팅게임을 만들고 잇습니다.

이슈가 되고 있는 부분은 멀티 터치시에 미사일이 발사 되는데 미사일 개수제한이나  delay 요소가 없어

메모리가 초과 되어 게임 도중 튕기는 현상이 발생합니다.....

missile class 가 따로 있어 터치시에 add 로 bitmap을 그려 주는 형식으로 이용하고 있는데요.

delay를 적용시켜 봤더니..미사일이 발사되기전에는 방향키도 delay가 생겨  움직임이 어색해 집니다.

미사일 개수 제한은 어떻게 해야 할지 모르겠습니다...

고수분들의 도움 부탁드립니다~
laneige (420 포인트) 님이 2013년 4월 10일 질문

4개의 답변

0 추천
singleton을 적용해 보세요
익명사용자 님이 2013년 4월 10일 답변
0 추천

고수는 아니지만....제가 쓰는 방법을 알려드릴께요.  사실 책에서 공부한 내용이기도 합니다..

미사일이 발사되는 부분에 현재시간과 마지막 미사일 발사시간으로 확인하여 발사하게 하는건데요. 

장점은 뭐 무한발사로 줄줄이 나가다가 튕기는 상황은 면할수 있다는것,

단점은 미사일을 쏘는 적군이 많아지거나 특정 미사일발사 패턴으로 인해 화면에 미사일 양이 많아졌을 경우, 어플이 느려지는데 미사일발사시간은 느려지지않아 간격이 점점 줄어드는것같이 보인다는것입니다.

 

System.currentTimeMilles() <- 현재시간을 밀리초 단위로 표시(1초는 1000입니다.)

Last_fire_Time <- 미사일 생성코드 바로 앞에 만들면 되겠구요.

if(System.currentTimeMilles() - Last_fire_Time >= 1000)  // 현재시각 - 마지막발사시간의 값이 100보다 크거나 같은경우(==를 사용할 경우 1000밀리초가 되는 지점을 그냥 지나치는 경우가 있음.)
{
Last_fire_Time = System.currentTimeMilles();  // 현재시간을 마지막 발사시간변수에 지정

 // 미사일 생성코드
}

1초마다 한발씩 쏘는 코드입니다.

치유의마법진 (140 포인트) 님이 2013년 4월 12일 답변
0 추천

- 메인클래스에 변수선언 -

boolean 미사일스위치_mm = false;

int 메인루프_loop = 0;

int 발사간격_time = 5;

------------------------------------------------------------------

당신이 생성해야 할 발사메서드A(){

     if(미사일스위치_mm == true){

           if( 메인루프_loop % 발사간격_time == 0){

               // 당신이 구현해놓은 발사 로직

           }

     }

}

------------------------------------------------------------------

당신의 메인루프(){

     당신의 코드...

     ...

     ...

     발사메서드A();

     메인루프_loop++;

}

 ------------------------------------------------------------------

당신의 터치이벤트(){

      if(당신의 발사 조건문){

            미사일스위치_mm  = true;

      }

       if(당신의 발사 중지 조건문){

            미사일스위치_mm  = false;

      }

}

 ------------------------------------------------------------------

 

터치로 발사스위치(boolean) 값만 조절해주고

미사일 발사는 메인루프에 맡겨놓은 형태입니다.

발사 스위치가 true 라면 메인루프가 5번돌때마다 미사일을 한발 발사합니다.

딜레이를 늘이고싶으시면 숫자를 크게 키우시구요.

1로 설정하면 매 루프(최대연사속도)로 발사합니다.

동시에 3개의 미사일을 각자의 방향으로 발사하는 로직을 넣어놓으시면

발사간격 5루프마다 3발씩 쏘겠죠.

int 발사간격 <-- 쿨타임과 같다고 보시면 됩니다.

한가지 주의하실점은 이 로직은 시간에따른 동기화가 전혀 되지않는 방식입니다.

cpu가 빠르면 빠르게쏘고 느리면 느리게 쏘는 현상이 일어납니다.

모든기기에서 시간에따른 로직이 적용되야 한다면 뭔가가 좀더 필요하겠죠 ㅎㅎ

ddieoxin (1,550 포인트) 님이 2013년 5월 20일 답변
ddieoxin님이 2013년 5월 20일 수정
0 추천
안녕하세요.

저도 게임을 만들고 있는데, 예전에 비슷한 경험때문에 고생한 적이 있었습니다.

근데, 아무리 메모리를 많이 잡아먹는다고 하여도, 미사일을 딜레이없이 쏜다고, 아웃오브메모리가 나기는 쉽지 않습니다.

먼저 아래 두가지를 해보셔요,

1. 화면 밖에 미사일이 도착했을시, 객채를 recycle, null, gc처리해줍니다.

2. 미사일 객체 생성시마다 이미지도 함께 생성하지 마시고, 객체에는 좌표만 생성하세요,

    나중에 좌표에다 같은 그림이라면, 하나의 이미지로 좌표마다 덮어씌워주세요.

    * 객체 생성시마다 이미지도 포함시키면 메모리를 많이 잡아먹습니다.

 
터치이벤트 자체에 딜을 주시면 안됩니다.

터치이벤트 안에는 최대한 간단하게 해줘야합니다. (예를들면 xy좌표 또는 다운 업사이의 거리정도만 따옴)

좌표를 따오고 좌표가 포함되는 영역에 따라서 다른 처리를 해줘야 훨씬 로직이 간단해집니다.

터치는 계속 먹히게 하고 미사일 딜 안에서 터치가 계속 재생되면 이프문으로 미실행처리되도록 해줘야합니다.

미사일 갯수는 비행기에다가 max에 잡아주시고, 미사일 발사시마다 -1해주시면 될 것 같습니다.
익명사용자 님이 2013년 5월 20일 답변
...