728x90

교수님 추천: 지오지브라(수학 계산 프로그램)

 

게임에는, 심리스방식, 존방식

심리스방식: 맵이 계속해서 이어지는것 방대한 맵 wow 같은거

존방식: 각 지역을 딱딱 단위별로 잘라낸거

 

%: 나머지

/: 몫

 

#include 로 헤더파일을 추가할때

< > <--- 비주얼에서 지정하고있는 라이브러리 경로에있는 헤더파일을 참조할때 쓴다.

" " <---같은 경우는 우리가 프로젝트를 할때 임의로 만든 즉 사용자 지정 헤더를 참조할때 쓴다.현재 코드가 있는 위치를 기준으로 헤더파일을 찾는다.

 

 

-디버깅-

f9 -> 브레이크포인트

f5 -> 브레이크포인트 지점에 화살표모양

f10 -> 한단계씩 진행

f11 -> 함수만나면 이제 함수안으로 들어가서 진행하게끔

ctr+f10 -> 커서있는쪽으로 바로이동

조사식:

ex) 이름에 배열이름 "a"를치면 현재 a가 크기가 10인 배열이라하면 0~9까지의 값이 나온다

또, a하고 , 콤마를 찍고 10,뭐 100 치면 10개 , 100개의 배열과함께 안의 값이 나온다.

 

-주석-

범위선택하고 ctr+k, ctr+c 하면 선택 범위 주석

범위선택하고 ctr+k, ctr+u 하면 선택 범위 주석 해제

 

구조체는 메인함수 밖에서 선언해라, 구조체 객체만들때 한글로해도 된다.

여러가지 정보를 한군데에 묶어서 뭐 배열에 넣고 이렇게 쓰기위해서 구조체 쓴다.

 

-포인터-

앞에 보통 p로 시작해서 붙임.. 곡 규칙은 아님.

(*a).age 같은 경우에는 "."이 "*"보다 우선순위가 더 높아서 괄호를 해줘야 포인터를 인식한다

그런데 이렇게 치면 좀 복잡하니까

a->age로 입력할수도 있다. 표현은 똑같다.

 

*p = *d : 둘다 포인터이고, 둘다 같은 주소를 가르킨다는 뜻이다. 즉 p와 d가 가르키는곳이 같고, p나 d나 둘중 하나가 값이 수정되면

둘다 값이 바뀐다.

 

p = *d : p가 클래스라고 치고, d도 클래스인데 포인터형이라 하면, p를 생성함과동시에 d에 있는 값들을 참고로 해서 생성한다는뜻이다. p(*d)와 같다, 즉 생성자가 클래스이름이 test라 하면 test::test(test& a)를 호출하는것과 같다. a라는 매개변수에서 보이듯이 test형의 포인터를 참고로해서 새로운 p를 생성하게된다.

 

상속관계에 있어서도 평소 자바같으면 부모클래스 a = new 자식클래스는 원래 성립이 되지않는다. 자식클래스가 한마디로 메모리가 더 크기 떄문이다라고 생각한다. 하지만 c++에서는 포인터를 사용하여 부모클래스 *a = new 자식클래스 를하게되면 부모클래스의 포인터가 자식클래스를 가르키게되고 자식클래스의 메모리 크기만큼의 공간을 만들기떄문에 포인터로 하면 잘 생성된다.

 

연산자 오버로딩을 할시 포인터를 매개변수로 넘겨주는것과, 그냥 클래스를 넘겨주는것은 메모리 할당에 있어서 차이가 있다.

CTest& operater+(CTest& a) , CTest operater+(CTest a) 두개가 있다하고 return으로 *this를 한다고하자

왼쪽같은경우는 포인터를 받는 연산자 오버, 오른쪽같은경우는 그냥 클래스 객체를 받는 연산자 오버라 하면

왼쪽은 포인터를 매개로 넘겨주고 리턴시 포인터의 주소를 넘겨주게 된다.

즉 c = a + *b를 하게 되면   c메모리->포인터메모리->함수안에서 생성된메모리 이렇게 3개가 되어버린다.

c는 계속해서 처음에 넘겨줫던 포인터의 주소를 가지게 되어 포인터를 거쳐서 함수로 가게된다는 것이다. 매우 비효율적이고, 메모리또한 낭비다

 

하지만 그냥 c = a + b 처럼 클래스 객체를 그냥 매개로 넘겨주면 리턴시 클래스 객체를 그대로 받는것이기 때문에

c메모리 -> 함수안의 메모리 를 바로 가르키게된다, 불필요한 메모리가 생성되지 않는다.

 

그리고 함수안에서 생성된 new 나 이런 메모리들은 그 함수가 끝나면 프로그램이 다 끝난거니까 소멸자 호출과 함께 메모리는 제거 된다라고 일단 그렇게 생각한다 나는.

 

-클래스-

앞에보통 C로시작해서 붙임.. 꼭 규칙은 아님.

클래스 안에 public, protected등 접근 지정 안해주면 자동으로 변수들같은 정적인 데이터들은 private, 접근가능한 함수들 같은경우네는 public으로 자동 지정 된다.

 

멤버변수: m_

정수: n

 

두점 사이의 거리 = (x1,y1) , (x2,y2)

루트((x2-x1)제곱 + (y2-y1)제곱)

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

 

두점이 잇다하면 이동방향 계산 (x2,y2)는 이동할 좌표

(x2-x1, y2-y1)이 x1,y1에서 x2,y2까지 가는데의 이동방향 좌표가 된다.

 

구한후

(0,0)의 좌표를 기준으로 (x2-x1, y2-y1)과의 거리를 구한다.

즉 피타고라스 기준에서 c2=a2+b2 즉 c를 구하는것과 같다.

 

그 나온 c를 이제

x2-x1 / c 는 이동방향의 x좌표

y2-y1 / c 는 이동방향의 y좌표가 되는것이다!!

 

거리/방향 = 단위벡터

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

두개의 원이 있을 경우

각각 (x1,y1), (x2,y2) 좌표에 두개의 원이 있고 각각의 지름이 잇다고 하자.

그렇다면 이 두 원의 사이의 거리 즉 위의 좌표값이 원의 중심이 되는데 이 중심의거리

즉 두점 사이의 거리가 <= 두원의 지름의 합 이면 두개의 원은 충돌한것이고

그렇지 않으면 충돌하지 않은 것이다.

 

 

-파일입출력-

FILE* f = NULL;
 fopen_s(&f, "a.txt", "rt");    // 매개변수가 파일, 파일이름, 모드
 fwrite("Hello", 5, 1, f);       // 매개변수가 입력할 텍스트, 크기, 몇번반복, 파일
 fclose(f);                        // 파일을 오픈한 후에는 반드시닫아줘야한다.

rt = 텍스트를 읽는다.    rb = 바이너리를 읽는다.

wt = 텍스를 쓴다.        wb= 바이너리를 쓴다.

 

fopen_s(&f, "a.txt", "rt");
 char buffer[10] = { 0 };
 fread_s(buffer, 5, 1, 10, f); //매개변수가 읽어올내용 저장한위치, 저장한 위치의크기, 읽어올 요소 크기, 몇번반복, 파일이름 
 cout << buffer << endl;

 

fseek(p, 0, SEEK_SET) //파일에 포인터위치를 처음으로 초기화

 

728x90
Posted by 정망스
,
728x90

 * 제공된 사진은 다른 블로그에 있는 사진을 참고로 올립니다.

 

Visual Studio 2010을 쓰면서 Direct X SDK를 설치하려고 하던중 VC++ 디렉터리라는 곳에서 재대로 설정이 되어있는지 확인하는 절차를 하던중.. 아래 사진과 같이 뭐 더이상 이 기능이 사용되지 않는다는 당황스러운 글들이 보였습니다.;;

 

보아하니. 2010부터는 프로젝트별로 고유의 디렉터리 설정을 가질수 있게 변경되어서 그렇다고 합니다.

 

그렇기 때문에 프로젝트 마다 일일히 디렉터리를 설정하기도 하는데, 모든 프로젝트가 공통적으로 적용될 디렉터리인 경우는 일일히 설정할 필요가 없습니다.

 

 

