2017. 4. 1. 19:13

저번엔 타이틀을 완성했으니 오늘은 인게임 UI를 만들었습니다.




포토샵이 익숙하지않아서 하루종일 걸렸네요..


이런 느낌으로 만들어보려고합니다.


근데 만들고보니, 캐릭터 선택과 고대의존재 선택이 우선시 되어야하네요..


그리고 밑에 글씨 색상이 흰색이라 잘안보이네요. 이것도 고쳐야겠어요.


내일은 전체적인 게임 매니저를 만들어서 개별과 전체 관리를 띄게하고


캐릭터 선택과 고대의존재 선택을 먼저해야겠습니다.


물론 캐릭터과 고대의존재는 단 1개씩만 우선제작해야겠습니다..

Posted by 시리시안
2017. 4. 1. 19:00

친구들과 같이 보드게임방에서 아컴호러를 해봤는데 너무 재밌었습니다.


하지만 단점은.. 너무 방대한 룰과 시스템에 이해로 시간이 훌쩍 지나갔다는거..


그래서 집에서도 서로 같이 하고 싶어서 IP로 연결해서 하는 아컴호러 PC게임을 제작해보려고합니다.


뭐.. 첫날엔 별거 없겠지만..


DirectX 9.0c를 이용해 제작하기로 했습니다.


포토샵을 배워가며 만드는데.. 생각보다 오래 걸리네요


타이틀 UI와 크레딧 배치만 완료했습니다.





Posted by 시리시안
2017. 3. 29. 19:21

안녕하세요. 게임 개발자 놀이터입니다.


이번 포스팅에서는 변수 선언시 저장되는 영역을 적어보려고합니다.


크게 4개 또는 3개의 영역이라 표현하는데요


순서대로 


텍스트, 데이터, 스택(Stack), 힙(Heap)


입니다. 또는 3가지로 나눌땐 텍스트와 데이터를 하나로 합쳐서 보기도 한다네요.


그럼 순서대로 적어보겠습니다.


텍스트 영역

프로그램의 실행 코드가 존재하는 영역입니다.

 즉, 내가 작성한 코드들이 이곳에 위치합니다.


텍스트는 비교적 간단하네요


데이터 영역

    • 전역 변수나 정적 변수(static)가 이곳에 기록됩니다.
    • 데이터 영역내에서도 3가지로 분류가 가능합니다
      • 읽기 전용 영역
        • Const나 상수 문자열 등이 이곳에 속합니다.
      • 읽기/쓰기 영역
        • 전역 변수중 초기화가 된 변수들입니다.
      • 초기화가 되지 않은 영역 (BSS (Block Started by Symbol))
        • 전역 변수이면서 초기화가 되지 않고 선언되거나 static으로 선언된 변수들입니다.


스택 영역(Stack)

    • 지역 자동 변수 (지역 auto변수) 입니다.
    • 메모리를 따로 설정하지않아도 함수 시작(스코프영역 진입)에 자동으로 생성되고 함수 끝(스코프영역 벗어남)에 자동으로 파괴됩니다.
    • 스코프 영역안에 잡힌 주소값을 가리키는 포인터 변수도 auto변수 이기 때문에 이곳에 위치합니다.
      • (단, 주소값을 가르킬뿐, 주소값의 영역은 다릅니다.)


힙 영역(Heap)

    • 일반적으로 malloc 처럼 동적으로 메모리를 할당받을때 이곳의 영역이 사용됩니다.
    • 이곳은 자동 파괴가 되지 않습니다.



이렇게 정리하고 보면 되게 간단한 4가지인데, 항상 필요할때 기억이 나질 않네요.


읽어주셔서 감사합니다.


Posted by 시리시안
2017. 2. 25. 17:04

안녕하세요. 정말 재밌게 즐겨했던 탈옥게임 The Escapists.


한글 패치가 없어도 충분히 할만한 게임이지만.. 재미를 위해 한글패치를 했습니다.


