별이되어라를 기준으로 작성한 예제가 대부분이기에 별이되어라를 하지 않으실경우 이해가 힘드실수 있습니다. ㅠㅠ
몬길, 다던왕, 세나, 등등의 게임을 이름만 알고 플레이 하진 않기에 다른 게임으로 풀어서 설명하는데는 한계가 있네요..
이해해 주셨음 합니다.
1. 분기는 가능한한 잘개 쪼개고 또 쪼개어 주세요.
(1)번글에서 말씀드렸듯이, getcolor 문이 아닌이상 변수가 아무리 많이 늘어나고 분기문이 아무리 많이 늘어나도 지니모션/폰에는 큰 부담이 되지 않습니다.
이를 이용해, 차후 게임상에서의 오류를 줄이고 기능을 추가하게 될때 쉽게 코딩하게 하기 위해 최대한 분기당 명령문을 짧고 잘게 쪼개주는것이 좋습니다.?
그럼 이걸 어디에 쓰느냐... 하는점은 예제로 보시겠습니다.
:dun
sleep 300
//난이도 , 맵 , 방번호 체크. 만약 55번맵(성채) 10번방 (9번방 클리어시 10번방이 다음갈 방으로 등록됨) 4번난이도 (신화이니깐 4번..) 일경우 email 분기로 이동. email 분기에선 사용자의 휴대폰으로 카톡, 이메일을 보내 매크로가 종료됨을 알리고 종료.
#diffisum = #zone*10000+#stage*100+#difficult
if #diffisum == 551004
goto :email
endif
// 10번방일경우 메인으로 이동. (이동하면서 방번호 초기화)
if #stage == 10
go to :gomain
// 11번맵(놀우드)의 8번방일경우 메인으로 이동. 놀우드의 경우 8번방이 존재하지 않기에 만든 조항.
elseif #stage == 8 and #zone == 11
goto :gomain
// 12번맵의 9번방일경우 메인으로 이동. 위 주석과 마찬가지.
elseif #stage == 9 and #zone == 12
goto :gomain
elseif #stage == 9 and #zone == 21
goto :gomain
elseif #stage == 9
goto :dun9
// 8번방일경우 8번방 입장으로 이동.
elseif #stage == 8
goto :dun8
elseif #stage == 7
goto :dun7
elseif #stage == 6
goto :dun6
elseif #stage == 5
goto :dun5
elseif #stage == 4
goto :dun4
elseif #stage == 3
goto :dun3
elseif #stage == 2
goto :dun2
elseif #stage == 1
goto :dun1
// 0번방이란것은 존재할수 없기에 오류가 난것으로판단. 메인으로 돌아가 다시 처음부터 시작.
elseif #stage == 0
goto :gomain
else
// 다른경우는 존재할수 없지만 혹시나를 위해 준비한 부분. start 분기로 갈경우, 나가기가 있을때 나가기를 클릭하여 마을로 돌아갑니다.
goto :start
endif
goto :start
위 예제 처럼 사용할수 있습니다.
55번맵~11번맵을 하나의 분기로 묶고, 9번방 ~ 1번방을 또 하나의 분기로 묶는다면,
오동작을 막기위해선 9번방부터 일일이 클릭하는방식으로 만들거나,
한방 돈뒤 1~9번방 다시체크를 해야하기에 getcolor 명령어가 남발될수있습니다.
이를 방별로 하나하나 떼어낸뒤, 간단한 변수 몇개를 첨가해줌으로써
getcolor 는 맵을 고른후 최초의 1회만 실행하고 이후 그 맵을 클리어할때까진 어느 방을 돌아야할진 변수로 체크하고
getcolor 의 사용은 줄여줄수 있습니다.
물론 dun1~9 분기문속엔 #stage 변수로 몇번방을 현재 돌고 그다음에 돌방이 몇번방인지 명시해줘야겠죠.?
2. #color 값은 분기문속의 getcolor 값 만큼 만들어주세요.
왜인지는 알수 없습니다만, 이렇게 짜주는쪽이 오동작이 줄어들더군요.. 열댓번 테스트해본 결과입니다.
예를들어..
:dunend
getcolor #color #getx #gety
if #color == #white
명
령
문
goto :loop5
endif
getcolor #color2 #dunendx #dunendy
if #color2 == #white
명
령
문
goto :loop5
endif
.
.
.
getcolor #color8 #stageselectx #stageselecty
if #color8 == #white
명
령
문
goto :dun
endif
이런식입니다.
변수가 조금 늘어나기에 메모리가 "몇 바이트" 더 먹는 아주아주 작은 단점이 있지만,
왜 인지 알수없을 getcolor 명령문의 오동작이 줄어들고, 명령문을 훨씬 알아보기 편해집니다.
3. 특정한 경우를 제외하곤 sleep 문은 최대한 터치 명령어 이후로.?
습관적으로 분기문, if문 이후에 혹은 기기의 오연산을 막기위해 쉬라고 sleep 을 주는 경우가 많습니다만, (특히 1~100 정도의 작은수로 )
이는 사용자입장에선 불필요한 딜레이가 늘어나고, 기기입장에선 처리해야할 명령문이 한줄 늘어난것에 불과합니다.
터치 명령어를 내린 이후 / 혹은 안전성을 위해 터치 명령어 이전이 아니라면 sleep 문은 최대한 줄여주는것이 좋습니다.
getcolor #color6 #dunendx #dunendy
if #color6 == #white
touchPress 0 #dunendx #dunendy
sleep 500
goto :loop5
endif
getcolor #color7 #dunfailx #dunfaily
if #color7 == #white
touchPress 0 #dunfailx #dunfaily
sleep 500
goto :loop5
endif
getcolor 문이 연달아 나왔지만, 조건에 충족되어 터치하는경우가 아니라면 sleep 은 없이 다음 연산으로 바로 넘어갑니다.
3-1. 지니모션이 아닌 휴대폰으로 구동시, 그리고 그 휴대폰의 성능이 떨어질경우엔,
getcolor 문이 연속으로 올경우에 sleep 값을 주거나, 히로매크로 옵션의 캡쳐 시간을 0초에서 1초로 올리는것을 고려해봄직 합니다.
단 캡쳐시간을 1초로 올리게 될경우 오동작이 될 여지가 많기에 이를 유념하고 코딩하여야 합니다.?
지니모션으로 할경우엔.. 코어2듀오(콘로) 이후 세대 cpu 라면 신경쓰지 않아도 됩니다.
말재주가 없어 길게쓰기가 힘드네요 ㅠ 오늘은 여기까지 적어보겠습니다.
내일.. 혹은 그이후에 적을거리가 걱정이네요 분량이 될련지..
elseif로 묶는건 생각도못했는데.. ㅎㅎ
전 getcolor를 남발해서 작성한 스크립트를 사용하고있는데
getcolor가 폰에 무리를 줄수있다는 말씀이시죠?