www.pudn.com > 图形界面聊天软件.rar > UserInfo.cpp


// UserInfo.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "pictalk.h" 
#include "UserInfo.h" 
#include "pictalkDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CUserInfo 
 
CUserInfo::CUserInfo(CWnd *pWnd) 
{ 
	m_pWnd=pWnd; 
	m_Name=""; 
	m_pic=1; 
	m_ID=0; 
	m_state=1; 
	m_x=12; 
	m_y=12; 
	m_bSit=FALSE; 
	m_MsgCount=0; 
	m_Place=CRect(0,0,54,78); 
	m_bTurn=FALSE; 
	m_PicNum=0; 
	m_Visit=0; 
} 
 
CUserInfo::~CUserInfo() 
{ 
	m_pPW->draw(&m_Place,&m_Place); 
} 
 
 
BEGIN_MESSAGE_MAP(CUserInfo, CWnd) 
	//{{AFX_MSG_MAP(CUserInfo) 
	ON_WM_TIMER() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CUserInfo message handlers 
 
void CUserInfo::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	switch(nIDEvent) 
	{ 
	case(1)://judge 
		DoSet(); 
		m_iAniSeq--; 
		break; 
	case(2)://walk 
		DoWalk(); 
		break; 
	case(3)://idle 
		DoSay(); 
		break; 
	case(4)://run 
		DoSingleCom(); 
		break; 
/*	case(5): 
		DoHide(); 
		break; 
	case(6): 
		DoShow(); 
		break; 
	case(7): 
		DoWaitShow(); 
		break;*/ 
	default: 
		break; 
	} 
	m_iAniSeq++; 
	CWnd::OnTimer(nIDEvent); 
} 
 
void CUserInfo::ShowUser() 
{ 
	CreateEx(	0, 
		AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)), 
						"", 
						WS_CHILD | WS_TABSTOP, 
						CRect(0,0,1,1), 
						m_pWnd, 
						NULL, 
						NULL ); 
	m_Place+=CPoint(PX(m_x,m_y),PY(m_x,m_y)); 
	SetTimer(1,300,NULL); 
	m_bSet=FALSE; 
} 
 
void CUserInfo::DoSet() 
{ 
	CRect oldRect; 
	if(m_ComArray.GetSize()==0) 
	{	 
		if(m_bSet) 
			return; 
		m_bSet=TRUE; 
		switch(m_state) 
		{ 
		case(1): 
			if(m_bSit) 
				m_PicNum=26; 
			else 
				m_PicNum=0; 
			m_bTurn=FALSE; 
			break; 
		case(4): 
			m_bTurn=TRUE; 
			if(m_bSit) 
				m_PicNum=26; 
			else 
				m_PicNum=0; 
			break; 
		case(2): 
			m_bTurn=FALSE; 
			if(m_bSit) 
				m_PicNum=27; 
			else 
				m_PicNum=9; 
			break; 
		case(3): 
			m_bTurn=TRUE; 
			if(m_bSit) 
				m_PicNum=27; 
			else 
				m_PicNum=9; 
			break; 
		 
		} 
		oldRect=m_Place; 
		m_Place=CRect(CPoint(PX(m_x,m_y),PY(m_x,m_y)),CSize(54,78)); 
		m_pPW->draw(&m_Place,&oldRect); 
		return; 
	} 
	KillTimer(1); 
	 
	mcom &Msgcom=m_ComArray[0]; 
	m_x=Msgcom.m_x; 
	m_y=Msgcom.m_y; 
	m_state=Msgcom.m_state; 
	m_bSit=Msgcom.m_bSit; 
	oldRect=m_Place; 
	m_Place=CRect(CPoint(PX(m_x,m_y),PY(m_x,m_y)),CSize(54,78)); 
	m_pPW->draw(&m_Place,&oldRect); 
	 
	switch(Msgcom.m_ComID) 
	{ 
		case(11)://move 
			SetTimer(2,1,NULL); 
			m_iAniSeq=0; 
			m_bSet=FALSE; 
			break; 
		case(13)://turn 
			if(m_MsgCount) 
				m_MsgCount--; 
			m_bSet=FALSE; 
			SetTimer(1,10,NULL); 
			break; 
		case(12)://say 
			m_iAniSeq=0; 
			m_sen=Msgcom.m_Sen; 
			SetTimer(3,300,NULL); 
			break; 
		case(14)://smile 
			m_iAniSeq=0; 
			m_SingleBMP=12; 
			SetTimer(4,300,NULL); 
			break; 
		case(15)://angry 
			m_iAniSeq=0; 
			m_SingleBMP=14; 
			SetTimer(4,300,NULL); 
			break; 
		case(17)://cry 
			m_iAniSeq=0; 
			m_SingleBMP=18; 
			SetTimer(4,300,NULL); 
			break; 
		case(19)://挥手 
			m_iAniSeq=0; 
			m_SingleBMP=16; 
			SetTimer(4,300,NULL); 
			break; 
		case(16): 
			if(m_MsgCount) 
				m_MsgCount=0; 
			m_bSet=FALSE; 
			m_bSit=TRUE; 
			SetTimer(1,10,NULL); 
			break; 
		case(18): 
			if(m_MsgCount) 
				m_MsgCount=0; 
			m_bSet=FALSE; 
			m_bSit=FALSE; 
			SetTimer(1,10,NULL); 
			break; 
	} 
	m_ComArray.RemoveAt(0); 
} 
 
