클래스 갈아엎ㄴ는게..끝나질않아........... 여기에 아이템, 무기, npc, 사운드, 파티클, 간단한 물리, 맵 요소도 추가해야함. ㅎㅎㅎ하하하하하

책따라 이래저래 설계해보다가 망함의 징조가 보인다. 나름 나만의 엔진이라면 엔진이겠다만...

XML연동해서 하드코딩 없이 개체를 생성하는 것 까진 좋은데, 어차피 인게임은 랜덤생성해야 하기 때문에 하드코딩을 해야함.

게다가 기존에 하드코딩되어 있던 것을 외부 파일을 읽어오며 동적으로 만들게 바꾸다보니 모든 인스턴스의 생성방식을 바꿈

예제 소스가 안그래도 중구난방이라 파라미터나 작동 루틴을 막 바뀌는걸 따라하다보니 내 소스까지 꼬였다

인간적으로 XML을 진행하면서 팩토리 패턴을 같이 적용하면서 GUI, 장면처리, 오브첵트 처리를 한번에 다바꾸는게 어딨냐!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1111

시발...! 주석이나 에러처리 하나 안했는데 이미 2천줄인건 둘째치고 한지 너무 오래돼서 기억도 가물가물. 수습하기엔 너무 멀리왔다

저자 개새끼...!! 진짜 개새끼!! 이걸 어떻게 바로잡냐....껄껄껄


+.

바로잡는데에 드디어 성공...... 장장 세 시간의 대장정을 거쳤다. 후.. 시간아까워

+

특정 png 파일이 출력이 안된다. 같은 코드 다른 파일로 테스트해보니 잘 되는걸 봐서 이미지에 뭔가 문제가 있는듯.

....뭐지대체..

'프로젝트 일지 > 게임 프로그래밍' 카테고리의 다른 글

심심풀이 습작 - 7일차  (0) 2015.10.18
심심풀이 습작 - 6일차  (1) 2015.10.11
심심풀이 습작 - 5일차  (0) 2015.10.09
심심풀이 습작 - 4일차  (0) 2015.10.09
심심풀이 습작 - 3일차  (0) 2015.10.07



자바로 설명돼있긴 하지만 충분히 자세하다.

슈퍼클래스를..공유하는,...뭐시깽이들의.. 인스턴스를... 한 클래스만으로... 자유롭게...만들고 싶을 때...쓰는 패턴...거시기..인 것 같긴 한데...

공부가 아직 더 필요한 듯..... 싱글톤과 결합해서 쓰는 듯 하다.

일반적인 프로그램보다 게임처럼 클래스가 사방팔방 여러 갈래로 나뉘고 동적으로 인스턴스를 생성하는 곳에 쓰이는 것 같음.

정말 뜬금없는 오류가 아닐 수 없다.

우선 나를 비롯한 많은 사람들이, "내가 뭔가 잘못한 게 있나?"하며 프로젝트 설정, 소스코드, 경로 설정을 이잡듯 뒤집어 엎었을 것이다.

한마디로 정리하자면, 내가 뭔가 잘못한 건 아니다. 당당히 남탓을 해도 된다(......)


일단 이 오류를 발견한 계기를 거슬러 올라가본다. 컴퓨터를 옮기기 전 VS2010에서 작업하던 게임 프로젝트가 있었다.

오랜만에 잠깐 손보고 싶어서 프로젝트를 열어봤는데, 설정을 티끌만치도 건들지 않고 전 환경과 동일한 경로, 같은 파일, 같은 폴더를 만들어 두었으나 링크에러만이 나를 반겼다!!

찾아보니 비주얼스튜디오 및 VC 컴파일러가 버전업하면서 sprintf, fprintf등등 std시리즈 함수가 define된 원형 함수를 약간 바꾼 듯 한데,

기존 구 VC 컴파일러로 작업된 SDL라이브러리가 현재는 없는(정확히는 이름이 다른) 함수를 쓰느라 깨져버린 것...

사실 구버전이라고 하기도 무색한게 불과 2010에서까지만해도 잘 되었고, 이런 io함수는 감히 쉽게 바꿀만한 함수가 아니기 때문에...

최적화 목적이 아니었을까 싶지만 대체 왜 바뀐건지 정확히는 모른다. 별로 알기도 귀찮고.


자세한 원인은 밑의 사진을 참조 - 출처는 스택오버플로우("unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2").

함수 포인터 배열을 넘겨주던 기존 방식이, 파라미터 번호에 따라 해당 함수 포인터를 바로 넘겨주도록 바뀐 모양.


그래서 해결법은, 세 가지 방법 중 하나(혹은 둘?)를 고르면 된다.

1. 위의 스택오버플로우 글에 적혀있듯이 __iob_func() 함수를 직접 선언한다. stdin, stdout, stderr에러가 났을 때만 가능하지 싶다.

2. stdio함수 링크 오류인 경우 링커 옵션에 legacy_stdio_definitions.lib를 추가하라카신다.

3. 오픈 소스 라이브러리인 경우, 해당 사이트(나의 경우 sdl)에서 제공하는 라이브러리 프로젝트를 직접 받아 VS2015로 열면 컨버팅을 해주는데, 이걸 컴파일해서 출력된 lib, dll파일을 이용하는 것.



간만에 보는 참 반가운 친구. 오랜만이당☆★☆★!!!!!!!!!!


잡담.

몰랐는데 나 충돌처리 부분을 만들어 뒀었다...........................게임오버 화면도 만들어 뒀었다.

뭐가 귀찮아서 멈춘거지!!!근데 때려치고 비주얼 노벨식 어드벤처 게임 엔진 만들고싶다. 플랫포머는 은근히 그래픽적인 면에서 구현이 귀찮단말이지..

오탘쿠 친구의 부탁으로 급조. 원하는 좌석이 나올 때 까지 새로고침하며 확인하고, 제일 앞줄의 좌석을 선택하고 결제창까지 넘어가는 단순반복 매크로.

아마 거의 모든 사이트, 모든 좌석에 다 대응할 수 있도록 만듦(Y모사이트와 I모사이트만 확인했지만).

대신 사전 준비가 좀 번거롭다. 그래도 최대한 사용하기 편하게 만들려고 노력함.

위치값을 일일이 쳐서 넣는건 불편할 것 같아서 버튼 클릭 후 해당 위치를 클릭하도록 만들었다던지...

파일 공유는 하지 않을 생각..


VS2010, MFC. 약 이틀.

전역후킹, 스크린캡쳐, SendInput 위주로 이용.


증상.

1. VS2010SP1가 설치가 안 되거나, 제거가 안 되고, 복구도 안 된다. (필자의 경우 설치 자체는 되어있다..)

2. "이 컴퓨터 상태에서는 지원되지 않으므로 Microsoft Visual Studio 2010 서비스 팩1을 설치할 수 없습니다." 라고 뜬다.

-> 이 오류는 주로 '용량이 없을 때' 일어나는 오류이므로 용량(5.5GB)부터 체크해야 한다. 확보 후에도 해당 에러가 난다면 계속 글을 읽기 바람.

3. 컴파일 시 COFF변환 오류가 뜬다. (LNK에러)

-> 해당 프로젝트가 VS2010SP1가 설치된 상태에서 생성되었으나 현재 VS2010에 SP1이 적용되지 않았을 때 발생하는 오류라고 한다.


이런!!에러가!!뜬다!!

이거때문에 비주얼 스튜디오를 지우고 깔기를 몇번했던가. 콘솔 프로젝트는 메니페스트 포함->아니오 설정으로 어느정도 커버가 됐는데

MFC 프로젝트는 도저히 컴파일이 안 됐음.

