디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

적분시리즈: 7. 로직과 디자인을 분리하자1.

∫ 2t dt=t²+c갤로그로 이동합니다. 2009.12.06 14:33:25
조회 396 추천 1 댓글 2


이쯤되면 어지간한 그래픽 출력은 다 끝났다. 이제 본격적으로 게임로직을 짜는 부분에 들어가자.... 가기전에 먼저 로직과디자인을 분리해야 한다. 디자인은 프로그래머의 몫이 아니다. 디자인은 디자인하는 사람이 열심히 하고, 프로그램에서는 외부에서디자인된 파일을 읽어와서 적절하게 화면에 그려주도록 하면 된다.
먼저 텍스쳐와 스프라이트 데이터들을 외부에서 읽어오도록 만들어보자.
텍스쳐를 읽어오기 위해서는 텍스쳐의 주소들을 모아놓은 파일이 필요하다. 그렇게 하기 위해서 문자열 배열을 관리하는 클래스 GStrings를 만들어보자.
class GStrings
{
protected:
    vector<wstring> m_vstr;
public:
    const wstring& operator[](size_t i) const; //const 버전
    wstring& operator[](size_t i); //일반 버전
    size_t size() const;
    GRET Load(DataInMem* file);
    GRET Save(DataInMem* file) const;
};

정말 간단한 클래스이다. 파일에서 문자열배열을 읽어오고, 파일에 문자열배열을 쓰는 일을 한다.
파일에서 문자열 배열을 읽어오려면 파일에 문자열배열이 저장되는 방식을 지정해놓아햐 한다.
다음과 같이 정해놓도록 하자.

[파일 구조]
 DWORD num; //문자열 배열의 갯수
 struct{
  DWORD len; //문자열의 길이
  wchar_t str[len]; //실제 문자열 데이터
 } strings[num]; //이 구조체가 num개 반복된다.
c++코드를 빌려서 파일을 구조를 나타내보았다. (물론 실제 c++코드가 아니므로  코딩에 사용하면 에러메세지를 내뿜을 것이다.)

이제 이를 바탕으로 문자열배열을 읽어오는 함수를 만들어보자.
GRET GStrings::Load(DataInMem* file)
{
    DWORD num;
    if(file->read(&num, 4)<4)return GRET_ERROR_FILE;
    m_vstr.resize(num);
    for(DWORD i=0;i<num;i++)
    {
        wchar_t temp[256]={0,};
        DWORD len;
        file->read(&len, 4);
        file->read(temp, len*2);
        m_vstr[i]=temp;
    }
    return GRET_OK;
}

먼저 num을 읽어와서 문자열배열의 갯수를 얻은 다음, 문자열을 읽어들이는 작업을 num번 반복한다.

파일에 저장하는 건 읽어오는걸 반대로하면 된다.
GRET GStrings::Save(DataInMem* file) const
{
    DWORD num=(DWORD)m_vstr.size();
    if(file->write(&num, 4)<4)return GRET_ERROR_FILE;
    for(DWORD i=0;i<num;i++)
    {
        DWORD len=(DWORD)m_vstr[i].size();
        file->write(&len, 4);
        file->write(m_vstr[i].c_str(), len*2);
    }
    return GRET_OK;
}

참 쉽죠? 근데 Save 함수 뒤에 const가 붙어있다. 이는 Save함수가 클래스의 내용을 변경시키지 않는다고 보장해주는것이다. 문자열배열을 파일에 저장하는 함수가 문자열내용을 변경시킬 일은 없다. 이럴경우 const를 붙여주면, 클래스의 내용을변경시키는 코드는 에러로 간주된다. 따라서 잘못된 코드를 짜는 것을 막을 수 있다. 그러므로 클래스의 내용을 변경시키지 않는함수에는 const를 꼭 붙이도록 하자.

그리고 읽어들인 배열의 값을 참조할 수 있게 operator[]함수도 만들자. operator[]는 기존의 배열 연산자를 함수형태로 바꾸어 표시한 것이다.
즉 a.operator [](10)이라는 코드는 a[10] 과 정확하게 같다.

wstring& GStrings::operator [](size_t i)
{
    return m_vstr[i];
}

const wstring& GStrings::operator [](size_t i) const
{
    return m_vstr[i];
}
operator[]함수를 두 벌 만들었다. 하나는 const, 다른 하나는 비 const 버전이다.

텍스쳐를 읽어오는 부분은 완성되었으니, 스프라이트데이터를 읽어오는 부분도 만들어보자.

GRET GSprites::LoadSprites(DataInMem* file)
{
    DWORD num;
    if(file->read(&num, 4)<4)return GRET_ERROR_FILE;
    m_vspr.resize(num);
    file->read(&m_vspr[0], sizeof(GSpriteDat)*num);
    return 0;
}
스프라이트데이터 파일의 구조는 다음과 같이 정하겠다.
[파일 구조]
 DWORD num; //GSpriteDat 배열의 크기
 GSpriteDat data[num]; //실제 GSpriteDat 데이터

이제 이런 문자열배열 파일과 스프라이트데이터 파일을 만드는 프로그램도 짜야한다. 별로 복잡한 것이 없으므로 따로 설명하지않는다. 첨부파일의 acc폴더안에 sprite.exe와 string.exe로 소스파일과 함께 첨부되어있으므로 참고하시라.(귀찮아서 대충대충 짠 코드라 별로 볼 것은 없다.)

이제 파일에서 텍스쳐와 스프라이트 데이터를 읽어와서 화면에 뿌려주게 코드를 짜보자.

MPlayGame::MPlayGame()
{
    GStrings strs;
    strs.Load(&DataInFileDirect(L"textures.str"));
    for(size_t i=0;i<strs.size();i++)
    {
        m_sprs.LoadTexture(&DataInFileDirect(strs[i].c_str()));
    }
    m_sprs.LoadSprites(&DataInFileDirect(L"sprites.dat"));
}
void MPlayGame::OnDraw()
{
    m_sprs.DrawSprite(0, 0, 0);
    m_sprs.DrawSprite(1, 256, 0);
    m_sprs.DrawSprite(2, 0, 256);
}
생성자에서 텍스쳐와 스프라이트 데이터를 읽어와서
OnDraw함수에서 그려주고 있다.
참 쉽죠?

추천 비추천