외국식 농담이 많이 들어가있었는데.. 그걸 그냥 여러가지 게임, 애니메이션대사로 바꿨습니다.


감사합니다.


The Escapists 한글화(1.2).zip



게임 링크 : http://store.steampowered.com/app/298630/


패치 방법 : 스팀 라이브러리 - The Escapists 오른쪽 클릭 - 속성 - 로컬파일 -로컬 콘텐츠 폴더 보기 - data폴더 - 덮어쓰기.



***


이전 폰트 문제가 많아 폰트를 같이 수정하여 첨부했습니다.


약간의 뭉개짐현상은 아직 해결 하지 못했네요..


폰트에 사용된 글꼴은 친구체 입니다.


폰트에 문제가 된다면 바로 삭제하도록 하겠습니다.


=====


글씨가 흐릿하게 보이시는분들은  ㅇㅇ 님의 댓글 내용으로 친구체 폰트를 설치하면 된다고 하네요.


친구체 링크 : http://www.chsoo.pe.kr/Pds_Pds/14861


친구체 파일 :  friend.ttf


패치 압축 파일 내 font폴더안에 들은 escapists.ttf도 친구체 입니다.


=====


너무 과한 19금 드립을 삭제했습니다.




Posted by 시리시안
2017. 2. 22. 17:00

안녕하세요. 게임개발자 놀이터입니다.


요즘 게임하다가 재밌는 게임을 발견했는데 한글화가 없어서 귀찮게 할때가 많더라구요..


그래서 한글화 방법을 알아내 취미 삼아 하고있습니다.


혼자하는 작업이고, 글이 너무 많아 구글 번역으로 번역 후 조금 수정 과정을 거치는 식으로 하고 있는데..


오역과 이상한 번역이 많겠지만.. 댓글로 남겨주시면 나중에 수정 하도록 하겠습니다.


감사합니다.


게임 링크 : http://store.steampowered.com/app/323060/


패치 방법 : 스팀 라이브러리 - Tharsis 오른쪽 클릭 - 속성 - 로컬 파일 - 로컬 콘텐츠 폴더 보기 - 덮어쓰기.



tharsis_Data.vol1.egg

tharsis_Data.vol2.egg


Posted by 시리시안
2016. 12. 14. 12:57

안녕하세요. 게임개발자 놀이터 입니다.


이번 포스팅에선 TCP 3-way Handshake 에 대해서 적어볼까 합니다.


사실 전 이번 포스팅에 대한 내용을 잘 모릅니다.


관심있게 배우지 않았고, 나중에서야 이렇게 후회하면서 다시 공부를 했습니다.


정말 참고한 사이트가 많으니, 참고 사이트는 최하단에 적어 두도록 하겠습니다.




TCP 3-way Handshake 란?


TCP는 장치들 사이에 논리적인 접속을 성립 하기 위해 3-way handshake를 사용합니다.


즉, 신뢰성 있는 연결을 체결하기 전에 패킷을 3번 교환하여 확인 하는 과정입니다.


왜 3번 일까요?


A와 B가 서로 멀리서 대화를 한다고 생각해 봅시다.


A가 B에게 말합니다. "B야 우리 놀러가자!"


B는 그걸 듣고 대답하죠. "뭐? 나한테 말한거야?"


A는 B의 말을 듣고 말합니다. "응 너랑 둘이서 노는거야!!"


A와 B의 대화가 서로 이어지지 않습니다. 오히려 잘못된 정보를 받고있네요.


A와 B는 서로간의 신뢰성있는 연결이 되어있지 않다고 말할수도있겠네요.


이번엔 3-way handshake로 예를 들어봅니다.


1. A가 B에게 말합니다. "B야! 내말 들리니?" --- SYN

2. B는 그걸 듣고 대답합니다. "응, A야 난 들려, 넌 내말 들리니?" --- ACK / SYN

3. A가 말합니다. "응 B야! 너 말 잘들려!" --- ACK


이렇게 3번에 걸쳐서 대화를 주고받으며 신뢰성있는 연결이 체결되었습니다.


위 내용에서 말하는 것을 패킷으로 생각하고, A를 Client, B를 Server로 생각하면 이해하실수있습니다.


- Client에서 웹 서버로 연결을 시도하는 SYN을 보냅니다.

- Client는 서버의 응답을 기다리며 SYN-SENT 상태가 됩니다.

- Server는 LISTEN 상태에서 SYN데이터를 받으면 SYN + ACK패킷을 Client로 보냅니다.

- Server는 SYN_RECEIVED상태가 됩니다.

- Client는 Server로 SYN에 대한 응답으로 ACK패킷을 보냅니다.

- 그후 Client는 ESTABLISHEN 상태가 됩니다.

- Server는 ACK 패킷을 받고 해당 Client IP 대한 포트 ESTABLISHEN 상태로 전환합니다

- 이것으로 TCP 3-way handshaking 을 완료합니다.

사진 출처 : HandShake Wikipedia




위 사진 과정에서 Sequence Number와 Acknowledgment number를 보실 수 있습니다.

먼저 Client에서 SYN 패킷을 보낼때 Sequence Number에 랜덤한 숫자를 넣어서 보냅니다.

편의상 x라 표현하겠습니다.

이 SYN 패킷을 받게되면 응답으로 SYN + ACK 패킷을 보내게 되는데 서버에서 보내는 Sequence Number의 경우 또 랜덤한 숫자를 넣어서 보냅니다(y), 그리고 Acknowledgment number는 클라이언트에게 받은 x에 +1하려 x+1 값을 보내게 됩니다.

클라이언트는 서버로부터 오는 SYB+ACK를 받고 응답으로 ACK패킷을 보내는데 역시 값은 서버에게서 받은 Sequence Number, 즉  y 의 +1한 값인 y+1을 보내게됩니다.



감사합니다.






참고 사이트

넷트레인 교육센터

개발이 하고 싶어요

Mind Net

Mint & Latte

Posted by 시리시안
2016. 12. 12. 15:19

안녕하세요. 게임 개발자 놀이터입니다.


이번 포스팅에선 C#에서 C++에서 비교적 자주 쓰이는 (저는 편해서 자주 쓰는..) typedef를 C#에서 사용하는 방법입니다.


최근 C#을 사용하면서 비교적 KeyValuePair를 되게 자주 사용하게 됬습니다.


특정 2개의 값을 묶어서 관리하기 위해서였죠. 근데 KeyValuePair가 많아지면 어느게 어떤건지 변수명만으로 구분하기가 애매해 질때가 있었습니다.


그때 생각난게 C++의 typedef 였죠.


이름을 바꿔주면 편하지않을까..


생각하면서 typedef를 입력해봤으나 역시나 안됬습니다.


다른 방법이 없을까 찾아보면서 MSDN에 들어가게 됬습니다 (링크)


링크에 적힌 원문을 그대로 가져오면


typedef 키워드입니다. C++에서 typedef는 짧게 만들어지거나 이미 선언된 형식에서 좀 더 편리한 이름으로 사용됩니다. C#의 경우 using 지시문이 이 기능을 제공합니다.


라고 합니다.


그럼 예제 코드를 볼까요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace Silisia
{
    using indexValuePair = KeyValuePair<intint>;
    public class ExampleClass
    {
        void test()
        {
 
            KeyValuePair<intint> Pair = new indexValuePair();
 
            indexValuePair Pairs = new indexValuePair();
        }
    }
}
cs


위 처럼 사용할수 있습니다.


무조껀 클래스 상단에 위치해야 합니다. 그렇지 않으면 에러를 뽑아내게 됩니다.


물론 최상단에 적어야 하는게 맞겠지만.. C언어가 생각나네요..