해외 쪽 웹에 있던 해결책은 이것이다. http://stackoverflow.com/questions/5296830/microsoft-visual-studio-2010-service-pack-1-installation/5300990#5300990


그러타!! 이 용자께서는 제어판에서 프로그램 추가/변경을 통해 Microsoft Office Developer Tools (x64)를 설치해보라고 하고 있다!!

우선 난 x86인고로 x86으로 설치해보았다.


요로코롬...

두둥.......두둥... 설치 완료 후 다시 SP1을 설치해본다.. 하지만 이걸 읽는 사람들은 미리 밑부분을 읽어 C++런타임을 제거한 후 설치하기바란다...


으아아!! 설치가 되고 있지 아니한가!!

그런데..........


무려 20~30분 간 기다린 후 마지막 설치 과정에 에러가 났다. 이번엔 또 뭐가 문제란 말인가ㅜㅜㅜㅜㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

해당 문제의 해결책도 찾아보았다..........


(고통)

설치를 취소하고 런타임을 제거한다!!!!!!!!!!!!!!!!!!!!!!!! 욕이 나오고 있으나 생략하겠다!!!!

다시.......ㅋ...........ㅋㅋㅋㅋ........ㅋㅋㅋ 서비스팩을 설치하고 있다.......웃음이 나온다......


