⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soccermonitor.cpp

📁 The application wizard has created this SoccerDoctor application for you. This application not onl
💻 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 + -