1 #include "../../common/Environment.h"
2 #include "CServerModel.h"
6 ////////////////////////////////////////////////////////////////////////////////
8 ////////////////////////////////////////////////////////////////////////////////
9 CServerModel::CServerModel()
13 ////////////////////////////////////////////////////////////////////////////////
15 ////////////////////////////////////////////////////////////////////////////////
16 CServerModel::~CServerModel()
18 for(size_t i = 0; i < m_Connections.size(); i++){
19 delete m_Connections[i].m_pConnection;
21 for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
26 ////////////////////////////////////////////////////////////////////////////////
28 ////////////////////////////////////////////////////////////////////////////////
29 bool CServerModel::initialize()
31 m_ServerSocket.initialize();
32 m_ServerSocket.openPort();
34 m_Connections.resize(MAX_CONNECTION_NUMBER);
35 for(size_t i = 0; i < m_Connections.size(); i++){
37 temp.m_pConnection = new CServerConnection();
38 temp.m_pConnection->initialize();
39 m_ServerSocket.accept(temp.m_pConnection);
40 temp.m_pAvatarInformation = NULL;
41 m_Connections[i] = temp;
46 ////////////////////////////////////////////////////////////////////////////////
48 ////////////////////////////////////////////////////////////////////////////////
49 bool CServerModel::process()
51 //
\92Ê
\90M
\83N
\83\89\83X
\82©
\82ç
\83f
\81[
\83^
\8eæ
\93¾
52 for(ConnectionVector::iterator p = m_Connections.begin(); p != m_Connections.end(); p++){
53 CommunicationData* a_pData;
54 if(p->m_pConnection->receive(&a_pData)){
55 //
\83\8d\83O
\83C
\83\93\8f\88\97\9d\81i
\83Z
\83b
\83V
\83\87\83\93\82Æ
\83\8d\83O
\83C
\83\93\83l
\81[
\83\80\82Æ
\81i
\83p
\83X
\83\8f\81[
\83h
\81j
\82ð
\93n
\82·
\81j
56 if(a_pData->m_DataType == 'i'){
57 if(login(p, a_pData->m_Data.m_LoginData.m_Name)){
58 std::cout << "login " << a_pData->m_Data.m_LoginData.m_Name << std::endl;
61 //
\83\8d\83O
\83A
\83E
\83g
\8f\88\97\9d
62 else if(a_pData->m_DataType == 'o'){
63 logout(p, p->m_pAvatarInformation->m_Name);
66 else if(a_pData->m_DataType == 'p'){
69 //
\83A
\83N
\83V
\83\87\83\93\83R
\83}
\83\93\83h
\82ð
\8f\88\97\9d
70 else if(a_pData->m_DataType == 'a'){
71 requestMove(p, a_pData->m_Data.m_ActionCommand.m_CommandType);
76 //
\89¹
\90º
\82ð
\8d\87\90¬
78 //
\8eæ
\93¾
\83R
\83}
\83\93\83h
\82É
\91Î
\82µ
\82Ä
\83f
\81[
\83^
\91\97\90M
82 ////////////////////////////////////////////////////////////////////////////////
84 ////////////////////////////////////////////////////////////////////////////////
85 bool CServerModel::login(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName)
87 AvatarInformation* temp = new AvatarInformation;
88 strcpy(temp->m_Name, in_pLoginName);
89 temp->m_Position[0] = 0;
90 temp->m_Position[1] = 0;
91 temp->m_Position[2] = 0;
92 temp->m_Direction[0] = 1;
93 temp->m_Direction[1] = 0;
94 temp->m_Direction[2] = 0;
96 m_AvatarInformations.push_back(temp);
98 CommunicationData a_SendData;
99 a_SendData.m_DataType = 'i';
100 strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
101 io_ConnectionIterator->m_pConnection->send(&a_SendData);
102 io_ConnectionIterator->m_pAvatarInformation = temp;
106 ////////////////////////////////////////////////////////////////////////////////
108 ////////////////////////////////////////////////////////////////////////////////
109 bool CServerModel::logout(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName)
111 //
\96¢
\83\8d\83O
\83C
\83\93
112 if(io_ConnectionIterator->m_pAvatarInformation == NULL){
116 CommunicationData a_SendData;
117 a_SendData.m_DataType = 'o';
118 strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
119 io_ConnectionIterator->m_pConnection->send(&a_SendData);
121 std::cout << "logout " << io_ConnectionIterator->m_pAvatarInformation->m_Name << std::endl;
123 //
\83A
\83o
\83^
\81[
\82ð
\8dí
\8f\9c\82·
\82é
124 for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
125 if(*p == io_ConnectionIterator->m_pAvatarInformation){
128 m_AvatarInformations.erase(p);
131 io_ConnectionIterator->m_pAvatarInformation = NULL;
135 ////////////////////////////////////////////////////////////////////////////////
137 ////////////////////////////////////////////////////////////////////////////////
138 bool CServerModel::requestPosition(ConnectionVector::iterator io_ConnectionIterator)
140 //
\96¢
\83\8d\83O
\83C
\83\93
141 if(io_ConnectionIterator->m_pAvatarInformation == NULL){
145 if(!m_AvatarInformations.empty()){
146 for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
147 CommunicationData a_SendData;
148 a_SendData.m_DataType = 'p';
149 strcpy(a_SendData.m_Data.m_AvatarData.m_Name, (*p)->m_Name);
150 a_SendData.m_Data.m_AvatarData.m_Position[0] = (*p)->m_Position[0];
151 a_SendData.m_Data.m_AvatarData.m_Position[1] = (*p)->m_Position[1];
152 a_SendData.m_Data.m_AvatarData.m_Position[2] = (*p)->m_Position[2];
153 a_SendData.m_Data.m_AvatarData.m_Direction[0] = (*p)->m_Direction[0];
154 a_SendData.m_Data.m_AvatarData.m_Direction[1] = (*p)->m_Direction[1];
155 a_SendData.m_Data.m_AvatarData.m_Direction[2] = (*p)->m_Direction[2];
156 a_SendData.m_Data.m_AvatarData.m_Radias = (*p)->m_Radias;
158 if(!io_ConnectionIterator->m_pConnection->send(&a_SendData)){
159 std::cout << "do not send position" << std::endl;
165 CommunicationData a_SendData;
166 a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p;");
167 if(!io_pConnection->send(&a_SendBuffer)){
168 std::cout << "do not send position" << std::endl;
175 ////////////////////////////////////////////////////////////////////////////////
177 ////////////////////////////////////////////////////////////////////////////////
178 bool CServerModel::requestMove(ConnectionVector::iterator io_ConnectionIterator, char in_pMoveDirection)
180 const double M_PI = 3.14159265357989;
181 //
\90l
\82Ì
\95à
\82
\91¬
\93x
\82ð1
\95b
\8aÔ
\82É1m
\82Æ
\82·
\82é
182 const double a_VelocityParTimes = 1.0 / 60;
183 // 2
\95b
\82Å
\90U
\82è
\95Ô
\82é
\81i180
\93x = pi
\81j
\82Æ
\82·
\82é
\81B
184 const double a_RotateParTimes = M_PI / (2 * 60);
186 //
\96¢
\83\8d\83O
\83C
\83\93
187 if(io_ConnectionIterator->m_pAvatarInformation == NULL){
191 AvatarInformation* a_pAvatarInformation = io_ConnectionIterator->m_pAvatarInformation;
193 if(in_pMoveDirection == 'f'){
194 a_pAvatarInformation->m_Position[0] += a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
195 a_pAvatarInformation->m_Position[1] += a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
196 a_pAvatarInformation->m_Position[2] += a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
198 //
\8cã
\95û
\82Ö
\88Ú
\93®
199 else if(in_pMoveDirection == 'b'){
200 a_pAvatarInformation->m_Position[0] -= a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
201 a_pAvatarInformation->m_Position[1] -= a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
202 a_pAvatarInformation->m_Position[2] -= a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
205 else if(in_pMoveDirection == 'r'){
206 double x = a_pAvatarInformation->m_Direction[0];
207 double y = a_pAvatarInformation->m_Direction[1];
208 a_pAvatarInformation->m_Direction[0] = x * cos(a_RotateParTimes) + y * sin(a_RotateParTimes);
209 a_pAvatarInformation->m_Direction[1] = -x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
212 else if(in_pMoveDirection == 'l'){
213 double x = a_pAvatarInformation->m_Direction[0];
214 double y = a_pAvatarInformation->m_Direction[1];
215 a_pAvatarInformation->m_Direction[0] = x * cos(a_RotateParTimes) - y * sin(a_RotateParTimes);
216 a_pAvatarInformation->m_Direction[1] = x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);