원래는 카메라에 가까울수록 (z) 나중에 렌더링 되어 가장 앞에 오게 되지만

다른 기준으로 바꿀 수 있다.


예를 들어 y가 높을 수록 먼저 렌더링 되게 한다면

상하좌우로 움직일 수 있는 2D게임을 만든다고 했을 때


플레이어가 장애물 앞에 있을 때(y가 낮을 때)는 플레이가 보이고

플레이어가 장애물 뒤에 있을 때(y가 높을 때)는 플레이어가 안보이게 만들 수 있다


원래라면 직접 소팅오더를 바꿔가며 구현해야 했던 것을 쉽게 할 수 있다는 것


하지만 그 앞과 위의 기준은 스프라이트의 가운데를 기준으로 하기 때문에 큰 장애물이라면 조금 애매하기는 하다 (피벗 바꿔도 소용없음)


방법은


Edit->Project Setting->Graphics->Transparency Sort ModeCoustom Axis로 바꾸고

바로 밑에 있는 Transparency Sort Axis 를 입맛에 맞게 조정하면 된다.



블로그 이미지

stuban

ㅇ.ㅇ

,

우선 범위지정 for 문은 이런걸 말한다.

1
2
3
4
5
6
int arr[] = {1,2,3,4,5};
 
for(int a : arr)
{
    cout << a << endl;
}
cs


c++ 11부터 추가되었고 배열이나 stl 의 요소들을 돌아볼때(?) 쓴다.

(참고로 동적할당된 배열은 끝을 알 수 없기 때문에 그냥 돌릴 수 없음)


https://msdn.microsoft.com/ko-kr/library/jj203382.aspx?f=255&MSPPError=-2147217396



내가 만든 클래스(혹은 구조체든 뭐든)이 범위기반 for문을 쓰려면 어떻게 해야할까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test
{
public:
    int arr[10];
...
}
 
 
void main()
{
    Test test;
    for(int a : test.arr)
    {
        cout << a << endl;
    }
}

cs


이런 식으로 쓰면 되겠지만


배열이름까지 쓰는게 번거롭다면?

만약 내가 만든 클래스안에 있는 배열이 private라면?


배열이 동적할당된 배열이라면

내가 만든 클래스안에 있는 배열의 목적은 처음부터 끝까지 도는게 아니라면?



 msdn은 답을 알고 있다.

범위 기반 for 에 대한 이러한 사실을 명심하십시오:

  • 배열을 자동으로 인식 합니다.

  • .begin() 및 .end() 을 가진 컨테이너를 인식하십시오.

  • 기타 항목을 위해 begin() 및 end() 인수 종속성 조회 사용하기.


예제가 안나와서 조금 헤매기는 했지만


