게임프로그래밍의 정석
-
(챕터 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) 이미지 파일을 사용하자(2)카테고리 없음 2013. 4. 30. 23:15
reinterpret_cast 란!? 특정 형 포인터에서 다른 형 포인터로 만들 때나 포인터와 정수를 서로 변환할 때 사용한다. 알파채널 투명여부를 판단하는데는 추가적인 정보가 필요하다. 현재 색은 적색, 녹색, 청색 세 가지밖에 없고 1바이트가 남는다.(unsigned) 이 남는 부분에 투명 불투명을 나타내는데 이것이 바로 알파채널.. 책에서는 투명과 불투명 두개를 나타내니..0과 1로도 충분하다고 하지만 1바이트가 남았으니 여유있게 128 이상과 미만으로 나눈다고 한다. 즉 0과 255라는 양끝 값을 대표값으로! 검은색은 0이요, 255는 흰색인지라.. (처음에는 왜 그런지 몰랐다.) 알파채널인지 여부 판단은 아래 if문 같이 한다고 한다. int alpha=(src&0xff000000) >> 24;..
-
(챕터 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함수..
-
(챕터 02) 점에서 시작하는 2D그래픽(1)@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2013. 4. 23. 23:48
어느덧 2장까지 왔다..물론 책은 현재 3장 이상을 보고 있으나..다시 볼겸...블로그에 작성중에 있다. 2장부터는 준비된 라이브러리를 바탕으로 시작이 되더라..!? 2010버전에서는 안되며 2008버전으로 해야 정신상태에 이로운 부분이다..ㅋㅋ; 이번부터 사용할 라이브러리 클래스는 다음과 같다고 설명한다. class Framework{ public: static unsigned* videoMemory(); static int width(); static int height(); void update(); }; 간단한걸!? 책에서는 이 중 세가지 함수는 그냥 사용하면 되고..한가지는 직접 만들어야한다고 설명된다. videoMemory() 화면을 구성하는 픽셀 배열을 가져오는 함수라고 설명되어있다. 예를 ..
-
팁: 플래그와 비트연산@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2013. 4. 23. 23:06
책에서 설명을 하길.. 게임에서는 bool형 변수를 여러개 만드는 대신 unsigned형 변수 하나에 여러플래그를 묶어 넣는 방법을 자주 사용한다고 한다. 유무를 표시하는데는 0과 1을 나타내는 비트 하나면 충분하기때문에 4바이트 크기인 unsigned형 변수 하나에는 플래그 변수를 32개 모아 둘 수 있다는 것이다. 놀랍네..!그리고 약..40억 종류를 표현한다고 한다??! 뭐야 이거...엄청나다! 책에서는 플래그를 클래스로 만들면 아래와 같다고 소개해준다. class Flag{ private: unsigned char mFlags; public: bool check(인수 미정); void set(인수 미정); void reset(인수 미정); }; check 함수로 특정 플래그 상태를 조사하고 set..