1

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 공개연애가 득보다 실인 것 같은 스타는? 운영자 25/10/06 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47776 65
2895119 ㄱㅈㅇ 화재나고나서 좀 복구했다는거 예전거링 ♥덩냥이♥갤로그로 이동합니다. 00:27 6 0
2895118 murmulator 발명도둑잡기(118.216) 00:05 7 0
2895116 PICO-56 65c02 컴퓨터 발명도둑잡기(118.216) 00:04 7 0
2895114 라스베리파이 피코로 286 만들기 발명도둑잡기(118.216) 00:02 9 0
2895111 주 4.5일제를 왜 반대하는거임? [1] 야옹아저씨갤로그로 이동합니다. 10.09 22 0
2895110 성소수자는 미인계에 약한 것 같아 보인다. [1] 발명도둑잡기(118.216) 10.09 19 0
2895108 글 쓰고 자거 싶은데.. 이미 체력이.. [2] ♥덩냥이♥갤로그로 이동합니다. 10.09 21 0
2895107 오랜만에 왔는데 갤이 더 씹창이 나있구나 [5] 아스카영원히사랑해갤로그로 이동합니다. 10.09 38 0
2895106 날벌레들은 모기약으로 안 죽넹.. [3] ♥덩냥이♥갤로그로 이동합니다. 10.09 27 0
2895104 귀국하면 집가서 택배 뜯어야 됨 [1] 류류(122.197) 10.09 16 0
2895103 나트륨찡은 요즘 어디 갤에서 노냐 [1] 류류(122.197) 10.09 21 0
2895102 키 140대 고스로리 찍지못했음 ㅇㅅㅇ 류류(122.197) 10.09 10 0
2895101 모기가 하나도 없어서 완전 개꿀이였음 류류(122.197) 10.09 9 0
2895100 140대 고스로리녀 돈주고 함 떡치자 라고 할걸 류류(122.197) 10.09 14 0
2895099 [냥덩칼럼] 삶은 죽음으로 시작된다 [5] ♥덩냥이♥갤로그로 이동합니다. 10.09 31 0
2895098 귀국하면 피부과 가야겠다 류류(122.197) 10.09 12 0
2895097 마지막날에 키 140대에 호리호리한 고스로리 코스녀봤음 [2] 류류(122.197) 10.09 21 0
2895096 한투증 api 웹소켓 자꾸 데이터 보내다가 마는데 [2] 밀우갤로그로 이동합니다. 10.09 19 0
2895095 내일 헨조센으로 귀국 류류(122.197) 10.09 11 0
2895093 모기 느낌.. 심상치 않당.. [2] ♥덩냥이♥갤로그로 이동합니다. 10.09 21 0
2895087 박시영, 충격적인 얘기입니다. 미국이 사회주의가 될 수 도 있다? 발명도둑잡기(118.216) 10.09 9 0
2895086 한국사람들은 한국이 어떤 위치에 있는지 모른다 발명도둑잡기(118.216) 10.09 15 0
2895085 몰랐는데 이재명 되게 서민적이네 [1] 칸예갤로그로 이동합니다. 10.09 33 0
2895084 파이썬 망해간다. [2] 프갤러(59.16) 10.09 41 0
2895083 따당이 얼굴 봤는데 초고수임 [5] ♥덩냥이♥갤로그로 이동합니다. 10.09 42 0
2895082 김민지 선수의 주종목 400m에 도전한다 진짜 승부 과연 결과는? 발명도둑잡기(118.216) 10.09 14 0
2895081 따당이 개발자 점수 몇점인가요 ㅇㅅㅇ [7] 따당갤로그로 이동합니다. 10.09 63 0
2895080 동아시아 유일 자국어로 타자 치는 나라🇰-1f1f7; 발명도둑잡기(118.216) 10.09 18 0
2895079 '시빌 워' 현실화?…'이민자 단속' 軍 투입에 두쪽난 미국 [1] 발명도둑잡기(118.216) 10.09 15 0
2895077 시카고로 북진한 텍사스군.. '160년 만의' 내전 위기 발명도둑잡기(118.216) 10.09 10 0
2895074 김민지 vs 김동현 100m 발명도둑잡기(118.216) 10.09 18 0
2895072 이제 하다하다 k오_피가 상륙했노 질문 받는다 ㅇㅇ(39.7) 10.09 15 0
2895068 사람이 언제 죽는다고 생각하나? [2] ♥덩냥이♥갤로그로 이동합니다. 10.09 40 0
2895067 때로는 좋은건 가까이 있다 [2] chironpractor갤로그로 이동합니다. 10.09 32 0
2895066 내일 출근 안하면 개추 ㅋㅋ [1] 루도그담당(118.235) 10.09 26 1
2895062 저녁 발명도둑잡기(118.216) 10.09 15 0
2895060 대학생들도 코딩할때 AI쓰나? [1] 프갤러(121.143) 10.09 33 0
2895056 한글날 기념 소녀시대-Run Devil Run 발명도둑잡기(118.216) 10.09 19 0
2895055 지듣노 ㅁㅌㅊ? [1] 노력갤로그로 이동합니다. 10.09 29 0
2895054 실외기 타고 올라가 韓여성 성폭행한 日남성 체포 발명도둑잡기(118.216) 10.09 24 0
2895053 이상규 전 진보당대표, 전 국회의원 암 투병기 발명도둑잡기(118.216) 10.09 16 0
2895052 프갤 78년생 2명 [3] 프갤러(118.235) 10.09 65 1
2895051 냥덩이 생김새 발명도둑잡기(118.216) 10.09 33 0
2895050 점심 발명도둑잡기(118.216) 10.09 13 0
2895049 추석인데 장가 가고싶어서 울었다 [9] 발명도둑잡기(118.216) 10.09 70 0
2895048 spring 공부하는데 이해가 잘 안돼요 [3] 프갤러(123.215) 10.09 77 0
2895047 언리얼 뭐만하면 인텔리세스 먹통되고 쓸데없는 오류 뜨는데 ㅇㅇ(106.241) 10.09 21 0
2895046 배치파일에서 번호대로 선택하면 특정행위를 수행하는거 프갤러(61.37) 10.09 18 0
2895044 일본 취업 유학 워홀 여행 관련모임 ㅇㅇ(106.146) 10.09 43 0
뉴스 '친한친구' 템페스트, 추석에도 열일 모드…꽃도령 변신에 컴백 스포일러까지 완벽 접수 디시트렌드 10.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2