몇번 사용하다가 결국엔 새로 클래스를 만들어 사용했습니다.


그래도 참고가 될까 이곳에 글을 남깁니다.


감사합니다.


------------------------------


추가


C++도 템플릿 에일리어스(C++11)로 using 키워드를 사용할 수 있습니다.

기존 typedef 해석 방법은 구식(C와 호환)이라 템플릿 사용 시 문제가 있어서 C 코드와 호환이 필요하지 않다면 typedef 대신 using을 쓰는 걸 권장한다고합니다.


라고합니다. (링크로 남긴 페북을 통해 답글 중.)




Posted by 시리시안
2016. 12. 9. 14:01

안녕하세요. 게임개발자 놀이터 입니다.


이번 포스팅에선 퀵 정렬에 대해 정리해보려고 해요.



퀵정렬 (Quick Sort)


퀵정렬은 '찰스 앤터니 리처드 호어(1962)'가 개발한 정렬 알고리즘 이라고 합니다.


퀵 정렬은 기준(pivot)을 선택하여 기준보다 작은 데이터를 왼쪽에 위치시키고, 큰 데이터는 오른쪽에 위치시킵니다.

이 과정이 끝나면 기준(pivot)이 된 요소는 정렬된 위치를 찾습니다. 결과적으로 기준보다 작은 데이터는 왼쪽, 큰 데이터는 오른쪽에 위치하게됩니다. 이러한 알고리즘을 pivot을 기준으로 왼쪽 데이터 그룹과 오른쪽 데이터 그룹에 재귀적으로 더이상 불가능 할때까지 반복합니다. (데이터 그룹의 갯수가 0 이거나 1개일때까지 반복)

반복이 종료되면 정렬된 데이터 그룹을 얻을 수 있습니다.


(출처 : 위키백과 퀵정렬)


렬과정



임의의 데이터 배열을 가지고 정렬 해보겠습니다.

15 13 9 10 26 24 85


1. 먼저 Pivot을 설정합니다.

15 13 9 10 26 24 85


2. Pivot(15)를 기준으로 보다 작으면 왼쪽, 크면 오른쪽에 위치시켜 분할합니다

13 9 03 15 26 24 85


3. 좌 우 로 분할된 데이터로 다시 (1,2)의 과정을 실행합니다.


( 13 9 10 )   15   ( 26 24 85 )

( 13 9 10 )   15   ( 26 24 85 )

( 9 10 13 )   15   ( 26 24 85 )

9 10 )   13 15   ( 26 24 85 )


9 10 13 15   ( 26 24 85 )

9 10 13 15   ( 26 24 85 )
9 10 13 15   ( 24 26 85 )


9 10 13 15 24 26 85


정렬 완성!


예제 코드


2개의 함수와 재귀함수를 이용한 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void QuickSort(int arrays[], int left, int right)
{
    if(left<right)
    {
        int pivot = Partition(arrays,left,right);
        QuickSort(arrays, left, pivot-1);
        QuickSort(arrays, pivot+1, right);
    }
}
 
int Partition(int arrays[],int left, int right)
{
    int pivot = left;
    right = right +1;
 
    while(left<right)
    {
        do
        {
            ++left;
        }while(arrays[left] < arrays[pivot]);
 
        do
        {
            --right;
        }while(arrays[right] > arrays[pivot]);
 
        if(left<right)
        {
            int swap = arrays[left];
            arrays[left] = arrays[right];
            arrays[right] = swap;
        }
    }
 
    int swap = arrays[pivot];
    arrays[pivot] = arrays[right];
    arrays[right] = swap;
 
    return right;
}
cs