void CUserInfo::DoWalk() 
{ 
	CPoint offset; 
	CRect oldPlace=m_Place; 
	KillTimer(2); 
	SetTimer(2,150,NULL); 
	if(m_iAniSeq>=9) 
	{ 
		switch(m_state) 
		{ 
		case(1): 
			m_x--;break; 
		case(2): 
			m_x++;break; 
		case(3): 
			m_y--;break; 
		case(4): 
			m_y++;break; 
		} 
		KillTimer(2); 
		if(m_MsgCount) 
			m_MsgCount=0; 
		SetTimer(1,30,NULL); 
		m_iAniSeq--; 
		 
		return; 
	} 
	if(m_iAniSeq<=0) 
		if(m_PicNum==1 || m_PicNum==8) 
			m_iAniSeq++; 
	switch(m_state) 
	{ 
	case (1): 
		offset=CPoint(-4,2); 
		m_bTurn=FALSE; 
		m_PicNum=(m_iAniSeq%4)+1; 
		break; 
	case (2): 
		offset=CPoint(4,-2); 
		m_bTurn=FALSE; 
		m_PicNum=8-(m_iAniSeq%4); 
		break; 
	case (3): 
		offset=CPoint(-4,-2); 
		m_bTurn=TRUE; 
		m_PicNum=8-(m_iAniSeq%4); 
		break; 
	case (4): 
		offset=CPoint(4,2); 
		m_bTurn=TRUE; 
		m_PicNum=(m_iAniSeq%4)+1; 
		break; 
	} 
	if(m_iAniSeq!=0) 
		m_Place+=offset; 
	m_pPW->draw(&m_Place,&oldPlace); 
} 
 
void CUserInfo::DoSingleCom() 
{ 
	if(m_iAniSeq>=8) 
	{ 
		KillTimer(4); 
		if(m_MsgCount) 
			m_MsgCount=0; 
		SetTimer(1,100,NULL); 
		m_bSet=FALSE; 
	} 
	m_PicNum=m_iAniSeq%2+m_SingleBMP; 
	switch(m_state) 
	{ 
	case (1): 
		m_bTurn=FALSE; 
		break; 
	case (2): 
		m_bTurn=TRUE; 
		break; 
	case (3): 
		m_bTurn=FALSE; 
		break; 
	case (4): 
		m_bTurn=TRUE; 
		break; 
	} 
	m_pPW->draw(&m_Place,&m_Place); 
} 
 
void CUserInfo::DoSay() 
{ 
	if(m_iAniSeq>=8) 
	{ 
		KillTimer(3); 
		if(m_MsgCount) 
			m_MsgCount=0; 
		SetTimer(1,100,NULL); 
		m_bSet=FALSE; 
		m_pPW->m_SenList.RemoveAt(m_SenPos); 
		m_pPW->draw(&m_SenPlace,&m_SenPlace); 
	} 
	if(m_iAniSeq<=0) 
	{ 
		m_SenPos=m_pPW->AddSentence(this); 
		CString str; 
		str=m_Name+":"+m_sen; 
		((CPictalkDlg *)m_pWnd)->AddSenten(str); 
	} 
	switch(m_state) 
	{ 
	case (1): 
		m_bTurn=FALSE; 
		if(m_bSit) 
			m_PicNum=m_iAniSeq%2+28; 
		else 
			m_PicNum=m_iAniSeq%2+10; 
		break; 
	case (2): 
		m_bTurn=FALSE; 
		if(m_bSit) 
			m_PicNum=m_iAniSeq%2+30; 
		else 
			m_PicNum=24+(m_iAniSeq%2); 
		break; 
	case (3): 
		m_bTurn=TRUE; 
		if(m_bSit) 
			m_PicNum=m_iAniSeq%2+30; 
		else 
			m_PicNum=24+(m_iAniSeq%2); 
		break; 
	case (4): 
		m_bTurn=TRUE; 
		if(m_bSit) 
			m_PicNum=m_iAniSeq%2+28; 
		else 
			m_PicNum=m_iAniSeq%2+10; 
		break; 
	} 
	m_pPW->draw(&m_Place,&m_Place); 
} 
 
HRGN CUserInfo::GetRgn() 
{ 
	return m_pPW->GetRgn(this); 
} 
 
BOOL CUserInfo::Check(UINT num) 
{ 
//	m_Visit=0; 
	BOOL res; 
	int i; 
	if(m_MapMsg.Lookup(num,res)) 
		return FALSE; 
	m_MapMsg[num]=TRUE; 
	for(i=1;i<11;i++) 
		m_MapMsg.RemoveKey((num+i)%30); 
	return TRUE; 
} 
 
void CUserInfo::MsgCreate(mpack &Msgpack) 
{ 
	Msgpack.m_ID=m_ID; 
	Msgpack.m_state=m_state; 
	Msgpack.m_x=m_x; 
	Msgpack.m_y=m_y; 
	Msgpack.m_Name=m_Name; 
	Msgpack.m_bSit=m_bSit; 
	Msgpack.m_pic=m_pic; 
	Msgpack.m_IP=m_IP; 
	Msgpack.m_Name=m_Name; 
	Msgpack.m_nAge=m_nAge; 
	Msgpack.m_Sex=m_Sex; 
	Msgpack.m_ICQ=m_ICQ; 
	Msgpack.m_Job=m_Job; 
	Msgpack.m_Address=m_Address; 
	Msgpack.m_nPort=m_nPort; 
}