그리고 끝으로 성공!

 항목

 내용 

 환경

 VS2010 

 언어

 C++, XML

 사용 라이브러리

 TinyXML2(https://github.com/leethomason/tinyxml2)


xml에 대한 설명은 https://ko.wikipedia.org/wiki/XML으로 대신한다.

Tiny XML-2는 간단하고, 작고, 효율적인 C++ XML parser로서 다른 프로그램에도 쉽게 통합될 수 있는 라이브러리다. DOM 방식을 이용하고, C++ 객체를 통해 데이터를 읽고 쓰고 저장할 수 있다. 아예 없는 문서를 객체를 통해 생성하는 것도 가능하다. 각각 한개의 CPP/H파일로 이루어져 단순히 기존 프로젝트에 추가하면 되기 때문에 사용이 간단하다.

이하는 사용 예시.


기존 프로젝트에 라이브러리 파일을 추가해 준다. Path 환경 변수로 설정하는 것도 가능하고, Project Settings에서 Include Path추가로도 가능하다.


헤더를 인클루드뿅


xml파일을 작성하는 예시이다. 에러 확인은 생략했다.


컴파일 후 실행시 프로젝트 폴더 내에 파일이 생긴다.


해당 파일의 내용은 코드로 작성한 것과 동일.


xml파일 속 데이터를 읽어오는 부분이다. 사실 Attribute의 이름은 몰라도 된다. 순차적으로 들고오는 연결리스트 식으로도 가능하기 때문.


출력 결과. 참고로 한자도 잘 적어지고 잘 읽어지는 것을 알 수 있다.


끝.

에휴 내 팔자야

2일차가 9/25, 3일차가 10/7이었고 오늘은 딱 일주일 만의 7일차.. 8일차가 얼마나 뒤일진 모르겠다. 뭐라도 되면 된거지 뭐(...)

사실 내 본업은 따로 있으므로 완성이 더딜수록 인생이 충실하다는 증거(...)



  • 충돌 체크 기본적인 부분만
  • 적과 충돌했을 때 게임 오버 처리
  • 끝나고 했던 곳 부터 다시 시작하는 것 따위는 필요없다! 죽으면 끝이다!



이제 XML 처리 파트(Data-driven design)에 들어간다.. 이건 진짜 안 해본 건데....... 기대반 걱정반

횡 스끄로-르 아꾸숀!

갑자기 쌈마이가 컨셉이 되었다.. 기능은 구현 안하고 타이틀 화면에 영혼을 쏟아부었다.


  • 타이틀 화면을 대충 만들고 밑에 랜덤 좀비 스프라이트가 랜덤으로 움직이게 만들었다.
    • 사실 스프라이트 이미지 중 랜덤 행을 24배 크기로 띄우는 거라 버벅거리진 않을까 걱정이 되었더랬다.
  • 게임오버 화면을 만들었다.

사실 체력이 0이 되면 게임 오버 화면을 띄우는 부분을 만들어야 하는데 이걸 하려면 충돌체크도 만들어야 할테고 귀찮아서 다음으로 미루는 것으로...ㅠㅠ

이제 5일차에 들어섰다..!!

 예제를 보며 코드를 작성하던 중, 텍스쳐 매니저를 갑자기 쓰는데 설명 하나 없어 급 당황. '나는 이 책을 왜 읽는걸까?'라는 의문을 떠올리며 저자를 향한 수많은 욕과 저주를 내뱉었는데 헤더 파일을 생성하려고 하니 같은 이름 파일이 있다는 에러가 떴다. 열어보니 이미 훨씬 전에 만들어 놓은데다가 잘만 쓰고 있었다!!!!!!!1 왜 새롭게 느껴졌을까.. 난 치X가 온 것이 분명하다...


  • 게임 내 상태를 관리하는 FSM(날아다니는 스파게티 뭐시기 말고)을 만들었다.
  • 버튼 객체를 만들고 마우스 움직임에 따라 버튼의 텍스쳐가 바뀌도록 했다.
  • 클릭시 수행 할 함수 포인터를 추가했다. 내가 전에 버튼 만들 적에 생각해냈던 방법이랑 완전히 똑같다!! 내가 작년엔 참 총명했군.......
  • 속도의 방향에 따라 이미지를 뒤집도록 했다. 아직 모션을 바꾸는 기능은 만들지 못했지만..
  • 일시정지 화면을 만듦. 스테이트 머신이 약간 특이한게 스택 구조로 되어 있다.
    • 화면 상 나타나는 state는 무조건 스택(실제론 벡터이지만)의 최상단이다.
    • 현재 스택에 들어있고, 처리되는 state를 A라고 하자.
    • A 위에 다른 장면인 B를 push하면 B가 현재 처리되는 state가 된다. (A는 FSM 스택 내부에 존재)
    • Pop하게 되면 B state가 사라지고 A가 최상단이 되어 화면에 나타난다.
    • 우왕ㅋ굳ㅋ A 내 객체는 B가 상단이 되더라도 다 남아있기 때문에 값이 그대로 보존되어 있다.
    • 사실 말은 간단하게 해놨지만 장면을 pop 혹은 교체 할 때 내부 객체들, 미쳐날뛰는 포인터, 텍스쳐들을 잘 처리해주어야 한다. 안 그러면 메모리가 와장창..


일단 오늘은 이정도만.....

'프로젝트 일지 > 게임 프로그래밍' 카테고리의 다른 글

심심풀이 습작 - 7일차  (0) 2015.10.18
심심풀이 습작 - 6일차  (1) 2015.10.11
심심풀이 습작 - 4일차  (0) 2015.10.09
심심풀이 습작 - 3일차  (0) 2015.10.07
심심풀이 습작 - 2일차  (0) 2015.09.25

 어제인가 그저께인가에 이어서 작업. 입력을 받는 부분 위주로 만들었다.

 그리고 앞서 2015/09/25 - [프로젝트 일지/게임 프로그래밍] - 심심풀이 습작 - 2일차 에서 책을 좋게 평가했는데, 진행하다보니 문제가 많다.

책이 몇 판인지는 모르겠지만(사실 개정판은 없을 것 같다) 간간히 오류가 있고, 내가 놓쳤는지 아무리 책을 뒤져도 내용이 나오질 않는 함수가 있다. 뭘까 이거.. 대충 이런 함수겠거니 하고 만들긴 했지만 은근 신경쓰인다. 이것 뿐만 아니라 전체적으로 설명이 좀 빈약하고 오류가 있음. 컴파일이 안될 수 밖에 없는 코드가 예제로 들어가있을때는 이 저자는 대체 소스를 어디서 어떻게 만들어내는지 궁금하기도 하다. 완성품을 다 만든 상태에서 대충대충 과정을 보여주느라 그런걸까?

 원서라 영알못인 내가 감히 이렇게 평가를 내는 게 꺼림칙해서 아마존 쪽 리뷰도 찾아봄. "발상은 좋았으나 세련됨이 딸린다.", "이 책의 코드는 버그로 가득차 있다!"(....). 그래도 시작한 이상 끝은 봐야겠지........


오늘한 것

  • 조이스틱을 초기화하고 입력을 받을 수 있도록 함. 사실 키보드로 만드는 게 정석일텐데, 어쩌다보니 이렇게 되었다. 키보드로 바꾸는거야 간단하지만 처음에는 조이스틱용 코드인지도 모르고 그냥 치다가 중간부터 '응...?' 싶었다. 새로운 경험이 될 듯.
  • 입력에 따라 움직......일 터인데...분명 상하좌우만 움직이는데 뭔가 이상하다. 어째서인지 대각선으로 간..다?
    • 혹시 조이스틱 문제인가 싶어서 장치관리자에서 입력을 따로 확인해보았는데 딱히 보이는 문제는 없음......
    • 이상한 점이 많은 게 0,1,3,4번축을 입력으로 받는데(예제상) 0번축만 조작했는데 뜬금없이 1번축도 조작이 들어온다.
    • 보통 0번축이 x축, 1번축은 y축 이렇게 사용될텐데 내가 쓰는 조이스틱은 뜬금없이 4번축을 y축으로 사용한다;;
    • 짜증나서 걍 1번축 3번축을 주석처리했다. 1번 축 입력은 대체 왜 잡히는 것일까. 다른 조이스틱도 확인해보고 싶은데 찾기가 귀찮은 관계로 생략.. 일단은 해결됨.
  • 마우스 입력을 처리하자니 갑자기 화가 나기 시작한다. 시부럴 글을 쓰는 지금 어디선가 폭죽을 터뜨리는 것 까지 짜증난다. 왜 폭죽질이여! 마우스 입력 하나하나까지 벡터로 받아서 처리하는 저 깐깐함이 짜증나는 것이다.
  • 키보드 입력을 받아 이동하는 부분을 만들었다. SDL_GetKeyboardState 함수를 이용하면 편하게 만들 수 있다는 사실을 알게 되었다.
    • 해당 함수는 const Uint8 *를 반환하는 함수이다. 이걸 받아 배열처럼 사용하고(Uint8*로 캐스팅할 것), 인덱스는 SDL_SCANCODE 상수로 사용하면된다.
      • if( m_pKeyState[_key] == 1 ) 이런식으로 말이다. 여기서 _key에 들어가는 값은 앞서 말했다시피 SDL_SCANCODE값.
  • 코드 정리. 약간 짜증나는 게 있다...........왜 갑자기 소스를 참고하라며 생략이 되는 것인가....이거때문에 코드 좀 갈아엎었는데... 심지어 함수 두개는 어떻게 쓰는지 알려주지도 않아..... 빌어먹을 예제는 일일이 사이트에 들어가 이메일이랑 이름을 쳐서 메일로 들어가 받아야 하고 말이다.
  • 게임 상태를 관리하는 부분에 들어가기 시작해따..


투 비 컨티뉴드...... 벌써 책의 절반 가까이 왔다. 한 게 아무것도 없는 것 같은데..

'프로젝트 일지 > 게임 프로그래밍' 카테고리의 다른 글

심심풀이 습작 - 6일차  (1) 2015.10.11
심심풀이 습작 - 5일차  (0) 2015.10.09
심심풀이 습작 - 3일차  (0) 2015.10.07
심심풀이 습작 - 2일차  (0) 2015.09.25
심심풀이 습작 - 1일차  (0) 2015.09.24

+ Recent posts