📄 main.cpp
字号:
protected:
HBITMAP mhMonsterBmp, mhQueenBmp;
HBITMAP mhMonsterBmpOld, mhQueenBmpOld;
HDC mhMonsterDC, mhQueenDC;
int mAlpha[8], mDestAlpha[8];
int mX[8], mDestY;
};
class SpriteControl: public virtual Control
{
public:
SpriteControl(Window *pWnd):
Control(pWnd, false, false),
mhSpriteBmp(NULL),
mhSpriteDC(NULL),
mState(SPRITE_STATE_READY)
{
alert(mpWnd == NULL);
alert(mpWnd->gethWnd() == NULL);
mhSpriteBmp = (HBITMAP)LoadImage(NULL, L"sprite.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
alert(mhSpriteBmp == NULL);
mhSpriteDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
alert(mhSpriteDC == NULL);
mhBmpOld = (HBITMAP)SelectObject(mhSpriteDC, mhSpriteBmp);
}
virtual ~SpriteControl(void)
{
HBITMAP hBmpOld = (HBITMAP)SelectObject(mhSpriteDC, mhBmpOld);
alert(mhSpriteBmp != hBmpOld);
DeleteObject(mhSpriteBmp);
DeleteDC(mhSpriteDC);
}
void reset(void)
{
mDestX1 = MAP1_ORGX + 3*CELL_WIDTH;
mDestY1 = MAP1_ORGY + 8*CELL_WIDTH;
mDestAngle1 = 0;
mDestX2 = MAP2_ORGX + 0*CELL_WIDTH;
mDestY2 = MAP2_ORGY + 8*CELL_WIDTH;
mDestAngle2 = 0;
mX1 = mDestX1;
mY1 = mDestY1;
mAngle1 = mDestAngle1;
mX2 = mDestX2;
mY2 = mDestY2;
mAngle2 = mDestAngle2;
mState = SPRITE_STATE_READY;
}
void setDest(int x1, int y1, int angle1, int action1,
int x2, int y2, int angle2, int action2)
{
mDestX1 = MAP1_ORGX + x1*CELL_WIDTH;
mDestY1 = MAP1_ORGY + y1*CELL_WIDTH;
mDestAngle1 = angle1*90;
mAction1 = action1;
mDestX2 = MAP2_ORGX + (3 - x2)*CELL_WIDTH;
mDestY2 = MAP2_ORGY + y2*CELL_WIDTH;
mDestAngle2 = (360 - angle2*90)%360;
mAction2 = action2;
mState = SPRITE_STATE_RUNNING;
}
int getState(void)
{
return mState;
}
protected:
virtual int onDrawDetect(int &flagDraw)
{
if(mState == SPRITE_STATE_READY)
return 0;
if((mX1 == mDestX1) && (mY1 == mDestY1) && (mAngle1 == mDestAngle1) &&
(mX2 == mDestX2) && (mY2 == mDestY2) && (mAngle2 == mDestAngle2))
{
mState = SPRITE_STATE_READY;
return 0;
}
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
int MOVE_STEP1 = (mAction1 == GO_FORWARD_FAST) ? 2 : 1;
int MOVE_STEP2 = (mAction2 == GO_FORWARD_FAST) ? 2 : 1;
const int ROTATE_STEP = 2;
int disAngle;
// role 1
if(abs(mX1 - mDestX1) < MOVE_STEP1)
mX1 = mDestX1;
if(abs(mY1 - mDestY1) < MOVE_STEP1)
mY1 = mDestY1;
if((360 + ROTATE_STEP + mAngle1 - mDestAngle1)%360 < 2*ROTATE_STEP)
mAngle1 = mDestAngle1;
if(mX1 < mDestX1)
mX1 += MOVE_STEP1;
else if(mX1 > mDestX1)
mX1 -= MOVE_STEP1;
if(mY1 < mDestY1)
mY1 += MOVE_STEP1;
else if(mY1 > mDestY1)
mY1 -= MOVE_STEP1;
disAngle = (360 + mDestAngle1 - mAngle1)%360;
if(disAngle > 180)
disAngle -= 360;
if(disAngle > 0)
mAngle1 = (mAngle1 + ROTATE_STEP)%360;
else if(disAngle < 0)
mAngle1 = (360 + mAngle1 - ROTATE_STEP)%360;
// role 2
if(abs(mX2 - mDestX2) < MOVE_STEP2)
mX2 = mDestX2;
if(abs(mY2 - mDestY2) < MOVE_STEP2)
mY2 = mDestY2;
if((360 + ROTATE_STEP + mAngle2 - mDestAngle2)%360 < 2*ROTATE_STEP)
mAngle2 = mDestAngle2;
if(mX2 < mDestX2)
mX2 += MOVE_STEP2;
else if(mX2 > mDestX2)
mX2 -= MOVE_STEP2;
if(mY2 < mDestY2)
mY2 += MOVE_STEP2;
else if(mY2 > mDestY2)
mY2 -= MOVE_STEP2;
disAngle = (360 + mDestAngle2 - mAngle2)%360;
if(disAngle > 180)
disAngle -= 360;
if(disAngle > 0)
mAngle2 = (mAngle2 + ROTATE_STEP)%360;
else if(disAngle < 0)
mAngle2 = (360 + mAngle2 - ROTATE_STEP)%360;
return 0;
}
virtual void reDraw(void)
{
TransparentBlt(mpPnl->gethMemDC(), mX1, mY1, CELL_WIDTH, CELL_WIDTH,
mhSpriteDC, (mAngle1 + 5)%360/10*CELL_WIDTH, 0, CELL_WIDTH, CELL_WIDTH, 0x000000);
TransparentBlt(mpPnl->gethMemDC(), mX2, mY2, CELL_WIDTH, CELL_WIDTH,
mhSpriteDC, (mAngle2 + 5)%360/10*CELL_WIDTH, 0, CELL_WIDTH, CELL_WIDTH, 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:
HBITMAP mhSpriteBmp, mhBmpOld;
HDC mhSpriteDC;
int mState;
int mX1, mY1, mAngle1;
int mX2, mY2, mAngle2;
int mDestX1, mDestY1, mDestAngle1;
int mDestX2, mDestY2, mDestAngle2;
int mAction1, mAction2;
};
class CoreControl: public virtual Control
{
public:
CoreControl(Window *pWnd):
Control(pWnd),
mTicks(0),
mSwitched(false),
mPlayer1(0), mPlayer2(0),
mScore1(0), mScore2(0)
{
}
virtual ~CoreControl(void)
{
}
void initGame(void)
{
FinalCore *pCore = (FinalCore*)leader.mpCore;
pCore->setMap(leader.mMapIndex, leader.mMapBlank);
pCore->initRoles(leader.mFileName1, leader.mFileName2);
bool map[8][4];
unsigned char index, destX, destY;
wchar_t message[MAX_MESSAGE_LEN];
pCore->getMapInfo(map, index, destX, destY);
((MarkControl*)leader.mpMarkCtl)->setMapInfo(map, destX, destY);
((SpriteControl*)leader.mpSpriteCtl)->reset();
snwprintf(message, MAX_MESSAGE_LEN,
L"\n"
L"\n"
L" 地图编号:%4d\n",
leader.mMapIndex
);
((MessagePanel*)leader.mpMessagePnl)->setMessage(message);
((TransparentImagePanel*)leader.mpTriggerDraw)->pause();
((TransparentImagePanel*)leader.mpTrigger1Win)->pause();
((TransparentImagePanel*)leader.mpTrigger2Win)->pause();
mTicks = 0;
}
void startGame(void)
{
if(((FinalCore*)leader.mpCore)->startGame() < 0)
return;
mTicks = GetTickCount();
mSwitched = false;
}
protected:
virtual int onDrawDetect(int &flagDraw)
{
if(
(mPlayer1 != leader.mPlayer1) ||
(mPlayer2 != leader.mPlayer2) ||
(mScore1 != leader.mScore1) ||
(mScore2 != leader.mScore2))
{
mPlayer1 = leader.mPlayer1;
mPlayer2 = leader.mPlayer2;
mScore1 = leader.mScore1;
mScore2 = leader.mScore2;
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
// core behaviour
if(mTicks == 0)
return 0;
FinalCore *pCore = (FinalCore*)leader.mpCore;
if((!mSwitched) && (GetTickCount() - mTicks > HALF_ROUND_TIME))
{
pCore->switchRole();
mTicks = GetTickCount();
mSwitched = true;
}
if(mSwitched && (GetTickCount() - mTicks > HALF_ROUND_TIME) &&
(((SpriteControl*)leader.mpSpriteCtl)->getState() == SPRITE_STATE_READY))
{
mTicks = GetTickCount();
mSwitched = false;
bool queen[8];
pCore->getQueenInfo(queen);
((MarkControl*)leader.mpMarkCtl)->setQueenInfo(queen);
unsigned long round;
unsigned char action1, action2;
unsigned char x1, y1, x2, y2;
unsigned char direction1, direction2;
unsigned char retVal = pCore->nextRound(round,
action1, x1, y1, direction1, action2, x2, y2, direction2);
((SpriteControl*)leader.mpSpriteCtl)->setDest(x1, y1, direction1, action1,
x2, y2, direction2, action2);
wchar_t message[MAX_MESSAGE_LEN];
snwprintf(message, MAX_MESSAGE_LEN,
L"\n"
L"\n"
L" 地图编号:%4d\n"
L"\n"
L" 当前回合:%4d\n"
L"\n"
L"\n"
L" 左侧:\n"
L"\n"
L" 当前决策:%s\n"
L" 当前坐标:(%d, %d)\n"
L" 当前方向:%s\n"
L"\n"
L"\n"
L" 右侧:\n"
L"\n"
L" 当前决策:%s\n"
L" 当前坐标:(%d, %d)\n"
L" 当前方向:%s\n",
leader.mMapIndex, round,
ACTION1[action1], x1, y1, DIRECTION1[direction1],
ACTION2[action2], x2, y2, DIRECTION2[direction2]
);
((MessagePanel*)leader.mpMessagePnl)->setMessage(message);
switch(retVal)
{
case CORE_STATE_DRAW:
((TransparentImagePanel*)leader.mpTriggerDraw)->resume();
mTicks = 0;
break;
case CORE_STATE_1_WIN:
((TransparentImagePanel*)leader.mpTrigger1Win)->resume();
mTicks = 0;
leader.mScore1++;
break;
case CORE_STATE_2_WIN:
((TransparentImagePanel*)leader.mpTrigger2Win)->resume();
mTicks = 0;
leader.mScore2++;
break;
}
}
return 0;
}
virtual void reDraw(void)
{
if((mPlayer1 > 0) && (mPlayer1 <= 12))
{
BitBlt(mpPnl->gethMemDC(), 200, 25, LOGO_WIDTH, LOGO_HEIGHT,
leader.mhLogoDC[mPlayer1 - 1], 0, 0, SRCCOPY);
}
else
{
RECT rect = {
200, 25, 200 + LOGO_WIDTH, 25 + LOGO_HEIGHT};
HBRUSH hBr = CreateSolidBrush(0x000000);
FillRect(mpPnl->gethMemDC(), &rect, hBr);
DeleteObject(hBr);
}
if((mPlayer2 > 0) && (mPlayer2 <= 12))
{
BitBlt(mpPnl->gethMemDC(), 500, 25, LOGO_WIDTH, LOGO_HEIGHT,
leader.mhLogoDC[mPlayer2 - 1], 0, 0, SRCCOPY);
}
else
{
RECT rect = {
500, 25, 500 + LOGO_WIDTH, 25 + LOGO_HEIGHT};
HBRUSH hBr = CreateSolidBrush(0x000000);
FillRect(mpPnl->gethMemDC(), &rect, hBr);
DeleteObject(hBr);
}
TransparentBlt(mpPnl->gethMemDC(), 87, 25, 25, 50,
leader.mhNumbersDC, mScore1*25, 0, 25, 50, 0x000000);
TransparentBlt(mpPnl->gethMemDC(), 687, 25, 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:
DWORD mTicks;
bool mSwitched;
int mPlayer1, mPlayer2;
int mScore1, mScore2;
};
class MainScene: public virtual Scene
{
public:
MainScene(Window *pWnd):
Scene(pWnd)
{
srand(GetTickCount());
}
virtual ~MainScene(void)
{
}
protected:
virtual void onInit(void)
{
// bottomBar
ImagePanel *pImagePnl = new ImagePanel(mpWnd, 0, 500, 800, 100, L"bottomBar.bmp");
mDT.addTrigger(pImagePnl);
// the game controller
CoreControl *pCoreCtl = new CoreControl(mpWnd);
leader.mpCoreCtl = (void*)pCoreCtl;
mET.addTrigger(pCoreCtl);
pImagePnl->addControl(pCoreCtl);
// backgrounds
pImagePnl = new ImagePanel(mpWnd, 0, 0, 800, 500, L"map.bmp");
mDT.addTrigger(pImagePnl);
// monsters, queens and sprites
MarkControl *pMarkCtl = new MarkControl(mpWnd);
leader.mpMarkCtl = (void*)pMarkCtl;
mET.addTrigger(pMarkCtl);
pImagePnl->addControl(pMarkCtl);
SpriteControl *pSpriteCtl = new SpriteControl(mpWnd);
leader.mpSpriteCtl = (void*)pSpriteCtl;
mET.addTrigger(pSpriteCtl);
pImagePnl->addControl(pSpriteCtl);
// control panels
SolidPanel *pSolidPnl = new SolidPanel(mpWnd, 300, 0, 200, 500);
mDT.addTrigger(pSolidPnl);
MessagePanel *pMessagePnl = new MessagePanel(mpWnd, 320, 20, 160, 310);
leader.mpMessagePnl = (void*)pMessagePnl;
mDT.addTrigger(pMessagePnl);
Button *pBtn = new Button(mpWnd, 60, 360, 80, 30,
L"开始比赛", MainScene::onClickStartGame);
mET.addTrigger(pBtn);
pSolidPnl->addControl(pBtn);
pBtn = new Button(mpWnd, 60, 400, 80, 30,
L"记录成绩", MainScene::onSave);
mET.addTrigger(pBtn);
pSolidPnl->addControl(pBtn);
pBtn = new Button(mpWnd, 60, 440, 80, 30,
L"直接返回", MainScene::onCancel);
mET.addTrigger(pBtn);
pSolidPnl->addControl(pBtn);
// result panels
TransparentImagePanel *pTIPnl = new TransparentImagePanel(mpWnd,
200, 100, 400, 200, L"draw.bmp");
leader.mpTriggerDraw = (void*)pTIPnl;
mDT.addTrigger(pTIPnl);
pTIPnl = new TransparentImagePanel(mpWnd,
50, 100, 700, 200, L"1_win.bmp");
leader.mpTrigger1Win = (void*)pTIPnl;
mDT.addTrigger(pTIPnl);
pTIPnl = new TransparentImagePanel(mpWnd,
50, 100, 700, 200, L"2_win.bmp");
leader.mpTrigger2Win = (void*)pTIPnl;
mDT.addTrigger(pTIPnl);
}
static void onClickStartGame(Button *pButton)
{
if(leader.mMapIndexs.size() == 46)
leader.mMapIndexs.clear();
int mapIndex = rand()%46;
while(leader.mMapIndexs.find(mapIndex) != leader.mMapIndexs.end())
mapIndex = (mapIndex + 1)%46;
leader.mMapIndexs.insert(mapIndex);
leader.mMapIndex = mapIndex;
leader.mMapBlank = rand()%8;
((CoreControl*)leader.mpCoreCtl)->initGame();
((CoreControl*)leader.mpCoreCtl)->startGame();
}
static void onSave(Button *pButton)
{
((FinalJudge*)leader.mpJudge)->setScore(
leader.mGameIndex, leader.mScore1, leader.mScore2);
((JudgeScene*)leader.mpJudgeScn)->attachToWindow();
}
static void onCancel(Button *pButton)
{
((JudgeScene*)leader.mpJudgeScn)->attachToWindow();
}
};
int LogoControl::onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
if(mGameIndex < 0)
return 0;
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if(mpPnl != NULL)
mpPnl->WindowToPanel(x, y);
bool inArea = (x > mX) && (x < mX + LOGO_WIDTH - 1) && (y > mY) && (y < mY + LOGO_HEIGHT - 1);
if(inArea && (uMsg == WM_LBUTTONDOWN))
{
int gameIndex = mGameIndex;
if(gameIndex < 4)
gameIndex = (leader.mPage - 1)*3 + gameIndex;
FinalJudge *pJudge = (FinalJudge*)leader.mpJudge;
leader.mGameIndex = gameIndex;
leader.mMapIndexs.clear();
pJudge->getPlayer(gameIndex, leader.mPlayer1, leader.mPlayer2);
if((leader.mPlayer1 == 0) || (leader.mPlayer2 == 0))
return 0;
leader.mScore1 = 0;
leader.mScore2 = 0;
snwprintf(leader.mFileName1, MAX_MESSAGE_LEN,
L"Strategy%d/Strategy.exe", leader.mPlayer1);
snwprintf(leader.mFileName2, MAX_MESSAGE_LEN,
L"Strategy%d/Strategy.exe", leader.mPlayer2);
((CoreControl*)leader.mpCoreCtl)->initGame();
((MainScene*)leader.mpMainScn)->attachToWindow();
return -1;
}
return 0;
}
/**
* main
*/
int main(int argc, char *argv[])
{
//FinalCore core;
FinalCore core;
leader.mpCore = (void*)&core;
FinalJudge judge("config.txt");
leader.mpJudge = (void*)&judge;
Window wnd;
leader.mpWnd = (void*)&wnd;
alert(wnd.create(NULL, NULL, L"第5届新生C语言大赛决赛平台") != 0);
alert(wnd.show(800, 600) != 0);
JudgeScene judgeScn(&wnd);
leader.mpJudgeScn = (void*)&judgeScn;
MainScene mainScn(&wnd);
leader.mpMainScn = (void*)&mainScn;
judgeScn.init();
mainScn.init();
judgeScn.attachToWindow();
alert(wnd.run() != 0);
return EXIT_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -