@ 16. 1 ~ 17. 1/게임프로그래밍의 정석
-
보간법@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2015. 1. 6. 16:17
1차원 보간법 P = A + u(B-A) P = uB + (1-u)A를 풀면 위와 같다. u의 범위는 0~1사이이며 u가 0이라면 P=A가 되고 u가 1이라면 P=B가 된다. 예를 들어 a가 서울이고 b가 부산이라면 (b-a)는 서울에서 부산으로 가는 길을 나타내고 u가 1이면 전체를 달렸으니 p는 부산이 되고 u가 0이면 출발전이니 p는 서울이 된다. u가 0.7이면 길에서 70%를 달렸으니 p는 동대구쯤이다. 2차원 보간법 1차원에서는 u가 하나뿐이니 2차원에서는 2개를 사용한다 그래서 v가 늘어남 그리고 점도 A B에서 C가 하나 더 추가됨 P = A + u(B-A) + v(C-A) 책에서 그렇다 하더라..
-
실시간 게임(키보드 입력, 프레임레이트)@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2014. 7. 24. 22:32
한장 한장의 단순한 정지에서 움직임을 메인루프를 빠르게 돌리면 된다.. 1초에 메인 루프가 몇 번 도는지를 프레임 레이트라고 부른다. 콘솔에서는 cin으로 입력을 받으면 이미지가 정지된 이유는 입력이 들어올때까지 기다리던 구조 그래서 이 부분을 살펴봐서 있으면 가져오고 없으면 그대로 함수를 종료하는 식으로 바꾸면 된다. 그런데 1초에 몇번이나 루프를 도는지는 컴퓨터 성능과 코드 완성도에 서로 다르다. 어떤건 1000번 어떤건 100번 그러면 어떤건 광속으로 움직이고 어떤건 천천히 움직이고.. 프레임 레이트를 내려야할까? 그랬다간 에니메이션 움직임이 어색해질 수도 있다. 그러면 몇 프레임에 한번만 키 입력을 받을까? 이것도 곤란하다 빠르게 키를 입력하면 무시되니까... 해결책은 3가지 방법이 있다. 1. ..
-
혼합공식@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2014. 7. 23. 22:51
알파 블렌딩 관련.. 사과주스(a)와 오렌지 주스(b)가 있다고 하자. 이들을 섞어서 혼합 주스 1리터를 만들고자 한다. 사과주스를 x만큼 오렌지주스를 y만큼 섞는다면 xA + yB = 혼합주스 더한양이 1리터라는 사실에서 아래와 같다. x + y = 1 이 식을 변형하면 y = 1-x가 되고 이를 위의 주스 혼합 공식에 넣으면.. xA + (1 - x)B = 혼합주스 이렇게 된다. x가 1이라면 전부 사과주스만 나오고... x가 0이면 전부 오렌지 주스가 나온다.. x를 그 사이값으로 하면 나름 혼합주스가 나온다. 색도 이와 같다. A를 전경 B를 배경이라고 하면 xA + (1-x)B = 혼합된 색 x는 알파 채널값을 사용한다. 근데 알파 채널은 0에서 255사이값을 가지니 더해서 1이 되게 하기위해(..
-
(챕터 06) 문자를 출력하는 방법@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2014. 3. 2. 22:25
drawString(0,0,"HAHA") 라는 함수로 문자가 출력이 된다면.. drawString(int x, int y, const char* str) { int dstX=x; int dstY=y; const int cWidth=8; const int cHeight=16; for(unsigned int i=0;str[i]!='\n';++i){ int srcX=getImagePositionX(src[i]); int srcY=getImagePositionY(src[i]); mFontImage->draw(dstX, dstY, srcX, srcY, cWidth, cHeight); dstX+=cWidth; } } 이런식의 코드가 될것이라고... 문제는 getImagePostion()함수의 내용이다.
-
(챕터 03) 이미지 파일을 사용하자(2)@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2014. 3. 1. 18:35
이미지의 높이와 폭을 읽어보자. 사양서에 따르면 dwHeight가 8바이트째부터 4바이트 dwWidth가 12바이트째부터 4바이트 그런게 맨 처음에 나온 dwMagic(4바이트) 크기를 더하면 최종 dwHeight가 12바이트째부터 4바이트 dwWidth가 16바이트째부터 4바이트가 원하는 값이 된다. char* fileImage; //여기에 DDS파일을 읽어왔다면.. unsigned height, width; height=*(reinterpret_cast(&fileImage[12])); width=*(reinterpret_cast(&fileImage[16])); char*를 강제로 unsigned*로 변환해서 unsigned를 추출하는데 그 이유는 DWORD가 unsigned이기 떄문이다. (DWORD..
-
싱글톤 클래스@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2013. 5. 6. 21:22
클래스내 함수에서 매겨변수가 this일 경우 예를 들어 void Getinput(this); 일 경우 this 포인터 즉 자기자신의 객체가 들어가게 되는것..?? 싱글톤의 목적 1. 전역변수가 지닌 위험을 줄인다. 2. 전역변수와 같이 사용할 수 있게 한다. class Single{ public: static Single* instance(); static void destroy(); private: Single(); Single(const Single&); ~Single(); static Single* mInstance; }; 생성자와 소멸자가 private로 되어있다. 즉 아무도 호출할 수 없게 되어 있다. 복사생성자 조차 안된다. 이래선 사용할 수 없다고 생각하지만, 그걸 대비해서 create와 d..
-
(챕터 03) 이미지 파일을 사용하자@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2013. 4. 24. 23:17
드디어 지난번 난해했던 3장에 왔다..스스로 힘내보자꾸나.. 이미지 파일 중 bmp, png, jpg같은 형식을 순수하게 자력으로만 읽어 오기에는 지나치게 복잡하다고 설명되어있다. (난 잘모르겠다..모르니 복잡한지도 모르겠다는...) 이 책에서는 Directx 표준 이미지 형식인 DDS형식을 사용한다고 한다. 내부가 단순하다고 표현되는데..이 점도 잘 모르겠음. DDS 32비트 ARGB라는데.. 알파 채널, 적색, 녹색, 청색이란다.. 결국 지금까지 사용하던 unsigned을 그대로 파일에 넣은 것과 같다고 표현한다. 그리고 다양한 DDS이미지를 사용할 수 있도록 이책에서는 bmp jpg png 이미지를 dds로 변환해주는 converter 프로그램을 제공해준다..(정말 친절하다.ㅠ) DDS 구조 파악 ..
-
(챕터 02) 점에서 시작하는 2D그래픽(2)@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2013. 4. 24. 22:40
간단하게 내용을 설명하면.. namespace GameLib{ void Framework::update(){ //메인 함수 내용 } } 상태에서 draw() 함수에 점을 찍을 수 있는 내용을 반영하였다 아래처럼.. unsigned* vram=Framework::instance().videoMemory(); unsigned windowWidth=Framework::instance().width(); 책에서는 화면도 작아서 drawCell() 함수를 만들으라고 하였는데..만들었는데 시행착오가 있었다. 한번도 겪지 못했던(이론적으로는 알고 있는) const 함수내 일반 함수호출 현상을 겪는 바람에 C2662 에러를 처음 접했다. 처음에는 무슨말인가했다.. 또 vram 변수와 windowWidth를 draw함수..