간단히 예제를 만들어 보면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test
{
    int arr[10= { 1,2,3,4,5,6,7,8,9,0 };
    int min = 3;
    int max = 7;
public:
    int* begin() { return &arr[min]; }
    int* end() { return &arr[max]; }
};
 
void main()
{
    Test test;
    for (int a : test)
    {
        cout << a << endl;
    }
}
cs

이런식으로 처음과 끝 주소값을 반환하는 begin 과 end 함수를 만들어 주면 된다.


블로그 이미지

stuban

ㅇ.ㅇ

,
1
2



1
2
//배열을 리스트로
List<int> testList = testArr.ToList();
 
...
 
//리스트를 배열로
int[] testArray = testList.ToArr();
cs

역시 똑똑한 사람들이 만들어둔 물건에는 이런 간단하지만 직접만들라면 귀찮은 기능들이 기본으로 주어져서 참 좋은거 같다 !

블로그 이미지

stuban

ㅇ.ㅇ

,



라보 버라이어티 킷에 들어있는 모터바이크 토이콘이
마리오카트 8 디럭스와 연동이 된다고 하네요.


참고로 라보 버라이어티 킷은 69.99달러지만
닌텐도 스토어에서 안에 있는 부품들을 따로따로 판매하고 있습니다.



모터바이크 토이콘은 11.99달러입니다.

하지만 닌텐도 스토어에서 직구가 되는지는 모르겠네요

마리오 카트를 시작으로 라보의 쓰임새가 점점 늘어날 듯 싶습니다.
그때쯤이면 중국산 완제품 토이콘이 나오겠지요.
돈 낭비 하지 말고 우리는 그걸 사면 됩니다 ㅎ


추가로 수고를 감수한다면
직접 만들 수도 있습니다


여기서 도면을 배포하고 있네요



블로그 이미지

stuban

ㅇ.ㅇ

,

닌텐도 라보가 출시된지 한달이 지났다.

종이의 내구도가 많이 안좋아서 평가가 적은 편이지만.

내구도만 문제 없었다면.

나는 충분히 가치있는 게임이라고 생각하고 있다.


아무튼

나는 어차피 정발도 안된 내구력약한 종이조각들을 비싼돈 주고 살 생각이 없기 때문에 (한글로 정발된다면 약간 흔들릴지도 모르지만)

라보를 활용하는 영상들을 보면서 대리만족을 했다.


라보 버라이어티팩에 있는 토이콘 중에서 가장 쓸모있어 보이는 물건은 

역시 피아노다


라보의 기능을 이용하면서 연주하는 영상들을 몇개 가지고 왔다.


케모노 프렌즈주제가

왼쪽 조이콘 버튼들로 연주중에 화음을 넣는걸 볼 수 있다.



위와 같은 유튜버가 연주한 Night of Nights라는 노래

익숙한 멜로디이기는 한데 제목이 기억안남...


아무튼 여기서는 피아노 토이콘 옆에 있는 레버로 피치를 조절하는걸 볼 수 있다.



이건 진짜 대박 영상

젤다 메들리를 피아노 토이콘으로 연주한 영상

음형태 바꾸는 카드도 쓰고

돌리는 것도 쓰고

흔들기도 하고

토이콘 개러지로 다른 음을 넣기도 하고...

거의 모든 기능을 써서 음악을 만들었다.


같은 유튜버의 스플래툰 브금 연주 영상




이건 토이콘으로 디모 플레이하는 영상

실제로 이 기능이 업데이트 되지는 않았다.





블로그 이미지

stuban

ㅇ.ㅇ

,

대학교 과목중에서 객체지향 프로그래밍이라는 과목의

기말 발표용으로 만든 텍스트어드벤처게임


이름이 객체지향 프로그래밍이지만 수업에서 클래스를 안배웠기 때문에 

모든 코드가 c스타일임

근데 파일입출력은 c++스타일로 배웠음 ㅋㅋ


시간이 별로 없어서 완벽하지는 않지만

아니 사실 허접한 수준이지만


블로그에 올릴 정도는 되는 퀄리티 인거 같아서 올림



일단 일회용 기말발표용 주제에 스토리도 만들었다.


기술의 발달로 등산은 물론 걸을 일도 없어진 세상

사람들은 쓸데없는 등산을 기피하게 되었다.

등산에 대한 여론이 나빠지다 결국 전 세계적으로 등산을 혐오하기 시작했다.

이에 등산로는 황폐화되었고 이제는 진짜로 위험한 행위가 되어버린 등산은

전 세계적으로 불법이 되어버리고 만다

이에 숨어있던 등산애호가들은 세계비밀등산가및등산로개척가지원협회 설립하여

비밀리에 등산로를 개척하고 있다.

플레이어는 세계비밀등산가및등산로개척가지원협회아시아지부 소속되어 전국의 산을 탐험해야 한다.




게임의 메인

이름대로 등산하는 게임이다.

세이브기능이 있기 때문에 이전에 진행하던 데이터가 있으면 이어서 플레이가능하다.


상하좌우 방향키로 메뉴를 고를 수 있고 엔터키로 선택할 수 있다.

<상점>에서 물건을 등산에 필요한 물건을 구매할 수 있고

<물건들> 메뉴에서 산에 들고갈 물건을 선택할 수 있다.


이건 <상점>

상하 방향키와 엔터로 구매가능하다.

약간 문제가 있는게 까먹고 잔액표시를 안해두었다...

결국 돈개념은 다 잡혀있고 정상작동 하지만

 이 게임안에서 잔액을 볼 수 있는 방법은 없음 ㅋㅋ




여긴 <물건들>

역시 방향키와 엔터로 담을 수 있고

써있지는 않지만 (이것도 실수,,,) X키를 눌러서 가방과 인벤토리를 오갈 수 있다.


가방은 포인터로 구현했고 인벤토리는 배열로 구현했다...

내가 왜 그랬는지는 몰라도

머리가 나쁘면 머리가 고생한다


이건 인게임

인게임부분은 꾸밀 겨를이 없었기 때문에

좀 많이 밋밋하다.


<상태보기>로 상태를 보고

<물건들>로 물건을 사용할 수 있다.


물건을 사용하면 다음으로 진행된다.



물건을 사용했을때.

앞에 1 있는건 디버그용으로 잠깐 해둔건데 이것도 실수로 못지움...



산마다 난이도가 있는데

난이도에 따라 어떤 상황이 발생하고

에 따라 좋은상황나쁜상황이 됨


그리고 좋은상황일때 지능이 높으면 효과가 2배가 되고

나쁜상황일때 민첩성이 높으면 나쁜효과가 절반이 됨



이건 좋은상황


나쁜상황 + 정상 도착

정상에 도착하면 보상으로 기력 30을 줌

참고로 정상이 끝이 아니라 하산도 해야함


이건 나쁜상황인데 민첩이 높아서 절반만 깍인거


아무 상황도 없는 상황 + 등산 끝


등산이 끝나면 

세계비밀등산가및등산로개척가지원협회아시아지부 

에서 지원금이 나온다.

지원금은 (산 높이) * (산 난이도) * 10






최대한 하드코딩을 피하기 위해서

웬만한 데이터는 텍스트파일로 따로 뽑아서 리소스 폴더에 넣어놨음.


help.txt는 도움말

item.txt는 아이템 정보들

m(숫자).txt는 산 아스키아트들

main.txt는 메인 로고 아스키아트

mountain.txt는 산 정보들

situation.txt는 상황들  




int대신에 char을 많이 썼음

어차피 정수형인거는 똑같기 때문에 뭘 쓰나 정상적으로 작동하고

용량이 2배나 차이나기 때문에 큰 수를 다루는게 아니라면 char을 쓰는게 좋다고 생각함


솔직히 도토리키재기이지만 뜬금없는 결벽증이 생겨서 그렇게함

다만

돈을 저장하는 변수와

비트플래그

 파일입출력할때는 다른 타입을 쓰기도 함


파일 입출력할때 다른 타입을 쓴 이유는

"<<" 으로 파일입출력을 했는데 char을 쓰면 문제가 있어서....

그냥 내 실력 문제임




메모리 아낀다고 별 지X를 했지만 UI부분에서 재귀함수를 남발했음

ㅋㅋㅋ


이유는 그냥 보기 편하고 왠지 넣으면 교수님이 더 좋아할거 같아서

위에 있는 사진은 그나마 볼만하지만


나중에는

정의가 이따시 만큼 길어져버린 함수가 나와벌임...

(<물건들> 이나 <상점>을 구현할 때 쓰는 함수임)


물론 재귀함수만의 문제는 아니고

디펄트 파라미터를 정의해놨기 때문에 더 길어보이고

실제로 쓸때는 짧게 쓸 수 있음.






구현하려다가 시간이 없어서 구현못한게 많이 있음

특히 마지막으로 작업했던 등산상황부분이 심각한데

MtStateMTEffect 열거형들은 산에 날씨나 시간같은 개념을 추가하려다가 못한 흔적이고

Situation 구조체의 effectCountORCode 변수는

원래 아이템을 줍는 상황을 만들려고 했는데 포기한 흔적임... 


그 외에도 리소스파일에도 포기한 흔적이 많이 남아있고

디버그하던 흔적이 남아있다거나

체력이나 기력이 마이너스가 되면 게임오버를 해야하는데

그것도 구현안함...




구현할때 가장 신경써서 만든 부분은

단언컨대 아이템이라고 할 수 있음



unsigned short형 변수중에

앞에 6비트를 효과를 나타내는 플래그로 사용하고

나머지를 그 효과의 파워를 저장하는데 씀


가뜩이나 표현가능한 수가 적은 short형이지만 

어차피 실제로 사용하는 양은 100단위에서 움직이니깐

나름 효율적인 판단이라고 생각하고 있음


사용할때는 

앞에 6비트는 일반적으로 비트플래그 사용하듯이 하고

쉬프트 연산자로 앞에 앞에 플래그부분을 밀어버려서 파워를 따로 저장함


다행히 교수님도 좋아하는거 같았음





주석을 달때 장난식으로 단 부분이 몇개 있음

교수님이 보고 뭐라할지는 몰라도 내가 재미있었으니깐 그만임 ㅎ


장난주석의 예

게임 끝나고 동적해제하는 함수임






솔직히 집에있는 웬만한 프로그래밍

뒷장은 책 처음 샀을때 빼고 펼치지도 않았을 정도로

공부를 겁나 대충함


덕분에 보통 책의 후반부에 있는 파일입출력은 거의 안써봤는데

이번기회에 많이 써봄


아무튼, 문제는 디버그모드에서는 잘 되는데 릴리즈모드로 빌드하니깐 

텍스트파일들을 못찾는지 못읽는지 게임 실행이 안됨

릴리즈 모드도 솔직히 이번기회에 처음써봄...




이건 좀 변명이지만 1교시부터 시작하는 수업을 들으려고

새벽 6시에 일어나서 통학하는 상황이라

수업시간에 많이 졸았었는데(그와중에 결석이나 지각 ZER0)


교수님이 "이거 만드느라고 졸았구나" 라고 해주심 ㅎ

아마도 좋은 의미겠지?

(A+을 받았으니깐 좋은 의미인거 확정! ㅋ)





마지막으로 소스파일

final_exam.zip


'내가 만든거' 카테고리의 다른 글

데빌리쉬 리그  (0) 2024.02.18
길따라 로봇 road robot 제작기(BIC 전시기)  (1) 2019.09.25
맵 에디터 !!!!  (0) 2018.05.11
유니티 스와이프  (0) 2018.02.20
유니티 사운드 매니저  (2) 2017.08.22
블로그 이미지

stuban

ㅇ.ㅇ

,

퀵 정렬은 찰스 앤터니 리처드 호어 라는 분이 1959년에 개발한 정렬 알고리즘입니다.

이름처럼 웬만한 상황에서는 빠른 알고리즘이고 많이 사용되고 있습니다.


최선 & 평균 시간복잡도는 

최악 시간복잡도는 

입니다.


퀵 소트가 동작하는 방법을 단순하게 표현한다면 다음과 같습니다. (오름차순 기준)


1. 가운데 값을 정한다 (기준점 4)

           

{2 3 1 6 4 8 5 7 9}


2. 값을 기준으로 작은건 왼쪽으로 큰건 오른쪽으로 보낸다.

        

{2 3 1 4 8 5 7 9}


3. 가운데 값을 기준으로 구역을 나누고 구역마다 다시 가운데 값을 정한다. (기준점 3,5)

   ▼             

{2 3 1} 4 {8 5 7 9}


4. 구역마다 1~ 3번을 다시 반복한다.

      ▼   

{2 1 3} 4 {5 6 8 7 9}


5. 또 다시 구역을 나눠서 나눌 구역이 없을 때 까지 반복한다...



위의 과정을 구현한 소스코드는 이런모양 (출처 : 위키백과)

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
void quickSort(int arr[], int left, int right)//정렬할 배열,구역의 왼쪽,구역의 오른쪽
{
      int i = left, j = right;//i=왼쪽 ,j=오른쪽
      int pivot = arr[(left + right) / 2];//기준점은 구역의 중간
      int temp;
      do 
      {
        while (arr[i] < pivot)//왼쪽이 피벗보다 (어차피)작다면 스킵
            i++;
        while (arr[j] > pivot)//오른쪽이 피벗보다 (어차피)크다면 스킵
            j--;
        if (i<= j)//위에서 걸러지지 못한건 서로 교체
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
      } while (i<= j);//왼쪽이랑 오른쪽이랑 만날때까지 반복
 
    /* 구역나눠 재귀 */
    if (left < j)//왼쪽 구역
        quickSort(arr, left, j);
 
    if (i < right)//오른쪽 구역
        quickSort(arr, i, right);
}
cs

이 소스코드가 위에 설명한거랑 조금 달라보일 수 있는데

조금 달라보여도 자세히 보면 위 설명과 크게 다르지는 않습니다.


저 소스를 더 분석하자면... 


1. 왼쪽(i) 오른쪽(j)과 가운데 값(피벗)이 있다.

 i          ▼         j

{2 3 1 6 4 8 5 7 9}


2. i, j가 피벗을 기준으로 제대로 된 위치에 있으면 스킵 

(이상황에서는 결국 j랑 피벗이랑 같은위치)

          i▼(j)

{2 3 1 6 4 8 5 7 9}


3. 제대로 된 위치가 아니면 i랑 j의 위치를 변경

{2 3 1 4 6 8 5 7 9}


4. 왼쪽부터 j까지 , i부터 오른쪽까지 구역나눠서 반복

{2 3 1 4} {6 8 5 7 9}



그리고 퀵소트의 원리를 보여주는 헝가리 민속 탭 떈쓰~ (겁나 흥겨움)


https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC

블로그 이미지

stuban

ㅇ.ㅇ

,

정확히는 마우스 포인터가 UI위에 있는지 확인하는 함수!


1
2
3
4
5
6
7
8
9
10
11
12
void Update()
{
    if (Input.GetMouseButtonUp(0)//클릭
    {
        //마우스 포인터가 UI위에 있지않으면
        if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() == false)
        {
            ...
        }
    }
}
 
cs


블로그 이미지

stuban

ㅇ.ㅇ

,