지금도 하는 사람이 있는지 모르겠지만 얼마전에 부족전쟁이라는 웹 게임을 즐겼었다.
간단하게 즐길수 있으면서도 은근히 중독성이 있기에 틈틈히 플레이 하고는 했다.
어느정도 병력을 모으면 다른 마을들을 약탈하고 다닐수 있는데, 이게 또 한 재미한다.
부족에는 여러가지 병과가 있는데, 각 병과마다 운반할수 있는 양이 다르다.
그래서 아는 분의 요청도 있고해서 간단하게나마 약탈량 계산기를 만들어봤다.
사용법은 단순하다, 자신이 보낼 군대의 수를 적어넣으면 자동으로 그 부대가 가져올수 있는,자원의 양을 표시해준다. 그리고 약간의 편의기능을 몇가지 넣었는데,
-
항상 위 체크버튼에 체크를 해서, 창을 항상 위로 설정할수 있다.
-
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, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
}
else
{
// TopMost Effect off
this->SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
}
}
#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, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
}
else
{
// TopMost Effect off
this->SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
}
}