Past/Matlab GUI

Matlab GUI로 스타크래프트 빌드메이커 제작 #4/6 - 이미지버튼 콜백 설정

Ratatui 2017. 12. 15. 08:59

이 카테코리에 지금까지 올린 글을
살펴보니 전역변수인 'pro, num, ppl'의
역할에 대한 설명이 부족한 것 같았다.


본격적인 코딩 설명 전 간단하게
전역변수 예시를 알아보자.




위의 경우 전역변수의 값은
아래와 같다.


  • pro = 3
  • num = [  8  1  2 ---]
  • ppl = [  8  0  2 ---
  •       : 10  8  0 ---]


  • pro는 현재 슬롯 갯수를 저장
    num은 각 슬롯의 유닛수를 저장
    ppl의 1행은 각 슬롯의 현재 인구수,
    2행은 슬롯의 최대 인구수를 저장한다.


    ppl 행렬의 경우 1행의 총합은 10이고
    2행의 총합은 18로 위 경우 인구수가
    (10/18)로 정상 표시되어있다.


    그리고 --- 표시된 부분엔 33열까지
    값이 없는 부분이 0으로 채워져 있다.




    이 경우에는 전역변수 값을 보면


  • pro = 5
  • num = [  9  1  3  1  1 ---]
  • ppl = [  9  0  3 -1 -1 ---
  •       :  9  8  0  1  0 ---]


  • 이처럼 -1이 보이는데 저그의 경우
    건물을 지을 때 드론이 사라지므로
    현재 인구수에 -1이 되는걸 나타낸다.



    <프로그램 설명 포스팅 링크>



    이제 본격적으로 'Add'버튼을 누른 후
    이미지 패널에서 원하는 유닛을
    클릭했을 때 명령되는 코딩을 알아보자.




    위의 콜백함수는 수많은 유닛의
    이미지버튼 중 한 개이다.
    'pushbutton77' 태그된 객체인데
    'pushbutton100' 번호를 넘는 태그까지
    모든 종족의 많은 이미지를 제자리에
    표시하기 위해서 태그 정리가 중요하다.


    702줄은 apv와 bpv값을 정하는데
    apv는 유닛의 인구수를 뜻하고
    bpv는 최대인구수를 증가시키는
    파일런이나 오버로드에 값이 부여된다.


    첫번째로 눈에 보이는 동작은
    'visible' 속성 변경인데 먼저
    현재 열려있는 종족 패널을 'off'하고,
    'off'된 초기화면 객체들을 'on'한다.


    705~706줄에서는 콜백함수에서
    사용하기 위한 전역변수를 불러온다.
    코드가 상당히 길고 복잡하므로 전역변수를
    실제로 사용할 임시변수에 저장한다.
    (tpro, tnum, tppl)




    그리고 pro번째 있는 axes의 이미지,
    그러니까 방금 클릭된 이미지가 아닌
    이전의 axes에 있던 이미지를
    카테고리 #2에 설명된 초기조건
    설정 부분과 같은 방법으로
    eval과 sprintf함수를 사용한 후
    getimage함수를 사용하여 저장한다.


    저장된 이미지 변수를 방금 클릭된
    이미지와 비교해서 같을 경우에는
    슬롯 증가 없이 유닛 수만 1 증가되고
    다를 경우엔 새 슬롯에 이미지를 넣는다.




    710줄은 위 설명을 판별하는 if문이다.
    get(gco,'cdata')에서 gco는 현재
    콜백함수 객체인 'pushbutton77'의
    handle(객체에 대한 권한)을 얻게 한다.
    그리고 'cdata'속성은 'pushbutton'위에
    덮여있는 이미지인데 이것을 가져와서
    이전 슬롯의 이미지와 비교하는 코드이다.


    비교결과 두 이미지가 같은 경우
    프로그램 사용자는 같은 종류의 유닛을
    추가했다는 뜻인데, 이 경우는 새 슬롯을
    쓰지않고 현재 유닛수와 인구수만 바꾼다.


    711~712줄에서 유닛수를 저장하는 변수
    tnum의 현재 열 tnum(tpro)의 값을 1 더하고,
    tppl 변수에도 맞는 자리에 702줄에서
    설정한 apv, bpv값을 맞는 열에 더한다.
    저글링이나 스커지같이 한번에 두 마리가
    생산되는 경우엔 tnum(tpro)값에 2를 더한다.


    713~714줄에서는 tnum(tpro)에
    저장된 변수를 text로 표시한다.




    그리고 tppl에 저장된 변수도
    인구수에 표시해줘야 되는데
    ppl변수의 경우에는 맨 위에 전역변수에
    대해 설명한 것처럼 그 행의 총합을
    계산해서 ( - / - ) 형식으로 표시한다.


    그래서 717~719줄에서 for문으로
    tppl변수의 각 행의 총합을 구해
    tnum과 같은 방법으로 text에 표시한다.




    else이하는 710줄의 if조건이
    거짓인 경우, 그러니까 저장된 이미지와
    클릭한 이미지가 다른 경우인데,
    이 때는 새 슬롯에 클릭한 이미지를
    넣어주는 코드를 작성한다.


    새 슬롯 추가가 진행 예정이니
    먼저 tpro의 값을 1 증가시킨다.
    다음 img변수에 현재 콜백함수 객체의
    cdata 이미지를 저장하고 그 이미지를
    tpro번째 axes에 imshow함수를 이용해
    넣은 다음 axis off를 확실히 해준다.


    그런데 723줄을 보면 rem함수로
    이전 슬롯까지의 tpro값이 3의 배수인지
    확인하는 조건이 있는데 tpro값이 3의
    배수면 한 줄의 슬롯 3칸이 다 채워진 것이다.
    그러므로 창의 크기를 세로로 늘리고
    새로운 줄을 추가시키라는 명령을 한다.
    사용자에게는 새로운 줄이지만
    실제로는 'visible' 속성이 'off'되어있던
    객체들을 'on'으로 보이게 하는 것이다.




    728~733줄은 창의 크기를
    변경시키는 코드이다.
    새로운 줄이 추가되면서 창의 크기를
    상단 기준으로 세로로 늘어나게 한다.


    먼저 get( 파일명 , 'position') 코드는
    현재 열린 프로그램 창의 position
    속성값을 받아올 수 있다.
    프로그램 안의 객체는 프로그램 창
    안에서 왼쪽 하단이 기준이지만
    프로그램 전체 창의 position값은
    사용자의 모니터 전체의
    왼쪽 하단이 기준이 된다.


    position값은 [ x y z w ] 형태인데
    x, y는 왼쪽하단 모서리의 가로세로 위치
    z, w는 창의 가로세로 크기를 표시한다.


    만약 w값만 증가시키면 창의 하단이
    고정된 상태로 상단쪽이 위로 커지는데
    사용자 입장에서 슬롯 줄은 아래쪽으로
    추가되어야 하기 때문에 어색하다.


    그래서 y값(세로 위치)을 w값이 증가한 만큼
    감소시켜서 창의 하단이 아래로
    커지는 모션이 되어야 어색하지 않다.


    uipanel1은 프로그램 하단의 버튼들과
    (Input overall build exp...) edittext박스를
    제외한 모든 객체가 포함된 패널이다.
    이 패널의 위치는 항상 상단에 붙어있어야
    하기 때문에 uipanel1의 'position'속성
    y값도 같은 값만큼 더해준다.




    그리고 새 슬롯의 text객체
    유닛수, 인구수값을 초기화 한 후
    'visible' 속성을 'on'으로 바꿔서
    프로그램 사용자에게 표시해준다.


    초기화 코드는 712줄 이하와 비슷한 방법을
    사용해서 tnum, tppl을 수정하면 된다.




    이 부분은 새로운 줄이 추가되면서
    사용자에게 표시되어야 하는 객체들의
    'visible'속성을 'on'하는 코드이다.


    특히 창 크기가 변경될 때
    정확한 이유는 알 수 없지만
    몇몇 객체들의 속성 상태가 프로그램
    첫 실행시의 초기조건 설정으로 변경되어
    전체적으로 for문을 이용해서 재설정한다.




    else이하는 723줄의 if조건이
    거짓인 경우, 그러니까 이전 tpro의 값이
    3의 배수가 아닌 경우로 옆 슬롯이
    비어있어서 새로운 줄을 추가할 필요가
    없는 상태이므로, 창 크기를 변경하는
    코드를 제외하고 724~727줄과
    734~743줄 코드를 똑같이 사용하면 된다.




    pushbutton111은 저그 종족 패널의
    오른쪽 하단의 'Back'버튼이다.
    'Add'버튼으로 종족 패널이 열렸지만
    아무 동작도 하지 않고 패널을 닫을 때
    누를 수 있는 버튼으로, 전역변수 필요없이
    'Add'버튼을 통해 변경된 객체의 'visible'
    속성을 원래대로 바꿔주기만 하면 된다.


    다음 포스팅에서는 최근 슬롯을 제거하는
    'Undo'버튼의 Callback함수를 알아보자.


    프로그램을 다운로드 할 수 있는 링크가 폐쇄되어
    현재는 프로그램을 다운로드 받을 수 없다