작성자 | Azelkeeber | ||
---|---|---|---|
작성일 | 2010-11-14 04:19:27 KST | 조회 | 6,286 |
제목 |
비트 플래그의 활용
|
0. 비트플래그란
일단 비트 플래그란 무엇인가 하면 한개의 정수 공간에 여러개의 부울형태의 데이터를 집어 넣을수잇는 데이터형태입니다.
일단 이 데이터 형의 장점은 비교를 좀더 쉽게 할수있다는점이 있습니다.
일단 이게 필요한 형태에 대해 예를 들어봅시다.
게임상에서 취미를 고른다고 가정해 봅시다.
ㅁ 운동
ㅁ 독서
ㅁ 게임
ㅁ 음악감상
...
ㅁ 고자되기
ㅁ 고자만들기
일반적으로 이런형태의 취미가 있을것 입니다. 먼가 말도 안되는게 있지만 넘어갑시다.
만약 이 데이터를 다수개의 취미를 체크가능하게 하고 일일히 체크를 확인할려면
선택지만큼의 부울 변수를 넣어야합니다.. 당연히 변수가 늘어나니 조건문 작성도 복잡해지게 되겠죠.
그나마 위의 데이터를 저장을 조금 단순화 할려면 아래의 두가지 방법이 있습니다.
1. 부울 변수를 배열의 형태를 취하고 인덱스 0번째 운동 / 1번째 독서 /... /n-2번째 고자되기, n-1번째 고자되기 등으로 설정을 해줍니다.
이 두가지 방법입니다. 그중 부울 변수의 배열은 비트 플래그와 유사하나 1가지 단점이 잇으니 배열의 위치에 따른 데이터를 알기 위해선 따로 주석표를 만들어야한다는겁니다.(특히 데이터가 클수록 그렇습니다.) 거기다 알아보기 힘드니 실수할 위험도 높습니다.
그에 반해 비트플래그로 선언 할경우 각 데이터가 저장되는 장소의 이름을 지정할수가 있습니다. 부울변수의 배열은 x[0] = true 라면 비트플래그는 x = 운동 이되는겁니다.
또한 다수의 부울 변수가 참값이 되면
부울 변수의 배열은
x[0] = true, x[2] = true, x[3] = true
로 저장이되므로 이해가 어렵습니다만
비트플래그는
x = 운동 | 게임 | 음악감상
으로 저장이 가능합니다.
1. 비트플래그 선언하기
자 서론이 길었으니 이제 이걸 만드는 방법을 알아 봅시다.
1). 새 미리 보기 유형 설정(Ctrl+p)으로 일단 비트 플래그의 기본 저장 형태를 만듭니다.
이건 변수가 아닌 변수안에 어떤데이터를 저장 할것인가라고 생각하시면됩니다.
2). 종류 이름을 지정해야겠죠?
위의 예제대로 '취미종류'로 만들겠습니다.
3). 이제 값유형을 고칩니다.
기본은 정수로 되어있습니다.
값 유형을 '비트 플래그'로 고치고
하단의 '비트 플래그로 사용' 역시 체크해줍니다(이건 필수)
:스샷
4). 이제 들어갈 값의 종류를 집어 넣어야겟네요
취미를 예제대로 집어 넣읍시다.
취미종류
값 유형: 비트 플래그
값
운동
독서
게임
음악감상
고자되기
고자만들기
5). 이걸로 유형이 완성 되었네요. 이제 변수를 만들어 봅시다.
변수는 귀차느니 초기화의 지역변수로 만들었습니다.
기본 초기화
이벤트
게임 - 지도 초기화
지역 변수
취미 = 고자되기, 고자만들기 <취미종류>
조건
행동
취미 = 고자되기, 고자만들기 로 선언된 취미변수가 생성되었습니다.
2.조건문 작성
자이제 이걸 비교해야되는데 한가지 문제가 있습니다. 블리자드 이넘들이
비트플래그 비교하는 구문을 어따 넣어놧는지 도무지 찾을수가 없습니다.
아시는분은 리플로 달아주시고
일단 비교 조건문을 만들어야됩니다.
!!!!알아둬야할것
비트플래그 데이터는 사실 정수이며 최대 32개의 부울형으로 쓸 데이터(위의 예제로 설명하면 32개의 취미종류)를 넣을수 잇는것으로 보입니다. 그이상은 감당 안될겁니다 데이터는 소중하니까요(??). 중요한건 스크립트 상에선 암시적으로 비트플래그를 정수 연산처리가 가능합니다.(하지만 GUI에선 명시적 사용을 해야합니다. 사실 명시해도 내부 스크립트는 암시랑 같지만 맵에디터가 구분하기위해서 명시가 필요하더군요. 명시 방법은 아래에 설명하겠습니다.). 고로 아래의 만들어지는 조건문이 정수형인건 이상한게 아닙니다.
사실 '취미종류'로 직접 받게 선언도 가능합니다만 그러면 활용성이 떨어져서 만약 다수의 비트플래그 유형을 만드실경우 일일히 조건문을 새로 작성해야되는 불편함이 발생할것입니다.
자 일단 비트AND연산입니다.
AND연산은 비교할 대상에 잇는 모든 부울값이 참이면 참을 반환합니다.
(예 : 조건문 : 비트AND(운동 게임 고자되기, 운동 게임) = 참)
(예 : 조건문 : 비트AND(운동 게임 고자되기, 운동 음악감상) = 거짓)
비트비교(AND)
옵션: 조건
반환 유형: 부울
매개 변수
src = 0 <정수>
dst = 0 <정수>
문법 텍스트: 비트비교(AND)(src,dst)
참고 텍스트: (없음)
사용자 지정 스크립트 코드
지역 변수
bitAnd = lp_src & lp_dst <정수>
행동
일반 - If (조건) then (행동) else (행동)
If
bitAnd == dst
Then
일반 - true 반환
Else
일반 - false 반환
중요한것 : 지역변수 bitAnd는 사용자 스크립트 정의로 지정되있으며 매개변수 src와 dst 를 비트 연산결합을 합니다. 스크립트 식별자에대해 모르시는분은 매개변수명과 해당부분을 변경하지 마시기 바랍니다.
자 이번에는 비트OR연산입니다.
OR연산은 비교할 대상에 잇는 부울값중 하나라도 참이면 참을 반환합니다.
(예 : 조건문 : 비트OR(운동 게임 고자되기, 운동 게임) = 참)
(예 : 조건문 : 비트OR(운동 게임 고자되기, 운동 음악감상) = 참)
(예 : 조건문 : 비트OR(운동 게임 고자되기, 음악감상) = 거짓)
비트비교(OR)
옵션: 조건
반환 유형: 부울
매개 변수
src = 0 <정수>
dst = 0 <정수>
문법 텍스트: 비트비교(OR)(src,dst)
참고 텍스트: (없음)
사용자 지정 스크립트 코드
지역 변수
bitOr = lp_src & lp_dst <정수>
행동
일반 - If (조건) then (행동) else (행동)
If
bitOr > 0
Then
일반 - true 반환
Else
일반 - false 반환
중요한것 : 지역변수 bitOr는 사용자 스크립트 정의로 지정되있으며 매개변수 src와 dst 를 비트 연산결합을 합니다. 스크립트 식별자에대해 모르시는분은 매개변수명과 해당부분을 변경하지 마시기 바랍니다.
자이제 간단하게 비교문을 만들어 보겠습니다.
위에 설명한대로 현재 비교문은 정수형으로 비교되기때문에 변수를 못찾습니다.
내가 넣을 값이 미리 설정 유형에 있는 데이터란걸 명시해야됩니다.
조건문에서 비트비교(OR)를 고르고 정수를 누른후
변환 - 미리 설정을 정수로 변환
을 클릭합시다. 이제 src에 미리 만든 변수 취미가 들어갈수 잇게되었습니다
dst에도 비교해줄 값을 넣어야하겠죠? 빈 [취미종류]로 선언된 비교취미 지역변수를 하나 더 만들고
변수 설정으로 if문 전에 비교값을 넣어줍시다.
그리고 이제 if문만 처리하면 완료됩니다.
등록된 파일 예제를 보시면 이해가 되실겁니다.
※ 저장유형 비트플래그 vs 정수
정수는 1,2,3,4 식으로 1씩 유형값이 증가됩니다.
운동 1, 독서 2, 게임 3, ... 등으로 말입니다
그에 반해 비트 플래그는 1,2,4,8로 2씩 증가합니다 이게 비트 플래그가 32개의 값만 집어넣을수 잇을거라는 이유입니다.
운동 1 독서 2 게임 4
이건 비트플래그의 원리과도 관계가 된 부분입니다만.. 자세한설명은 인터넷에서 찾으면 나옵니다.
(프로그래밍 관련으로 검색)
|
||
|
|
||
|
|
||
|
© PlayXP Inc. All Rights Reserved.