전역적으로 디렉터리 설정을 적용하기 위해서는 일단 속성 관리자 창을 엽니다. 일반적인 Win32 프로젝트라면 밑의 화면처럼 Microsoft.Cpp.Win32.user 항목이 있습니다.
( 참고 : 속성관리자를 보시면 각 프로젝트, 각 구성마다 Microsoft.Cpp.Win32.user가 있는데 한 곳만 설정해주시면 됩니다. )


 

 

  이 항목에 마우스 오른쪽 버튼  -> 속성 메뉴를 선택하시면 프로젝트 속성 설정창이 뜹니다.

이곳에서 VC++ 디렉터리 항목을 선택합니다.

 

이곳에서 항목별로 추가할 디렉터리등을 설정해줍니다.

include는 포함 디렉터리에, lib는 라이브러리 디렉터리에 설정합니다.

 

 

 디렉터리 설정을 마치고, 이제 작업하는 프로젝트에 설정이 적용되었는지를 확인해봅니다.

 

위 그림을 보시면 상속된 값에 위쪽에서 적용한 디렉터리가 적용되어있는 것을 확인할 수가 있습니다.

 

전역설정이 아니더라도 win32 프로젝트를 만드셔서 프로젝트 항목에 오른쪽 -> 속성으로 들어가셔서 여태 설명드렸던 방법과 동일하게 추가해주시면 됩니다.

 

 

이번엔 프로젝트 속성 페이지에서 링커 -> 입력 란에 들어가서 추가 종속성 편집을 하여 아래의 5가지 항목을 추가해줍니다.

 

 

이제 마지막으로 아래의 일반 탭에서 문자 집합 설정을 멀티바이트 문자 집합 사용으로 바꾸어 줍니다.

 

여기까지 하면 3D 게임프로그래밍 기본설정이 완료되었다고 합니다.

저도 다른 분들의 정보를 참고하여 정리하여 올리는거기 때문에 차후에 문제되는 부분이 있으면 수정하겠습니다.

728x90
Posted by 정망스
,
728x90

조건자를 공부하던 도중 함수 어댑터도 함께 보고 있었는데

계속해서 나오는 bind1st bind2nd 도저히 이해 가지 않아 그나마 내가 이해할수 있게 잘 설명된 부분이 있어

포스팅을 해서 정리 해본다.

 

bind2nd와, bind1st 함수 어댑터의 차이는 매개변수 부분에 있다.

 

bind2nd 에서 전달 받는 두개의 매개변수는 첫번째 매개변수는 계속해서 바뀌고, 두번째바뀌지 않는다.

바뀌지 않는 고정된 값을 전달하게 해주는 함수 어댑터가 bind2nd 이다.

 

bind2nd(less<int>(), 500) 이라는 구문이 있다 하면, less 클래스를 함수로 바꿔본다면 아래와 같이 된다.

 

bool less(int first, int second)

{

return first < second;

}

 

bind2nd는 두번째 매개변수가 바뀌지 않는다고 했으므로 아래와 같이 된다.

 

bool less(int first)

{

return first < 500;

}

 

bind1st 는 bind2nd와 달리 첫 번째 매개변수바뀌지 않는다.

그러므로 bind1st(less<int>(), 500) 은 아래와 같이 된다.

 

bool less(int second)

{

return 500 < second;

}

 

통틀어보면 바뀌지 않는다는 말은 고정된 값을 계속해서 쓴다는 말이고

난 이걸 더 간단하게 머리에 익히기 위해 나름 머리를 굴려 생각한것이

 

bind1st: 이항 함수자의 첫 번째 인자를 고정하여 단항 함수자로 변환한다.

bind2nd: 이항 함수자의 두 번째 인자를 고정하여 단항 함수자로 변환한다.

 

bind는 일단 영어로 묶는다는 뜻이다. 그리고 그다음 숫자가 1 이냐 2냐

1이면 첫번째를 묶는다, 2이면 두번째를 묶는다.

 

나름 이렇게 하면 외우기 쉬운거 같다.

 

 

 

728x90
Posted by 정망스
,

이클립스 C++ 환경 구축

C++ 2013. 10. 5. 00:01
728x90


우선 이 환경을 구축하는데 있어서 이클립스, MinGW라는것을 사용합니다. 두개다 현재나온 최신버전으로 사용했습니다.



