📄 soccermonitor.cpp
字号:
#include "StdAfx.h"
#include "SoccerMonitor.h"
#include "SocketDialog.h"
#include "defines.h"
#include "MainFrm.h" // CMainFrame
/*******************************************************************************/
/* CSocketThread */
/*******************************************************************************/
CSocketThread::CSocketThread(CSoccerMonitor* pMonitor,CString strHost,UINT nPort)
: _pMonitor(pMonitor),_bAlive(true)
{
m_bAutoDelete = false;
_bValid = _Socket.Create(strHost,nPort);
}
CSocketThread::~CSocketThread()
{
end();
_Socket.Delete();
}
int CSocketThread::Run()
{
dispinfo_t2 info;
while( _bAlive && _bValid ){
if( _Socket.RecvFrom((char*)&info,sizeof(info)) > 0 ){
if( _bAlive){
_pMonitor->addDispInfo(&info);
}
}else {
if( !_Socket.Valid() ){
break; // 对方已经断开
}
}
}
_Socket.Delete();
_pMonitor->doCommand(CmdSetdisconnected);
return 0;
}
BOOL CSocketThread::InitInstance()
{
// TODO: Add your specialized code here and/or call the base class
return TRUE; // CWinThread::InitInstance();
}
void CSocketThread::end()
{
if( _bAlive) {
::TerminateThread(m_hThread,0);
_bAlive = false;
}
}
/*******************************************************************************/
/* CSoccerMonitor */
/*******************************************************************************/
CSoccerMonitor::CSoccerMonitor(void)
: _bConnected(false),_bConnectedOnce(false)
, _pSocketThread(NULL)
{
}
CSoccerMonitor::~CSoccerMonitor(void)
{
doDisconnect(true); // 负责任的monitor在临退出前要告诉server一声
}
bool CSoccerMonitor::doCommand(MonitorCommand cmd)
{
switch( cmd ) {
case CmdConnect:
return doConnect();
case CmdReconnect:
return doReconnect();
case CmdDisconnect:
return doDisconnect();
case CmdKickoff:
return doKickOff();
case CmdSetdisconnected:
_bConnected = false;
return true;
default:
break;
};
return true;
}
bool CSoccerMonitor::doCommand(MonitorCommand cmd,CPoint p)
{
switch( cmd ) {
case CmdDropball:
return doDropBall(p);
case CmdFoulleft:
return doFoulLeft(p);
case CmdFoulright:
return doFoulRight(p);
default:
break;
};
return true;
}
bool CSoccerMonitor::doCommand(MonitorCommand cmd,int side,UINT num)
{
switch( cmd ) {
case CmdDiscard:
return doDiscard(side,num);
default:
break;
};
return false;
}
bool CSoccerMonitor::doCommand(MonitorCommand cmd,int side,UINT num,CPoint p)
{
switch( cmd ) {
case CmdMoveplayer:
return doMovePlayer(side,num,p);
default:
break;
};
return true;
}
bool CSoccerMonitor::doConnect()
{
CSocketDialog dlg;
if( dlg.DoModal()==IDOK ) {
_ServerHost = dlg.getServerHost();
_ServerPort = dlg.getServerPort();
startSocket();
}
return false;
}
bool CSoccerMonitor::doReconnect()
{
if( _bConnectedOnce ) {// 已经连过一次且成功了,不用再输入服务器地址和端口号了
if( MessageBox(NULL,"Reconnect to server?","Reconnect",MB_YESNO) == IDYES ){
return startSocket();
}
return false;
}
return doConnect();
}
bool CSoccerMonitor::doKickOff()
{
send_msg("(dispstart)");
return false;
}
bool CSoccerMonitor::doFoulLeft(CPoint p)
{
return doFoul(p,LEFT); // 左边犯规,右边开任意球
}
bool CSoccerMonitor::doFoulRight(CPoint p)
{
return doFoul(p,RIGHT); // 右边犯规,左边开任意球
}
bool CSoccerMonitor::startSocket()
{
/* 如果已经有连接,断了先 */
doDisconnect();
_pMainFrame->cleanAllInfo(); // 清除原有的信息
_pMainFrame->showLogplay(false); // 让displayer显示monitor信息
_pSocketThread = new CSocketThread(this,_ServerHost,_ServerPort);
if( _pSocketThread && _pSocketThread->Valid() ){
_pSocketThread->start(); // 线程开始
send_msg("(dispinit version 2)");
}
return false;
}
bool CSoccerMonitor::getCommandStatus(MonitorCommand cmd)
{
switch( cmd ) {
case CmdConnect:
case CmdReconnect:
return !_bConnected;
case CmdDisconnect:
case CmdKickoff:
case CmdDropball:
case CmdFoulleft:
case CmdFoulright:
case CmdDiscard:
case CmdMoveplayer:
return _bConnected;
default:
break;
};
return false;
}
bool CSoccerMonitor::doDisconnect(bool bDestructing)
{
if( _pSocketThread && _pSocketThread->Valid() ) { // 退出
if( _bConnected ) {
send_msg("(dispbye)");
}
delete _pSocketThread;
_pSocketThread = NULL;
_bConnected = false;
}
if( !bDestructing ){ // 如果是析沟函数调用disconnect,就不要告诉MainFrame了
_pMainFrame->showLogplay(true); // 让displayer显示logplayer信息
}
return false;
}
void CSoccerMonitor::addDispInfo(const dispinfo_t2* pInfo)
{
_bConnected = true;
_bConnectedOnce = true;
_pMainFrame->addDispInfo(pInfo);
}
bool CSoccerMonitor::doFoul(CPoint p,int side)
{
char msg[128];
sprintf(msg,"(dispfoul %d %d %d)",p.x,p.y,side);
send_msg(msg);
return false;
}
bool CSoccerMonitor::doDropBall(CPoint p)
{
return doFoul(p,NEUTRAL);
}
bool CSoccerMonitor::doDiscard(int side,UINT num)
{
/* 先检查是否超出范围,防止给server造成伤害 */
if( (side == LEFT || side == RIGHT) && num > 0 && num <= MAX_PLAYER ) {
char msg[128];
sprintf(msg,"(dispdiscard %d %d)",side,num);
send_msg(msg);
}
return false;
}
bool CSoccerMonitor::doMovePlayer(int side,UINT num,CPoint p)
{
/* 先检查是否超出范围,防止给server造成伤害 */
if( (side == LEFT || side == RIGHT) && num > 0 && num <= MAX_PLAYER ) {
char msg[128];
sprintf(msg,"(dispplayer %d %d %d %d 0)",side,num,p.x,p.y);
send_msg(msg);
}
return false;
}
void CSoccerMonitor::send_msg(char* msg)
{
if( _pSocketThread && _pSocketThread->Valid() ){
_pSocketThread->SendTo(msg,strlen(msg));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -