playXP

서브 메뉴

Page. 1 / 246 [내 메뉴에 추가]
글쓰기
작성자 프리슨어필
작성일 2013-02-21 03:50:04 KST 조회 674
첨부
  • 13.JPG (211 KB) - 다운로드: 3
  • 11.JPG (137 KB) - 다운로드: 2
  • 14.JPG (73 KB) - 다운로드: 2
제목
트리거에 잘못된 점이 있는지..
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지

두번째 스샷의 switch부분만 실행이 안 됩니다..대군주와 건설로봇,사령부를 생성하는 트리거 말이죠..

 switch로 설정한 건설로봇 사령부 생성 트리거는 안 먹힙니다, 대군주만 잔뜩 생기는,,

즉,.어떠한 조건도 충족하지 못했다는 소리죠,...



일단 계속 적립부분 트리거는 아이템 상자를 클릭할수록 변수가 늘어나게 한 겁니다.

처음 변수=0일시 클릭하면 클릭수에 따라 변수가 1로 늘어나며 기존 대화아이템이 사라지며

새로운 대화아이템이 등장합니다. 저는 변수를 테란=1.테란=2~ 식으로 주었습니다.


이 경우에선 맵 테스트 결과 상자가 사라지고 새로운 상자가 보이는 걸로 보아서 별 문제가 없습니다.


그러나 2번째 맵 테스트, 새롭게 등장한 아이템 상자를 클릭시 변수=2가 되겠죠?

그러면서 switch와 기본 행동 부분 트리거가 발동해야 하는데



즉 테란(1)을 누르면 건설로봇과 사령부가 생성이 안 되서

대군주만 생성된다는 거죠

지속적인 허위 신고시 신고자가 제재를 받을 수 있습니다.
신고 사유를 입력하십시오:

