이틀동안 정말 말도 안되는 문제로 머리 싸매다 질문 남겨봅니다 ㅠ..
우선
문제가 되는 클래스 부분만 말씀드리겠습니다.
CManager (메니져 클래스) : winMain 에서 선언하며 WndProc(...)에서 CManager.wndProc(...) 함수를 호출합니다.
RESULT CALLBACK winMain::WndProc(...)
{
return c_manager.wndProc(..) 요렇게요..
}
CData (data 관리 클래스) : 싱글턴 클래스 입니다. 어디서든 접근해서 데이터를 조작할수 있습니다.
CAction (data 조작 클래스) : data를 조작하는 클래스 입니다. CData가 싱글턴이라 어디서든 접근할수 있지만 이 클래스가 모든 작업을 할수 있도록 했습니다.
CArea (게임 관련 오브젝트) : 땅따먹기 게임인대 현제 플레이어가 가지고 있는 땅떵어리를 배열로 저장하고 관련된 연산을 하는 클래스 입니다.
우선 관련 클래스는 이정도 이구요..
프로그램이 시작되고..
CManager.WndProc 에 메시지가 전달됩니다.
그리고 WndProc 함수에 WM_CREATE: 가 전달됩니다.
WM_CREATE:
this->init(GAME_PLAYING_STATE);
....
break;
그럼 CManager의 init(int _gameState) 함수가 실행 되겠지요..
init(..) 함수의 본문입니다.
CData::getInstance()->setGameState(_gameState);
c_stage.init();
c_action.init();
여기서 싱글턴 클래스인 CData::getInstance()가 처음으로 호출되면서 객체가 정의됩니다.
getInstance() 본문을 보여드리기 전에
CData 변수 선언은
CData 클래스
private: 선언부에
static CData * c_data;로 선언했습니다.
그리고 getInstance()는
public: 선언부에
static CData * getInstance(); 라고 선언했습니다.
그러면 이제 소스코드로 돌아가서
CData * CData::getInstance()
{
if(c_data == NULL)
{
c_data = new CData;
}
return c_data;
}
getInstance()함수의 정의 이구요..
c_data는 현재 NULL이니 CData의 생성자로 넘어갑니다.
CData::CData()
{
p_Item = new CItem[MAX_ITEM_NUMBER]();
p_Unit = new CUnit[MAX_UNIT_NUMBER]();
p_Background = new CBackGround[MAX_BACKGROUND_NUMBER]();
p_Button = new CBtn[MAX_BUTTON_NUMBER]();
p_Area = new CArea[MAX_AREA_NUMBER]();
......
}
p_Item, p_Uint, p_Background, p_Button 클래스 들은 Area처럼 게임에 쓰이는 오브젝트 들이고
이 4개의 클래스 생성자에서는 Area에 접근하는 일이 없습니다...
Area 클래스가 동적할당 되고 Area 생성자가 실행되는 도중에 문제가 발생합니다.
edgeCounter = 0; 부분에서 오류가 발생하는대요.
edgeCounter는 area.h 파일 즉 클래스 선언부에서 선언된 int형 변수입니다.
여기에 0을 대입하는 순간 문제가 발생하며
생성자 호출이 도중 튕겨 나갑니다.
CData::getInstance()는 WM_CREATE에서 호출되므로
다른 코드가 Area를 건드릴수 있는 가능성이 없구요..
혹시나 싶어서
case WM_NCCREATE:
에서 접근해봐도 이문제가 생기네요...
이 부분에 접근하는 클래스 소스도 붙여넣기 해놓겠습니다.ㅠㅠ
당장 완성시켜야 하는 마감일이 다가오는데.... 기능구현도 못하고 여기서 이러고 있으니 걱정도 되고 미치겠네요..
혹시 이런 비슷한 문제 겪으신분.. 댓글 달아 주시면 감사하겠습니다...
----------------------- winMain --------------------------
#include "Header.h"
CManager c_manager; //manager 클래스 선언.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
return CWndClass::MessageLoop(hInstance, hPrevInstance, lpszCmdParam, nCmdShow, WndProc);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
return c_manager.wndProc(hWnd, iMessage, wParam, lParam);
}
--------------------- CManager -------------------------------
#include "Header.h"
CManager::CManager()
{
//릴리즈 모드하면 CManager 브레이킹 포인트도 패스가 되네요...
//디버깅 모드하면 여기서 브레이킹 포인트가 걸림!
}
CManager::~CManager()
{
}
void CManager::init(int _gameState)
{
//QueryPerformanceFrequency(&freq); 시간 정밀측정 사용 함수(미사용)
//QueryPerformanceCounter(&start);
//경과시간
//QueryPerformanceCounter(&end);
//lapse = (unsigned)((end.QuadPrat - start.QuadPart)/freq.QuadPart);
CData::getInstance()->setGameState(_gameState);
c_stage.init();
c_action.init();
}
void CManager::keyCheck(UINT iMessage, WPARAM wParam, int _gameState)
{
c_action.choiceAction(c_keyInput.DataCheck(iMessage, wParam, _gameState));
}
void CManager::setData()
{
}
LRESULT CManager::wndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int temp;
switch(iMessage)
{
case WM_CREATE:
this->init(GAME_PLAYING_STATE);
SetTimer(hWnd, 1, 150, NULL);
SetTimer(hWnd, 2, 75, NULL);
CWndClass::getInstance()->setWindowhWnd(hWnd);
CWndClass::getInstance()->setWindowDC(GetDC(hWnd));
return 0;
-------------------- CData -------------------------------
#include "Header.h"
#include "Data.h"
CData * CData::c_data; //static 객체는 .cpp에서 알려줘야 함.
CData::CData()
{
p_Item = new CItem[MAX_ITEM_NUMBER]();
p_Unit = new CUnit[MAX_UNIT_NUMBER]();
p_Background = new CBackGround[MAX_BACKGROUND_NUMBER]();
p_Button = new CBtn[MAX_BUTTON_NUMBER]();
p_Area = new CArea[MAX_AREA_NUMBER]();
for(int i = 0; i < 100; i++)
{
DebugMsg[i] = NULL;
DebugMsg2[i] = NULL;
DebugMsg3[i] = NULL;
}
}
CData::~CData()
{
delete []p_Item;
delete []p_Unit;
delete []p_Background;
delete []p_Button;
delete []p_Area;
delete c_data;
}
CData * CData::getInstance()
{
if(c_data == NULL)
{
c_data = new CData;
}
return c_data;
}
-------------------- CArea ---------------------------------
#include "Area.h"
CArea::CArea(void)
{
memset(FieldArray, 0, sizeof(FieldArray));
//int t = 0;
edgeCounter = 0; //문제발생.............
}
--------------------------------------------------------------
에러명...
컴파일 & 빌드 에러가 뜨는건 아니구요.. 저기 값 대입중에 튕기는거 보니.. 거기서 문제가 생긴듯 합니다.
그니까 런탐 에러란건 알겠는데 마지막에 뭐라고 안함?
냅 뭐라고 안하고 튕겨나가요.. 지금 좀 수정하다 보니까.. CArea[0] 에서는 0이 제대로 들어가는대 두번재 CArea[1]에 에서 대입하는 순간 튕기네요..