이클립스에 우선 CDT를 설치해줍니다.  windows에 install new software로 들어가셔서 저렇게 입력해주시면 됩니다. 저는 최근 버전인 kepler 버전 이클립스이기 때문에 끝에 주소 부분이 보면 kelper로 끝나는것 보이죠?


클립스 홈페이지 가시면 각 버전에 맞는 cdt 주소가 있습니다. 확인하시면 됩니다.




두개 목록 선택하시고 Next



목록들 확인 계속 Next



동의란에 동의한다 체크하고 Finish




설치 중입니다.



이클립스를 재시작 해야 됩니다. yes 누르고 재시작 해주세요.



재시작 후에 우선 보시게 되면 목록에 c/c++ 일단 있는데 여기서 끝난게 아닙니다.



MinGW라는 것을 설치해야되는데, 위에서 CDT만 깔앗다고 되는것이 아닙니다. 따로 외부에서 제공되는 컴파일러를 깔아야 재대로 결과까지 볼수 있는데 그중에 하나가 MinGW 입니다.



다운받으시고 설치를 합니다.



c++ 까지 설치하실려면 c++도 체크하세요.



그리고 맨 밑에 보면 위에 두가지가 있는데 이것또한 설치해주세요..





cmd 창이 뜨면서 뭐 쭉쭉 설치되는데 기다리시면 됩니다. 한 2분정도? 안에는 다 될겁니다.



설치가 완료되었구요. 뭐 저거는 로그를 보여주는 txt 보겠냐라는 부분같은데 뭐 그냥 체크 해제하고 Finish 해줍니다.



이제 환경 변수에 추가를 해줘야하는데요.



시스템 변수에 Path 변수에 ;C:\MinGW\bin 을 추가합니다.



cmd 창을 열어서 gcc를 쳐서 저렇게 fatal error: no input files 문구가 뜨면 재대로 된겁니다.



이제 다시 이클립스를 키셔서 C++ 프로젝트 생성하시고 하실때 Toolchains 목록에 MinGW GCC를 선택해주고 Finish 합니다. MinGW GCC가 보이지 않으신 분들은 밑에 Show project types .......... 이 부분에 체크 해제를 한번해보세요. 그래도 안보인다면 설치가 잘못되었거나, 설정이 잘못된것으로 생각해야 될 것 같습니다.


이후 다 되셨다면 


코드 작성하시고 컨트롤 + b 하시면 빌드가 되고, 컨트롤 + f11 하시면 실행이 됩니다. 콘솔창에 결과가 보이게 될겁니다.




728x90
Posted by 정망스
,

상속과 다형성

C++ 2013. 9. 27. 23:46
728x90



상속(Inheritance)은 기존의 클래스를 토대로 해서 새로운 클래스를 만드는 방법입니다.


figure 클래스에서 상속을받아 Triangle, Square, Circle의 새로운 클래스를 만들어 내는 것입니다.


여기서 figure 클래스는 일명 부모클래스가 되며, Triangle, Square, Cirecle 클래스자식클래스가 됩니다.


상속의 개념은 이렇게 재사용성(Reusability)을 더해주기 때문에 기존에 만들어둔 클래스를 재사용해서 새로운 클래스를 쉽게 만들 수 있습니다.


다형성은 전구를 예로들어 처음엔 둥그런 백열 전구를 만들다가 생산 방식을 조금 바꿔 삼파장 램프를 생산하였습니다.


하지만 이 두가지 램프들은 소켓에 끼워지는 부분이 동일하게 만들어집니다. 


즉 모양은 바뀌었지만 부품과 부품을 연결하는 부분이 서로 약속되어 그대로 유지 되기 때문에 얼마든지 다른 종류의 부품으로 갈아 끼울 수 있게 됩니다.


이렇게 객체와 객체가 서로 약속한 부분 즉 인터페이스만 그대로 유지 된다면 얼마든지 다른 객체로 갈아 끼울 수 있다는 것입니다.


figure 객체에서 draw()라는 약속한 부분을 통해서 삼각형, 사각형, 원을 그릴수 있게 되는겁니다.


이것이 바로 다형성입니다.




728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침