발도장 찍기
아이콘 고자왈애자왈 (2013-02-21 22:56:31 KST)
0↑ ↓0
센스 이미지
switch는 C언어를 배우시면 아시겠지만 저 앞쪽에 대소문자라고 적혀있는 부분에 하나라도 걸리게 되면 기본을 실행하지 않습니다. (참고로 갤리터의 내부 스크립트를 보신다면 아시겠지만 이 switch문은 내부적으로 if-elseif-else로 변환됩니다.)
부화장이 생성되었다는 것은 앞에 있는 테란[0],테란[1] 등등의 case문들이 전부 일치하지 않았다는 소린데 그러면 문제의 원인은 전달된 대화상자 인자가 [첫 대화상자 1]이어서 그럴수도 있습니다. 해당 if문을 생성하셔서 검사해보세요.
프리슨어필 (2013-02-22 13:18:47 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
switch는 첫시도라서 이해가 잘 어렵네[요.
if문 생성 검사에 대해서 설명해주시면 감사하겠습니다...

일단 전달된 대화상자 인자가 <첫대화상자 1> 이라는 대화상자 <아이템>인데
이 대화상자를 숨기기해버려서 다음 나오는 버튼 테란(0)같은 것이 생성이 안 되었다는
뜻인가요?.. 그 <첫대화상자1>아이템 상자는 첫번째 버튼사용시 숨겨지고
두번째 버튼인 <테란0> 새로 나오고ㅓ 서로 다른 트리거이므로 아무 연관이 없다고ㅓ 생각했는데 말이죠.
프리슨어필 (2013-02-22 13:25:52 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
뭐,,지금까지 해본건 <첫대화상자1> 대화상자아이템 숨기기를 지워서 <첫대화상자1>가 계속 뜨게 해봤지요
새로 나오는 아이템 테란(1)도 안 나오게 해봤습니다. 그리고 사령부와 건설로봇생성하는 if조건을 <첫대화상자1>로 해보고,,,
이러면 조건이 변수=2(클릭시 숫자 +1)니까 <첫대화상자1>두번 클릭시 유닛이 생성되어야하는데, 이건 잘 되는군요.

문제는 어떤 첫대화상자로만 행동할때는 별 문제가 없지만 다음 대화상자아이템을 만들어서
할때 안 된다는 게 문제일까요
프리슨어필 (2013-02-22 13:29:31 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
예제맵이 있음 좋겠타!
아이콘 고자왈애자왈 (2013-02-22 18:57:08 KST)
0↑ ↓0
센스 이미지
switch문은 이렇게 생겼습니다.

switch(검사할 변수) // 가장 처음으로 switch문에 검사할 변수 또는 값을 넣습니다.
{
case 값: // 그리고 (변수 == 값)인지 검사합니다. 참이라면 아래의 행동을 수행합니다.
행동;
break; // 이게 없으면 case를 신경 쓰지 않고 계속 아래로만 내려가며 행동을 수행합니다.
case 다른값: // (변수 == 다른값)인지 검사합니다. 참이라면 아래의 행동을 수행합니다.
행동;
break; // break를 걸지 않으면 switch가 끝날 때까지 아래로 내려가며 행동을 수행합니다.
default: // 위에 있는 case문이 모두 일치하지 않을 경우 아래의 행동을 수행합니다.
행동;
break; // 굳이 걸 필요는 없지만 미관상 보기 좋기 위해 걸었습니다.
}

즉 switch는 각각의 case구문과 변수를 검사해서, 일치하면 해당 case구문의 아래에 있는 행동들을 수행합니다. 하지만 break;라던가 return같은걸 따로 걸어주지 않으면 아랫쪽에 있는게 case든 디폴트든 그딴거 다 씹어버리고 switch문이 끝날 때 까지 아래로 계속 내려가며 모든 행동을 수행해버립니다.

하지만 이를 블리자드에서는 if-elseif-else로 내부적으로 바꿉니다. 그러니까 저건 엄밀히 따지면 c에서의 정상적인 switch문이랑은 많이 다릅니다. 하지만 이걸 굳이 아실 필요는 없습니다.

중요한건 switch든 if문이든 둘 다 조건식을 비교해서 일치하면 해당하는 행동을 하도록 되어 있습니다. 게다가 블리자드가 switch를 if문으로 치환하면서 디버깅이 더 쉬워졌고요. 저기 있는 갤리터의 자칭 switch문의 기본 행동과 if-else문의 else는 동일합니다. 즉, 앞에 있던 모든 조건들이 전부 거짓 판정을 받았다는 거죠. 테란[0]이 안 눌렸다는 겁니다. 그러면 이거 말고 뭐가 다른게 눌렸다는 소린데, 님이 생성하신 '첫 대화상자 1'이라고 명명된 대화상자 아이템일수도 있다는 것입니다. 그렇기 때문에 저 갤리터의 자칭 switch문에 해당 변수가 '첫 대화상자 1[]' 인지를 검사하는 구문과 간단한 행동(미네랄을 1 추가한다던가)을 넣어 확인해보라는 말이었고요.
아이콘 고자왈애자왈 (2013-02-22 19:01:41 KST)
0↑ ↓0
센스 이미지
무슨 대화상자 아이템이 눌렸는지 확인하는게 굉장히 중요한 것이, 만약 이게 '첫 대화상자 1'이라고 명명된 대화상자 아이템이면 님이 기껏 만들어놓은 변수를 이용한 카운팅이 쓸모가 없어진다는 것이고, 바꿔 말하면 다른 방법을 찾아야 된다는 소리가 됩니다.
댓글을 등록하려면 로그인 하셔야 합니다. 로그인 하시려면 [여기]를 클릭하십시오.
롤토체스 TFT - 롤체지지 LoLCHESS.GG
소환사의 협곡부터 칼바람, 우르프까지 - 포로지지 PORO.GG
배그 전적검색은 닥지지(DAK.GG)에서 가능합니다
  • (주)플레이엑스피
  • 대표: 윤석재
  • 사업자등록번호: 406-86-00726

© PlayXP Inc. All Rights Reserved.