1개의 재귀 함수를 이용한 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void QuickSort(int arrays[], int left, int right)
{
    int row = left;
    int high = right;
    int pivot = arrays[(left + right) / 2];
 
    while (row <= high) {
        while (arrays[row] < pivot)
            row++;
        while (arrays[high] > pivot)
            high--;
 
        if (row <= high) {
            int tmp = arrays[row];
            arrays[row] = arrays[high];
            arrays[high] = tmp;
            row++;
            high--;
        }
    };
 
    if (left < high)
        QuickSort(arrays, left, high);
 
    if (row < right)
        QuickSort(arrays, row, right);
}
cs




알고리즘 분석



가장 평균의 상황에서의 시간복잡도가 알고리즘의 시간 복잡도라고 할 수 있다.


크게 2가지 상황을 추축할수있다.


1. 최고의 경우, 나누어지는 족족 마다 반씩 분할되는 경우.

2. 최악의 경우, 나누어지는 족족마다 1개와 나머지로 분할되는 경우.


우선 1번의 경우를 계산하면. 


횟수 = (2ⁿ - 1) + 2 x (2ⁿ-¹ - 1) ...

= ⁿ-¹Σ 2... 이거 수식을 어떻게 적어야 할지 모르겠다..


계산하면.. NLogN이 나온다.


2번의 경우는 N² 이 나온다.


나중에 수식을 제대로 추가할수있는 방법을 알게된다면.. 그때 수정 해야겠다.



쨋든 2번의 경우는 극단적인 상황이므로, 시간 복잡도는 1번의 경우를 사용해서 O(N logN) 이다.


감사합니다.



동영상 예시

출처 : 유투브동영상







Posted by 시리시안
2016. 12. 8. 17:10


안녕하세요. 게임 개발자 놀이터입니다.


이번 포스팅에선 선택 정렬에 대해서 정리해보려고해요.


벌써 버블, 삽입 2개를 하고 선택정렬할 차례네요..


간단한건 이제 끝나가는군요.



선택 정렬


선택 정렬은 크게 3가지 방법으로 정렬을 합니다.


1. 주어진 배열에서 최솟값을 찾는다.

2. 그 값을 배열 맨앞에 위치한 값과 교체한다.

3. 맨 처음 위치를 뺀 나머지 배열을 같은 방법으로 교체한다.



정렬 과정


우선 랜덤하게 숫자를 배열해보겠습니다.


9 5 4 3 8 1 7


우선 정렬이 안된 배열 {9 5 4 3 8 1 7} 에서 최 하위 값을 찾습니다.


1 이군요. 찾은 값을 젤 처음 값과 교체합니다.


9 5 4 3 8 1 7 => 1 5 4 3 8 9 7


이렇게 한번의 루프가 끝났습니다.


두번째는 맨 처음 값 그러니까 교체가 된 1을 제외한 배열을 정렬합니다.


1 { 5 4 3 8 9 7 } 에서 최 하위 값을 찾습니다. 3 이군요. 1을 제외한 배열 처음과 교체합니다.


1 3 4 5 8 9 7 이 되겠군요.


이런식으로 마지막까지 진행하면 정렬이 됩니다.


밑의 그림을 참고해주세요.


(출처 : 위키백과 선택정렬)



예제 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void SelectionSort(int arrays[], int length) 
{
    for(int i=0; i<length; ++i)
    {
        int Minindex = i;
        for(int j= i+1; j<length; ++j)
        {
            if(arrays[j] < arrays[Minindex])
                Minindex = j;
        }
 
        int swap = arrays[i];
        arrays[i] = arrays[Minindex];
        arrays[Minindex] = swap;
    }
}
cs


간단하게 구현했습니다.



알고리즘 분석


선택 정렬은 최소값을 구하기 위해 전부 비교를 해야합니다. 따라서


(n-1) + (n-2) + ..... + 2 + 1 = n(n-1)/2 가 됩니다.


빅 오 표기법으로 시간 복잡도는 O(N²)가 되겠습니다.




그림 예시 자료



(출처:  위키백과 선택정렬 )


동영상 예시 자료

( 출처 : Youyube )




감사합니다.

