playXP

서브 메뉴

Page. 15 / 21 [내 메뉴에 추가]
글쓰기
작성자 Azelkeeber
작성일 2010-11-14 04:19:27 KST 조회 6,227
제목
비트 플래그의 활용

0. 비트플래그란

일단 비트 플래그란 무엇인가 하면 한개의 정수 공간에 여러개의 부울형태의 데이터를 집어 넣을수잇는 데이터형태입니다.


일단 이 데이터 형의 장점은 비교를 좀더 쉽게 할수있다는점이 있습니다.


일단 이게 필요한 형태에 대해 예를 들어봅시다.


게임상에서 취미를 고른다고 가정해 봅시다.



ㅁ 운동

ㅁ 독서

ㅁ 게임

ㅁ 음악감상

...

ㅁ 고자되기

ㅁ 고자만들기



일반적으로 이런형태의 취미가 있을것 입니다. 먼가 말도 안되는게 있지만 넘어갑시다.



만약 이 데이터를 다수개의 취미를 체크가능하게 하고 일일히 체크를 확인할려면


선택지만큼의 부울 변수를 넣어야합니다..  당연히 변수가 늘어나니 조건문 작성도 복잡해지게 되겠죠.


그나마 위의 데이터를 저장을 조금 단순화 할려면 아래의 두가지 방법이 있습니다.


1. 부울 변수를 배열의 형태를 취하고 인덱스 0번째 운동 / 1번째 독서 /... /n-2번째 고자되기, n-1번째 고자되기 등으로 설정을 해줍니다.

2. 비트플래그를 만듭니다.


 이 두가지 방법입니다. 그중 부울 변수의 배열은 비트 플래그와 유사하나 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

이건 비트플래그의 원리과도 관계가 된 부분입니다만.. 자세한설명은 인터넷에서 찾으면 나옵니다.

(프로그래밍 관련으로 검색)


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

발도장 찍기
아이콘 SCIILiberty.555 (2010-11-14 22:52:35 KST)
0↑ ↓0
센스 이미지
비트플래그가 뭔가요? 혹시 부울값 말하는거? 그 true, false 만 있는 그거말하는거?
아이콘 Azelkeeber (2010-11-14 23:33:24 KST)
0↑ ↓0
센스 이미지
비트플래그는
트리거상에서 하나의 정수변수에 다수의(최대 32개) 부울을 집어 넣고
관리하는 미리 설정 유형입니다.

한 예로 데이터의 유닛 설정 항목을 생각해봅시다. 유닛설정은
거대 / 경장갑 / 구조물 / 기계 / 로봇 / 부양 / 사이오닉 / 생체 / 영웅 / 중장갑으로
이루어져있습니다.

이모든것들은 전 항목이 true or false의 부울로 되어있습니다.
그러나 일일히 부울로 변수 선언하여 처리하기보다는 비트플래그로 처리하는 편이 2가지 이점을 가지게 됩니다.

1. 속도 (1번의 정수비교 vs 9번의 부울비교) 당연하지만 1번으로 줄이면 더 빠겠죠 물론 이건 내부적으로 이것저것 처리하다보면 반드시 빠르단 법은 없습니다만 통상적으론 비트플래그가 더 연산이 빠릅니다.

2. 코드의 간략화 입니다.
중장갑에 생체일때 트리거가 작동하게하려면 위의 비트비교(AND)로
중장갑 생체로 한번의 비교문으로 끝나지만 부울변수를 다수 사용할경우
그리고 + 중장갑 비교 + 생체비교를 넣어야됩니다. 비교할 내용이 많아질수록 비교문은 더 복잡해집니다.

함수에 넘길때도 마찬가지입니다.
매게변수를 부울 갯수만큼 만드는거보다 정수 한개로 넘길수 있다면 그게 더 쉽습니다. 거기다 실제로 보이는건 정수가 아닌 이름들로 보이기때문에 다루는것도 쉽습니다.

머 일단 소스를 보시면 금방 이해하실수 있을겁니다. 데이터 유형없이 트리거만 보시면됩니다.
아이콘 Azelkeeber (2010-11-14 23:33:55 KST)
0↑ ↓0
센스 이미지
일단 유닛속성및 XXX플래그는 대부분 비트플래그로 이루어졌다고 생각하시면됩니다.
댓글을 등록하려면 로그인 하셔야 합니다. 로그인 하시려면 [여기]를 클릭하십시오.
롤토체스 TFT - 롤체지지 LoLCHESS.GG
소환사의 협곡부터 칼바람, 우르프까지 - 포로지지 PORO.GG
배그 전적검색은 닥지지(DAK.GG)에서 가능합니다
  • (주)플레이엑스피
  • 대표: 윤석재
  • 사업자등록번호: 406-86-00726

© PlayXP Inc. All Rights Reserved.