지금도 하는 사람이 있는지 모르겠지만 얼마전에 부족전쟁이라는 웹 게임을 즐겼었다.
간단하게 즐길수 있으면서도 은근히 중독성이 있기에 틈틈히 플레이 하고는 했다.
어느정도 병력을 모으면 다른 마을들을 약탈하고 다닐수 있는데, 이게 또 한 재미한다.

부족에는 여러가지 병과가 있는데, 각 병과마다 운반할수 있는 양이 다르다.
그래서 아는 분의 요청도 있고해서 간단하게나마 약탈량 계산기를 만들어봤다.


사용법은 단순하다, 자신이 보낼 군대의 수를 적어넣으면 자동으로 그 부대가 가져올수 있는,자원의 양을 표시해준다. 그리고 약간의 편의기능을 몇가지 넣었는데,

  • 항상 위 체크버튼에 체크를 해서, 창을 항상 위로 설정할수 있다.
  • RESET 버튼을 누르면 자동으로 0으로 초기화되고, 맨 처음 창병쪽으로 커서를 옮겨준다.
  • 탭 오더를 순서대로 병과 순서에 맞게 정해놔서 TAB - 수 입력 - TAB - 수 입력 방식으로 쉽게 적을수 있도록 했다.
  • KEY_UP 메시지를 감지해서, 수를 입력하면 바로바로 총합이 표시 되도록 하였다.


그리고, 단순히 글자만 있어보이면 심심하기에, 부족의 홈페이지에서 타이틀 그림과, 병과 아이콘을 가져와 약간 꾸며봤다. 덕분에 처음으로 GDI+를 다뤄보기도 해서, 겸사겸사 공부에도 도움이 됐다.

부족전쟁 약탈량 계산기 주요 소스.
GDI+를 사용하여 JPG 파일 불러와 사용하였다.
GDI+를 처음 사용하는지라 여러 샘플 코드를 참조 하였고,

몇몇 코드는 미숙해 보인다면 그것은 당신의 판타지!!

 

약탈량 계산 부분은 지루하게 더하고, 곱셈만하는 부분이니 생략...

// declaration for GDI+ 
#include <GdiPlus. h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus")

// initialize GDI+
ULONG_PTR gpToken;
GdiplusStartupInput gpsi;

if (GdiplusStartup(&gpToken,&gpsi,NULL) != Ok) {
        MessageBox(NULL,
"GDI+ 라이브러리를 초기화할 수 없습니다.","알림",MB_OK);
        
return 0;
}

// Drawing JPG
void CTribalWarsDlg::OnPaint()
{
        CPaintDC dc(
this);        // device context for painting    
        Graphics G(dc);                
// device context for GDI+

        Image *pI;                        
// JPG Image Pointer

        pI=Image::FromFile(L
"res\\hd.jpg");
        G. DrawImage(pI,-
10,0);

        pI=Image::FromFile(L
"res\\unit_spear.jpg");
        G. DrawImage(pI,
35,181,18,18);

        
//
        
//        ... and Continue Drawing JPG Images
        
//

        
delete pI;
}

// Message Process
BOOL CTribalWarsDlg::PreTranslateMessage(MSG* pMsg)
{
        
switch(pMsg->message)
        {
        
case WM_KEYDOWN:
                
switch (pMsg->wParam)
                {
                
case VK_RETURN:
                        
// Disabled Return(OnOK)
                        
return 0;
                }
                
break;

        
case WM_KEYUP:
                
// if Typed Value then Calculate the Value
                CalValue();
                
break;
        }

        
return CDialog::PreTranslateMessage(pMsg);
}

// Always Top Check Box
void CTribalWarsDlg::OnBnClickedTopMost()
{
        UpdateData(
true);

        
if( bCheckedTopMost == TRUE )
        {
                
// TopMost Effect on
                
this->SetWindowPos(&wndTopMost, 0000, SWP_NOSIZE|SWP_NOMOVE);
        }
        
else
        {
                
// TopMost Effect off
                
this->SetWindowPos(&wndNoTopMost, 0000, SWP_NOSIZE|SWP_NOMOVE);
        }    
}

+ Recent posts