Posted by 시리시안
2016. 12. 8. 15:41

안녕하세요. 게임개발자 놀이터 입니다.


이번 포스팅에선 삽입 정렬에 대하여 정리 해보려합니다.



삽입 정렬 ( Insertion Sort )


삽입 정렬은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입해서 정렬하는 알고리즘 입니다.

삽입 정렬의 경우 첫번째 요소를 이미 정렬됬다. 라고 간주 한 후 정렬을 시작합니다.

정렬되지않은 요소는 목록의 제일 뒤에있는 요소 부터 정렬된 목록과 비교하여 적절한 위치에 삽입합니다.

이 작업을 끝까지 반복하면 모든 요소가 정렬됩니다.


말로만 설명하면 좀 어려울수 있습니다.


정렬 과정


간단하게 삽입 정렬 예시를 보여드리겠습니다.


아래와 같이 5개의 숫자가 주어졌다고 했을때, 삽입 정렬로 정렬 해보겠습니다.


4 9 2 5 7


삽입정렬은 첫번째 요소는 정렬이 되었다고 판단하고, 두번째 부터 시작합니다.


첫번째

4 / □ 2 5 7  | key 값 = 9

9는 4보다 크니까 4보다 뒤쪽에 위치한다. □ 2 5 7 

4 / 9 2 5 7 


두번째

4 9 / □ 5 7 | key 값 = 2

2는 9보다 작으니까 9보다 앞 쪽에 위치한다. □ 9 5 7 

2는 4보다 작으니까 4보다 앞 쪽에 위치한다. □ 4 9 5 7

2 4 / 9 5 7


세번째

2 4 9 / □ 7 | key 값 = 5

5는 9보다 작으니까 9보다 앞쪽에 위치한다. 2 4  9 7

5는 4보다 크니까 4보다 뒤쪽에 위치한다. 2 4  9 7

2 4 5 / 9 7


네번째

2 4 5 9 / □ | key 값 = 7

7은 9보다 작으니까 9보다 앞쪽에 위치한다. 2 4 5 □ 9

7은 5보다 크니까 5보다 뒤쪽에 위치한다. 2 4 5 □ 9

2 4 5 7 9


정렬이 완료 되었습니다.


이처럼 첫번째 값을 제외하고 key 값으로 돌아가며 정렬이 완료된 부분과 비교하며 삽입을 하면 됩니다.

(사진 출처 : 나무위키 삽입정렬)



예제 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void InsertionSort(int arrays[], int length)
{
    int key = -1;
 
    for(int i=1; i<length; ++i)
    {
        key = arrays[i]; // 두번째 값부터.
        int j=i-1;
        for(; j>=0--j)
        {
            if(arrays[j] > key)
            {
                arrays[j+1= arrays[j];
            }
            else
            {
                break;
            }
        }
        arrays[j+1= key;
 
    }
}
cs


간단하게 구현했습니다.



알고리즘 분석


비교 횟수

삽입정렬은 두번째 요소부터 첫 요소와 비교하여 정렬한후 세번째 요소는 두번째와 첫번째와 비교합니다.

물론 이미 정렬되어있다면 비교를 하지 않겠지만, 빅오 표기법으로 생각하여 최악의 경우는 전부 비교하는겁니다.

0 + 1 + 2 + 3 .... + n-2 + n-1 = n(n-1)/2 가 되겠군요.


따라서 최악의 경우 시간 복잡도는 O(N²) 가 되겠습니다.


최선의 경우는 비교는 O(1)이고 for문이 Length-1 만큼 돌아야하니 O(n)이겠군요.





밑의 자료는 제가 삽입정렬에 대한 자료를 찾다가 발견한 자료들입니다.


삽입 정렬의 이미지 예시 

( 출처 : 위키 백과 : 삽입 정렬 )



삽입 정렬의 동영상 예시

출처 ( 유투브 동영상(클릭) )



감사합니다.

Posted by 시리시안