📄 main.cpp
字号:
#include <fstream>
using namespace std;
#include "GKL.h"
using namespace GKL;
#include "FinalCore.h"
#include "FinalJudge.h"
/**
* for JudgeScene
*/
const int LOGO_WIDTH = 100;
const int LOGO_HEIGHT = 50;
class LogoControl: public virtual Control
{
public:
LogoControl(Window *pWnd, int x, int y, int playerIndex, int gameIndex):
Control(pWnd, false, true),
mX(x), mY(y),
mPlayerIndex(playerIndex), mGameIndex(gameIndex), mLogoIndex(0)
{
}
virtual ~LogoControl(void)
{
}
protected:
virtual int onDrawDetect(int &flagDraw)
{
int logoIndex = 0;
if(mPlayerIndex > 0)
logoIndex = ((FinalJudge*)leader.mpJudge)->getPlayer(mPlayerIndex);
else if(mPlayerIndex > -12)
logoIndex = ((FinalJudge*)leader.mpJudge)->
getPlayer((leader.mPage - 1)*3 - mPlayerIndex);
else
logoIndex = ((FinalJudge*)leader.mpJudge)->
getPlayer(12 + ((leader.mPage - 1)*2 - 12 - mPlayerIndex)%8);
if(mLogoIndex != logoIndex)
{
mLogoIndex = logoIndex;
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
return 0;
}
virtual void reDraw(void)
{
if((mLogoIndex > 0) && (mLogoIndex <= 12))
{
BitBlt(mpPnl->gethMemDC(), mX, mY, LOGO_WIDTH, LOGO_HEIGHT,
leader.mhLogoDC[mLogoIndex - 1], 0, 0, SRCCOPY);
}
else
{
RECT rect = {mX, mY, mX + LOGO_WIDTH, mY + LOGO_HEIGHT};
HBRUSH hBr = CreateSolidBrush(0x000000);
FillRect(mpPnl->gethMemDC(), &rect, hBr);
DeleteObject(hBr);
}
}
virtual int onKBEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
return 0;
}
virtual int onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult);
protected:
int mX, mY;
int mPlayerIndex, mGameIndex, mLogoIndex;
};
class ScoreControl: public virtual Control
{
public:
ScoreControl(Window *pWnd, int x1, int y1, int x2, int y2, int index):
Control(pWnd, false, false),
mX1(x1), mY1(y1), mX2(x2), mY2(y2),
mIndex(index),
mScore1(0), mScore2(0)
{
}
virtual ~ScoreControl(void)
{
}
protected:
virtual int onDrawDetect(int &flagDraw)
{
unsigned char score1, score2;
((FinalJudge*)leader.mpJudge)->getScore((leader.mPage - 1)*3 + mIndex, score1, score2);
if((mScore1 != score1) || (mScore2 != score2))
{
mScore1 = score1;
mScore2 = score2;
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
return 0;
}
virtual void reDraw(void)
{
TransparentBlt(mpPnl->gethMemDC(), mX1 + 37, mY1, 25, 50,
leader.mhNumbersDC, mScore1*25, 0, 25, 50, 0x000000);
TransparentBlt(mpPnl->gethMemDC(), mX2 + 37, mY2, 25, 50,
leader.mhNumbersDC, mScore2*25, 0, 25, 50, 0x000000);
}
virtual int onKBEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
return 0;
}
virtual int onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
return 0;
}
protected:
int mX1, mY1, mX2, mY2;
int mIndex;
unsigned char mScore1, mScore2;
};
class JudgeScene: public virtual Scene
{
public:
JudgeScene(Window *pWnd):
Scene(pWnd),
mDTGroupGame(false, true),
mETGroupGame(false, true),
mDTFinalGame(false, true),
mETFinalGame(false, true),
mDTContent(false, true),
mETContent(false, true)
{
alert(mpWnd == NULL);
alert(mpWnd->gethWnd() == NULL);
leader.mhNumbersBmp = (HBITMAP)LoadImage(NULL, L"numbers_25x50.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
alert(leader.mhNumbersBmp == NULL);
leader.mhNumbersDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
alert(leader.mhNumbersDC == NULL);
leader.mhNumbersBmpOld= (HBITMAP)SelectObject(leader.mhNumbersDC, leader.mhNumbersBmp);
for(int i=0; i<12; i++)
{
wchar_t fileName[MAX_MESSAGE_LEN];
snwprintf(fileName, MAX_MESSAGE_LEN, L"./Strategy%d/logo.bmp", i + 1);
leader.mhLogoBmp[i] = (HBITMAP)LoadImage(NULL, fileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
alert(leader.mhLogoBmp[i] == NULL);
leader.mhLogoDC[i] = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
alert(leader.mhLogoDC[i] == NULL);
leader.mhLogoBmpOld[i]= (HBITMAP)SelectObject(leader.mhLogoDC[i], leader.mhLogoBmp[i]);
}
}
virtual ~JudgeScene(void)
{
HBITMAP hNumbersBmp = (HBITMAP)SelectObject(leader.mhNumbersDC, leader.mhNumbersBmpOld);
alert(leader.mhNumbersBmp != hNumbersBmp);
DeleteObject(leader.mhNumbersBmp);
DeleteDC(leader.mhNumbersDC);
for(int i=0; i<12; i++)
{
HBITMAP hLogoBmp = (HBITMAP)SelectObject(leader.mhLogoDC[i], leader.mhLogoBmpOld[i]);
alert(leader.mhLogoBmp[i] != hLogoBmp);
DeleteObject(leader.mhLogoBmp[i]);
DeleteDC(leader.mhLogoDC[i]);
}
}
protected:
virtual void onInit(void)
{
// group
{
ImagePanel *pImagePnl = new ImagePanel(mpWnd, 0, 0, 800, 600, L"groupGame.bmp");
mDTGroupGame.addTrigger(pImagePnl);
int x[] = {
175, 375, 175, 375, 175, 375, 575, 575};
int y[] = {
100, 100, 250, 250, 400, 400, 200, 350};
int pi[] = {
0, -1, -1, -2, -2, 0, -12, -15};
int gi[] = {
0, 0, 1, 1, 2, 2, -1, -1};
for(int i=0; i<8; i++)
{
LogoControl *pLogoCtl = new LogoControl(mpWnd, x[i], y[i], pi[i], gi[i]);
mETGroupGame.addTrigger(pLogoCtl);
pImagePnl->addControl(pLogoCtl);
}
for(int i=0; i<3; i++)
{
ScoreControl *pScoreCtl = new ScoreControl(mpWnd,
x[i*2], y[i*2] + 50, x[i*2 + 1], y[i*2 + 1] + 50, i);
mETGroupGame.addTrigger(pScoreCtl);
pImagePnl->addControl(pScoreCtl);
}
}
// final
{
ImagePanel *pImagePnl = new ImagePanel(mpWnd, 0, 0, 800, 600, L"finalGame.bmp");
mDTFinalGame.addTrigger(pImagePnl);
LogoControl *pLogoCtl;
for(int i=0; i<8; i++)
{
pLogoCtl = new LogoControl(mpWnd, 120, i*70 + 30, i + 12, -1);
mETFinalGame.addTrigger(pLogoCtl);
pImagePnl->addControl(pLogoCtl);
}
for(int i=0; i<4; i++)
{
pLogoCtl = new LogoControl(mpWnd, 290, i*140 + 65, i + 20, i + 12);
mETFinalGame.addTrigger(pLogoCtl);
pImagePnl->addControl(pLogoCtl);
}
pLogoCtl = new LogoControl(mpWnd, 460, 135, 24, 16);
mETFinalGame.addTrigger(pLogoCtl);
pImagePnl->addControl(pLogoCtl);
pLogoCtl = new LogoControl(mpWnd, 460, 415, 25, 17);
mETFinalGame.addTrigger(pLogoCtl);
pImagePnl->addControl(pLogoCtl);
pLogoCtl = new LogoControl(mpWnd, 630, 275, 26, 18);
mETFinalGame.addTrigger(pLogoCtl);
pImagePnl->addControl(pLogoCtl);
}
{
SolidPanel *pSolidPnl = new SolidPanel(mpWnd, 0, 0, 50, 600, 0xCCCCCC);
mDTContent.addTrigger(pSolidPnl);
Button *pContentBtn = new Button(mpWnd, 20, 90, 30, 60, L"A组", JudgeScene::onClickPage1);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
pContentBtn = new Button(mpWnd, 20, 150, 30, 60, L"B组", JudgeScene::onClickPage2);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
pContentBtn = new Button(mpWnd, 20, 210, 30, 60, L"C组", JudgeScene::onClickPage3);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
pContentBtn = new Button(mpWnd, 20, 270, 30, 60, L"D组", JudgeScene::onClickPage4);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
pContentBtn = new Button(mpWnd, 20, 330, 30, 60, L"决赛", JudgeScene::onClickPage0);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
pContentBtn = new Button(mpWnd, 20, 450, 30, 30, L"存储", JudgeScene::onClickSave);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
pContentBtn = new Button(mpWnd, 20, 480, 30, 30, L"读取", JudgeScene::onClickLoad);
mETContent.addTrigger(pContentBtn);
pSolidPnl->addControl(pContentBtn);
}
showPage(1);
}
void showPage(int page)
{
if((page >= 0) && (page < 5))
{
leader.mPage = page;
mDT.clearTriggerList();
mET.clearTriggerList();
if(leader.mPage == 0)
{
mDT.addTrigger(&mDTFinalGame);
mDT.addTrigger(&mDTContent);
mET.addTrigger(&mETFinalGame);
mET.addTrigger(&mETContent);
}
else
{
mDT.addTrigger(&mDTGroupGame);
mDT.addTrigger(&mDTContent);
mET.addTrigger(&mETGroupGame);
mET.addTrigger(&mETContent);
}
refresh();
}
}
static void onClickPage1(Button *pButton)
{
((JudgeScene*)leader.mpJudgeScn)->showPage(1);
}
static void onClickPage2(Button *pButton)
{
((JudgeScene*)leader.mpJudgeScn)->showPage(2);
}
static void onClickPage3(Button *pButton)
{
((JudgeScene*)leader.mpJudgeScn)->showPage(3);
}
static void onClickPage4(Button *pButton)
{
((JudgeScene*)leader.mpJudgeScn)->showPage(4);
}
static void onClickPage0(Button *pButton)
{
((JudgeScene*)leader.mpJudgeScn)->showPage(0);
}
static void onClickSave(Button *pButton)
{
int retVal = MessageBox(((Window*)leader.mpWnd)->gethWnd(),
L"存储比赛数据,确定吗?", L"提示", MB_OKCANCEL | MB_ICONWARNING);
if(retVal == IDOK)
{
((FinalJudge*)leader.mpJudge)->saveScores("scores.txt");
// backup
ifstream fin("scores.txt", ios::binary);
ofstream fout("scores.log", ios::binary | ios::app);
char ch;
fin.read(&ch, 1);
while(!fin.eof())
{
fout.write(&ch, 1);
fin.read(&ch, 1);
}
fin.close();
fout.close();
}
}
static void onClickLoad(Button *pButton)
{
int retVal = MessageBox(((Window*)leader.mpWnd)->gethWnd(),
L"读取比赛数据,确定吗?", L"提示", MB_OKCANCEL | MB_ICONWARNING);
if(retVal == IDOK)
((FinalJudge*)leader.mpJudge)->loadScores("scores.txt");
}
protected:
Trigger mDTGroupGame;
EventTrigger mETGroupGame;
Trigger mDTFinalGame;
EventTrigger mETFinalGame;
Trigger mDTContent;
EventTrigger mETContent;
};
/**
* for MainScene
*/
const int MAP1_ORGX = 50, MAP1_ORGY = 50;
const int MAP2_ORGX = 550, MAP2_ORGY = 50;
const int CELL_WIDTH = 50;
const DWORD HALF_ROUND_TIME = 500;
const wchar_t *ACTION1[] =
{
L"无",
L"前进",
L"快速前进",
L"后退",
L"左转",
L"右转"
};
const wchar_t *ACTION2[] =
{
L"无",
L"前进",
L"快速前进",
L"后退",
L"右转",
L"左转"
};
const wchar_t *DIRECTION1[] =
{
L"↑",
L"→",
L"↓",
L"←"
};
const wchar_t *DIRECTION2[] =
{
L"↑",
L"←",
L"↓",
L"→"
};
enum
{
SPRITE_STATE_RUNNING,
SPRITE_STATE_READY
};
class MarkControl: public virtual Control
{
public:
MarkControl(Window *pWnd):
Control(pWnd, false, false)
{
alert(mpWnd == NULL);
alert(mpWnd->gethWnd() == NULL);
mhMonsterBmp = (HBITMAP)LoadImage(NULL, L"monster.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
alert(mhMonsterBmp == NULL);
mhQueenBmp = (HBITMAP)LoadImage(NULL, L"queen.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
alert(mhQueenBmp == NULL);
mhMonsterDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
alert(mhMonsterDC == NULL);
mhQueenDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
alert(mhQueenDC == NULL);
mhMonsterBmpOld = (HBITMAP)SelectObject(mhMonsterDC, mhMonsterBmp);
mhQueenBmpOld = (HBITMAP)SelectObject(mhQueenDC, mhQueenBmp);
}
virtual ~MarkControl(void)
{
HBITMAP hMonsterBmp = (HBITMAP)SelectObject(mhMonsterDC, mhMonsterBmpOld);
alert(mhMonsterBmp != hMonsterBmp);
HBITMAP hQueenBmp = (HBITMAP)SelectObject(mhQueenDC, mhQueenBmpOld);
alert(mhQueenBmp != hQueenBmp);
DeleteObject(mhMonsterBmp);
DeleteObject(mhQueenBmp);
DeleteDC(mhMonsterDC);
DeleteDC(mhQueenDC);
}
void setMapInfo(bool map[8][4], int destX, int destY)
{
for(int y=0; y<8; y++)
{
for(int x=0; x<4; x++)
{
if(map[y][x])
mX[y] = x;
}
}
mX[destY] = destX;
mDestY = destY;
showAll();
}
void setQueenInfo(bool queen[8])
{
for(int i=0; i<8; i++)
{
if(queen[i])
mDestAlpha[i] = 255;
else
mDestAlpha[i] = 63;
}
}
void showAll(void)
{
for(int i=0; i<8; i++)
{
mDestAlpha[i] = 255;
mAlpha[i] = 256;
}
}
protected:
virtual int onDrawDetect(int &flagDraw)
{
const int ALPHA_STEP = 32;
for(int i=0; i<8; i++)
{
if(mAlpha[i] != mDestAlpha[i])
{
if(mAlpha[i] < mDestAlpha[i])
{
mAlpha[i] += ALPHA_STEP;
if(mAlpha[i] > mDestAlpha[i])
mAlpha[i] = mDestAlpha[i];
}
else if(mAlpha[i] > mDestAlpha[i])
{
mAlpha[i] -= ALPHA_STEP;
if(mAlpha[i] < mDestAlpha[i])
mAlpha[i] = mDestAlpha[i];
}
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
}
return 0;
}
virtual void reDraw(void)
{
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.AlphaFormat = 0;
for(int y=0; y<8; y++)
{
bf.SourceConstantAlpha = mAlpha[y];
AlphaBlend(mpPnl->gethMemDC(), MAP1_ORGX + mX[y]*CELL_WIDTH, MAP1_ORGY + y*CELL_WIDTH,
CELL_WIDTH, CELL_WIDTH, (y == mDestY) ? mhQueenDC : mhMonsterDC,
0, 0, CELL_WIDTH, CELL_WIDTH, bf);
AlphaBlend(mpPnl->gethMemDC(), MAP2_ORGX + (3 - mX[y])*CELL_WIDTH, MAP2_ORGY + y*CELL_WIDTH,
CELL_WIDTH, CELL_WIDTH, (y == mDestY) ? mhQueenDC : mhMonsterDC,
0, 0, CELL_WIDTH, CELL_WIDTH, bf);
}
}
virtual int onKBEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
return 0;
}
virtual int onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -