playXP

서브 메뉴

Page. 32 / 271 [내 메뉴에 추가]
글쓰기
작성자 프리슨어필
작성일 2013-02-20 14:26:55 KST 조회 2,203
첨부
  • 7.JPG (70 KB) - 다운로드: 0
  • 2.JPG (73 KB) - 다운로드: 0
제목
switch트리거 오류: 이벤트 반응함수에 일치하는 이벤트가 없다?
파일포켓 이미지
파일포켓 이미지
제목
switch -이벤트 반응함수에 일치하는 이벤트가 없습니다
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지

일단 마지막 스샷과 같이 메세지가 나오고 행동이 반응을 안 합니다.

그리고 전 분명 테란(1)버튼을 눌러서 사령부와 건설로봇이 나오도록 했는데 왠 저그의 부화장과 일벌레가 나오는 지..


3번째 스샷에선 타이머 설정을 했고요.

2번째 스샷은 이 타이머가 완료시 행동이 반응하도록 했습니다. 


여기서 참고할 점은 대화 상자를 선택할 시간을 25초 정도 준다는 것입니다. 

타이머가 완료되기 전에 대화상자 아이템을 설정했죠. 

그리고 타이머 완료 후 조건에서 설정한 대화 아이템에 따라 행동을 시행한다는 겁니다만은,


조건은 별 문제가 없지만 이벤트 문제가 뜨는 건 뭔지,


아. 그리고 다른 행동들을 넣어보니 실행이 다 되는데 대화상자 아이템 설정해서 유닛만드는 부분만

안 되네요 ㄷㄷ

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

발도장 찍기
아이콘 고자왈애자왈 (2013-02-20 19:44:19 KST)
0↑ ↓0
센스 이미지
오류 메세지로 판단해 보면.
이벤트시 호출되는 반응 함수인 EventDialogControl 가 일치하는 이벤트가 없고,
UnitCreate 함수의 플레이어 매개 변수가 0~15 가 아닌 -1로 주어졌습니다.

일단은 간단한 문제부터 보겠습니다.

저 이벤트 [타이머 만료]로 인해 전달되는 매개인자에는 {사용된 대화상자}가 없습니다.

스크립트를 보면 auto###_val = EventDialogControl();로 이벤트로 전달된 사용된 대화상자를 불러와 아래의 전환문(말이 전환문이지 스크립트 상으로 보면 그냥 if-elseif-else입니다)을 통해 들어가게 됩니다.
하지만 함수가 호출되는 이벤트에는 그런 인자가 없기 때문에 EventDialogControl이 꼬이면서 아래의 전환문에 전달되는 if문까지 죄다 꼬인거고요.

따라서 이 논리오류를 해결하려면 따로 전역변수를 선언해서 플레이어가 선택한 버튼을 기억해놓던지, 아니면 각각 함수를 만들어서 버튼 클릭시 해당 함수를 실행시키게 하면 됩니다.

두번째 오류문을 보면 경계 밖 데이터를 전달받았다고 뜨는데, 0~15 사이의 값인 걸 보니 플레이어로 추정됩니다.

제가 본 사진들에 있는 함수들 중에서 UnitCreate와 가장 비슷한 함수는 바로 [유닛 생성] 입니다.

저 유닛 생성 함수에 전달되는 플레이어 매개인자가 [팀 1의 플레이어에서 가져온 플레이어 1]인데, 결국엔 이 매개인자에 -1이 전달됬다는건 팀 1의 플레이어에서 가져온 플레이어 배열의 첫번째 인덱스의 값이 없다는 소리가 되는군요.

가능하시다면 팀1의 플레이어 목록을 확인해주새요,


제가 맵을 갖고 있는게 아닌지라 그냥 단순한 추측만 해봅니다.
프리슨어필 (2013-02-21 00:03:08 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
문제 발생원인에 대해선 컴퓨터 관련 함수에 대한 이해도가 부족한지라 잘 이해는 못하겠지만 해결방법에 대해선 이해하겠습니다

1. 타이머 완료 이벤트를 지우고 대화상자 아이템 사용된 이벤트를 한다
2. 전역변수를 따로 만들고 따로 따로 함수를 만들어준다..

2번과 같은 경우는, 이미 사용된 버튼이 배열(0~3)으로 지정하고 테란(1~3). 저그(1~3). 프로토스(1~3)으로 아이템 사용을 해놓았던지라.. 새로 전역변수를 만들어도 별로 달라질 것이 없을 것 같기도하고. switch함수말고 if도 저 스샷과 똑같은 상황이 나와서 일단 2번은 포기,,혹은 보류?

그래서 1번으로 대신했는데, 이 경우는 대화상자아이템이 잘 전달되서 문제가 없습니다만은,
저의 경우는, 조건이 1번째 스샷 트리거에서 적지 않았지만 전역변수 '선택완료'=참으로 설정해야만 했습니다. 저 부울 전역 변수는 시간 25초가 지나면 저절로 참으로 설정이 되게 했는데
이는 타이머가 완료되기 전에 버튼을 미리 누르고 있은 후 지정된 타이머 시간이 지나야
if나 switch 가 발동되도록 했기 때문입니다
프리슨어필 (2013-02-21 00:05:55 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
대화 상자 - 플레이어 아무 플레이어(이)가 아무 대화 상자 아이템 사용함. 이벤트 유형 클릭됨
지역 변수
조건
선택완료 == 참
행동
일반 - (사용된 대화 상자 아이템)에 따라 (행동) 전환
대소문자
일반 - If (테란[1])
행동
유닛 - 플레이어 1에게 1개의 사령부(을)를 Start Location 001에 만들기. 기본 방향 사용 (옵션 없음)
유닛 - 플레이어 ((팀 1의 플레이어)에서 가져온 플레이어 1)에게 10개의 건설로봇(을)를 Start Location 001에 만들기. 기본 방향 사용 (옵션 없음)


대충 이런 느낌인데. 버튼을 클릭한 순간 바로 실행되는 것이 아니라,. 타이머가 지난 후에
실행되기 때문에 타이머 전에 버튼 클릭한 것은 그냥 25초 기다리라는 메시지만 나오게 하고
25초가 지난 후에는 다시 한번 그 버튼을 눌러주어야만 건설로봇과 사령부를 생산하는 트리거가 먹히게 됩니다...

그리고, 한번 클릭 시 대화상자 창을 숨기기를 플레이어마다 해줄생각이라서, 한번클릭하면
다시 클릭을 못하도록 설정할 생각이라서,,
프리슨어필 (2013-02-21 00:07:59 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
그냥 간단히 요약. 추가질문인 것 같지만,

1번으로 이벤트 바꾸면 간단히 풀리는 데,
타이머 완료전에 클릭한 아이템 사용됨 조건이 타이머 완료 후에 자동시전하는 법..
이라는 게 문제네요. 1번방식대로 했으면 그게 문제가 되거든요. 버튼 클릭 후 바로 시전하는 게 아니라 그 버튼 클릭 한 후에 시간이 지나서야 실행되게 하려는 식이니까요
아이콘 고자왈애자왈 (2013-02-21 00:39:36 KST)
0↑ ↓0
센스 이미지
1) 25초가 지나기 전의 플레이어의 모든 입력을 무시하며, 25초 이후의 입력만을 받아들인다.
=> 유닛 생성 트리거의 이벤트를 대화 상자 아이템 사용함으로, 조건에는 [마지막으로 생성한 타이머의 남은 시간 <= 0.0] 을 넣어주시면 됩니다. 타이머가 2개 이상 생성되지도 않으며 마지막으로 생성한 타이머가 조건에 들어가면 이 방법이 가장 편합니다.

2) 25초 이전의 플레이어의 입력을 저장해놨다가, 25초가 지나가 마자 입력을 발동(실행)한다.
=> 전역변수[배열]의 생성 그리고 트리거를 분리해야 됩니다. 새 트리거를 만드셔서 아무 대화 상자 아이템이 클릭되었다는 이벤트를 넣어주시고 if문으로 클릭된 아이템을 검사하여 각각의 아이템에 알맞은 코드(ex. 테란1 = 0, 테란2 = 1, 테란3 = 2, 저그1 = 3...)를 전역변수[해당 플레이어]에 대입해주세요. 그리고 남은 유닛생성 트리거에는 기존의 사용된 대화상자 아이템 대신 전역변수[플레이어]를 통해 검사하시면 됩니다.
아이콘 고자왈애자왈 (2013-02-21 00:41:43 KST)
0↑ ↓0
센스 이미지
1번의 단점은 타이머가 생성되기도 전에 버튼을 누르는 말 그대로 빛의 속도의 컨트롤을 구사하시는 분이 있으면 에러가 생길 수 있고.
2번의 단점은 길이가 길어지며 복잡해진다는 것 입니다.
프리슨어필 (2013-02-21 02:26:42 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
맨 위에 스샷을 하나 더 추가했습니다만은,흠, 1번대로 유닛생성 트리거 조건을 (타이머의 남은 시간) == 0.0로 해봤지요. 물론 지정한 전역변수 타이머로,,

이 경우 현재 저의 상황과ㅣ 별로 다르지 않습니다. 왜냐면 전역변수(선택완료)는 타이머 완료시 참으로 설정되어있기에 타이머 남은 시간=0과 같은 효과이기에,,

1번은 써먹기가 힘들거 같네요. 25초 이후에는 입력을 안 한다는 게 전제이므로,, 흠,
2번으로 해보겠습니다

도움주셔셔 감사합니다
프리슨어필 (2013-02-21 03:11:24 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
어,,,근데 if문으로 클릭된 아이템을 검사하여 각각의 아이템에 알맞은 코드(ex. 테란1 = 0, 테란2 = 1, 테란3 = 2, 저그1 = 3...)를 전역변수[해당 플레이어]에 대입해주세요

여기에서 if문에 조건을 넣을때 A=B할때 한 쪽은 플레이어그룹(전역변수)이고
한 쪽은 대화아이템(전역변수)입니다. 조건은 한 쪽 A가 플레이어 그룹으로 하면 b도 플레이어 그룹 형식으로 요구하지요. 이건 대화아이템도 마찬가지,,

함수라던가 트리거외에 다른 방법이 필요한건가요..음,, 함수는 제 능력안에 있는 게 아닌데,,
프리슨어필 (2013-02-21 03:15:43 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
으으,, 2번이 복잡해서 ..포기해야할 것 같군요...예제맵이라도 있으면 좋을 거 같은데,,
아이콘 고자왈애자왈 (2013-02-21 22:35:08 KST)
0↑ ↓0
센스 이미지
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지
파일포켓 이미지

이렇게 하면 대충은 됩니다.
아이콘 고자왈애자왈 (2013-02-21 22:37:44 KST)
0↑ ↓0
센스 이미지
원래는 더 안정성 있게 만들려고 했지만, 사진을 한번에 찍기 위한 모니터의 크기가 부족하여 몇몇 부분은 삭제했습니다.
아이콘 고자왈애자왈 (2013-02-21 22:40:25 KST)
0↑ ↓0
센스 이미지
파일포켓 이미지

마지막 트리거를 실수했군요. 이렇게 해야 됩니다.
아이콘 고자왈애자왈 (2013-02-21 22:44:50 KST)
0↑ ↓0
센스 이미지
만약 저 테란[1] 저그[2] 같은 버튼들이 선택 이후에도 계속 보이게 하고 싶으면 [프로게이머고르기완료] 트리거 맨 처음에 있는 for문을 제거해주시면 됩니다.
아이콘 고자왈애자왈 (2013-02-21 23:07:02 KST)
0↑ ↓0
센스 이미지
윗 트리거들은 2번에 해당하며, 1번으로 하실려면 [타이머 만료] 트리거에 있는 '선택 완료' 변수를 참으로 만드는 작업을 삭제해주시고, {유닛 생성}을 [프로게이머고르기완료]로 옮겨주신 다음(당연히 프로게이머 변수는 대화 상자 아이템으로 바꿔야됩니다), 옮겨간 함수에 '선택 완료' 변수를 참으로 설정하는 작업을 추가하시고, 전역변수 '프로게이머' 와 관련 작업을 모두 삭제해주시고, 트리거의 조건문에 [타이머의 남은 시간 <= 0.0]을 넣어주시면 됩니다.
아이콘 BestBombdrop (2013-02-22 02:23:39 KST)
0↑ ↓0
센스 이미지
진짜 천사다
프리슨어필 (2013-02-22 23:22:25 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
천사 맞습니다. 근데 2번정말 복잡하네요.. 읽는 저도 복잡해서 못 알아먹겠다ㅣ고 생각하는데,
고자씨가 작성하는 건 더 힘들었을 거라고 생각합니다. 도움에 정말 크게 감사드립니다,,

다만 저대로 똑같이 해도 잘 안됬지만요,...
프리슨어필 (2013-02-22 23:40:29 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
2번째 업로드한 사진처럼 버튼이 전부 안 뜨고 타이머창만 뜨는..
일단 2번은 이정도로 하고 손놔야할 거 같고요..음,, 근데 왜 프로게이머라는 변수를 15개 배열한 것인지 이유가 궁금하긴 하군요.. 테란(0~3). 저그(0~3). 프로토스(0~3) 9개면 충분한데 말이죠

1번은 시도해봐야겠습니다. 실패한다하더라도 이렇게 계속 관심가져주어서 감사합니다
아이콘 고자왈애자왈 (2013-02-22 23:56:48 KST)
0↑ ↓0
센스 이미지
젭라... 대화상자 표시하기는 넣어주셔야죠... 제가 올린건 알고리즘을 강조하기위해 세세한건 다 공간을 위해 뺐어요...

그리고 그 궁금하신 부분은 제가 올린 사진 내부에 다 있습니다. 저 변수가 어떻게 쓰이는지만 훑어보셔도 왜 15개씩이나 만드는지 잘 아실 수 있어요(사실 15개 만들 필요도 없었죠.)
프리슨어필 (2013-02-23 00:17:43 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
사실 몇시간전에 대화상자표시하기를 넣었더니
다이얼로그 함수에서 setvisibile를 가져올 수없다 어쩌고 오류가 떠서 이;상하다 싶어서 빼버렸는데 이제 다시 넣으니 잘 됩니다, 신기하군,,?

아마도 예상치 못한 오류가 있었나봅니다, 물론 시간내신것에 대한 수고는 전혀 안 되겠지만,
맵 제작 시 최고로 도움을 주신 분으로 지도에 고자님을 표기해야할 것 같군요...
아이콘 고자왈애자왈 (2013-02-23 02:44:12 KST)
0↑ ↓0
센스 이미지
http://pds21.egloos.com/pds/201302/23/12/ex.SC2Map

혹시 모를까봐 예제맵 링크 해드립니다.
댓글을 등록하려면 로그인 하셔야 합니다. 로그인 하시려면 [여기]를 클릭하십시오.
롤토체스 TFT - 롤체지지 LoLCHESS.GG
소환사의 협곡부터 칼바람, 우르프까지 - 포로지지 PORO.GG
배그 전적검색은 닥지지(DAK.GG)에서 가능합니다
  • (주)플레이엑스피
  • 대표: 윤석재
  • 사업자등록번호: 406-86-00726

© PlayXP Inc. All Rights Reserved.