OSDN Git Service

correspondence multi login
[internetcity/prototype.git] / vc2010_server / vc2010_server / CServerModel.cpp
1 #include "../../common/Environment.h"
2 #include "CServerModel.h"
3
4 #include <iostream>
5
6 ////////////////////////////////////////////////////////////////////////////////
7 // constructor
8 ////////////////////////////////////////////////////////////////////////////////
9 CServerModel::CServerModel()
10 {
11 }
12
13 ////////////////////////////////////////////////////////////////////////////////
14 // destructor
15 ////////////////////////////////////////////////////////////////////////////////
16 CServerModel::~CServerModel()
17 {
18         for(size_t i = 0; i < m_Connections.size(); i++){
19                 delete m_Connections[i];
20         }
21         for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
22                 delete *p;
23         }
24 }
25
26 ////////////////////////////////////////////////////////////////////////////////
27 // initialize
28 ////////////////////////////////////////////////////////////////////////////////
29 bool CServerModel::initialize()
30 {
31         m_ServerSocket.initialize();
32         m_ServerSocket.openPort();
33
34         m_Connections.resize(MAX_CONNECTION_NUMBER);
35         for(size_t i = 0; i < m_Connections.size(); i++){
36                 m_Connections[i] = new CServerConnection();
37                 m_Connections[i]->initialize();
38                 m_ServerSocket.accept(m_Connections[i]);
39         }
40         return true;
41 }
42
43 ////////////////////////////////////////////////////////////////////////////////
44 // \8f\88\97\9d
45 ////////////////////////////////////////////////////////////////////////////////
46 bool CServerModel::process()
47 {
48         // \92Ê\90M\83N\83\89\83X\82©\82ç\83f\81[\83^\8eæ\93¾
49         CommunicationBuffer* a_pBuffer;
50         for(size_t i = 0; i < m_Connections.size(); i++){
51                 if(m_Connections[i]->receive(&a_pBuffer)){
52                         // \83\8d\83O\83C\83\93\8f\88\97\9d
53                         if(a_pBuffer->m_Buffer[0] == 'i'){
54                                 char a_LoginName[256];
55                                 // \90³\8bK\95\\8c»\82ð\8eg\82¢\82½\82¢\81i\92N\82©\8eÀ\91\95\82µ\82Ä\82­\82¾\82³\82¢\81j
56                                 for(size_t p = 0; p < 256; p++){
57                                         if(a_pBuffer->m_Buffer[p + 2] == ';'){
58                                                 a_LoginName[p] = '\0';
59                                                 break;
60                                         }
61                                         a_LoginName[p] = a_pBuffer->m_Buffer[p + 2];
62                                 }
63
64                                 AvatarInformation* temp = new AvatarInformation;
65                                 strcpy(temp->m_Name, a_LoginName);
66                                 temp->m_Position[0] = 0;
67                                 temp->m_Position[1] = 0;
68                                 temp->m_Position[2] = 0;
69                                 temp->m_Direction[0] = 1;
70                                 temp->m_Direction[1] = 0;
71                                 temp->m_Direction[2] = 0;
72                                 temp->m_Radias = 0.3;
73                                 m_AvatarInformations.push_back(temp);
74
75                                 CommunicationBuffer a_SendBuffer;
76                                 a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "i:%s;", a_LoginName);
77                                 m_Connections[i]->send(&a_SendBuffer);
78                                 m_Connections[i]->setAvatarInformationPointer(temp);
79
80                                 std::cout << "login " << a_LoginName << std::endl;
81                         }
82                         // \83\8d\83O\83A\83E\83g\8f\88\97\9d
83                         else if(a_pBuffer->m_Buffer[0] == 'o'){
84                                 AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
85
86                                 CommunicationBuffer a_SendBuffer;
87                                 a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "o:%s;", a_pAvatarInformation->m_Name);
88                                 m_Connections[i]->send(&a_SendBuffer);
89
90                                 std::cout << "logout " << a_pAvatarInformation->m_Name << std::endl;
91
92                                 // \83A\83o\83^\81[\82ð\8dí\8f\9c\82·\82é
93                                 for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
94                                         if(*p == a_pAvatarInformation){
95                                                 delete *p;
96                                         }
97                                         m_AvatarInformations.erase(p);
98                                         break;
99                                 }
100                                 m_Connections[i]->setAvatarInformationPointer(NULL);
101                         }
102                         // \8dÀ\95W\8eæ\93¾
103                         else if(a_pBuffer->m_Buffer[0] == 'p'){
104                                 AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
105
106                                 CommunicationBuffer a_SendBuffer;
107                                 if(!m_AvatarInformations.empty()){
108                                         for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
109                                                 a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p:%s:%f:%f:%f:%f:%f:%f:%f;",
110                                                         (*p)->m_Name,
111                                                         (*p)->m_Position[0],
112                                                         (*p)->m_Position[1],
113                                                         (*p)->m_Position[2],
114                                                         (*p)->m_Direction[0],
115                                                         (*p)->m_Direction[1],
116                                                         (*p)->m_Direction[2],
117                                                         (*p)->m_Radias
118                                                 );
119                                                 if(!m_Connections[i]->send(&a_SendBuffer)){
120                                                         std::cout << "do not send position" << std::endl;
121                                                 }
122                                         }
123                                 }
124                                 else{
125                                         a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p;");
126                                         if(!m_Connections[i]->send(&a_SendBuffer)){
127                                                 std::cout << "do not send position" << std::endl;
128                                         }
129                                 }
130                         }
131                         // \83A\83N\83V\83\87\83\93\83R\83}\83\93\83h\82ð\8f\88\97\9d
132                         // \91O\95û\82Ö\88Ú\93®
133                         else if(a_pBuffer->m_Buffer[0] == 'f'){
134                                 AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
135
136                                 const double M_PI = 3.14159265357989;
137                                 // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
138                                 double a_VelocityParTimes = 1.0 / 60;
139                                 // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
140                                 double a_RotateParTimes = M_PI / (2 * 60);
141
142                                 a_pAvatarInformation->m_Position[0] += a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
143                                 a_pAvatarInformation->m_Position[1] += a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
144                                 a_pAvatarInformation->m_Position[2] += a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
145                         }
146                         // \8cã\95û\82Ö\88Ú\93®
147                         else if(a_pBuffer->m_Buffer[0] == 'b'){
148                                 AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
149
150                                 const double M_PI = 3.14159265357989;
151                                 // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
152                                 double a_VelocityParTimes = 1.0 / 60;
153                                 // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
154                                 double a_RotateParTimes = M_PI / (2 * 60);
155
156                                 a_pAvatarInformation->m_Position[0] -= a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
157                                 a_pAvatarInformation->m_Position[1] -= a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
158                                 a_pAvatarInformation->m_Position[2] -= a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
159                         }
160                         // \89E\90ù\89ñ
161                         else if(a_pBuffer->m_Buffer[0] == 'r'){
162                                 AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
163
164                                 const double M_PI = 3.14159265357989;
165                                 // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
166                                 double a_VelocityParTimes = 1.0 / 60;
167                                 // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
168                                 double a_RotateParTimes = M_PI / (2 * 60);
169
170                                 double x = a_pAvatarInformation->m_Direction[0];
171                                 double y = a_pAvatarInformation->m_Direction[1];
172                                 a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) + y * sin(a_RotateParTimes);
173                                 a_pAvatarInformation->m_Direction[1] = -x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
174                         }
175                         // \8d\90ù\89ñ
176                         else if(a_pBuffer->m_Buffer[0] == 'l'){
177                                 AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
178
179                                 const double M_PI = 3.14159265357989;
180                                 // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
181                                 double a_VelocityParTimes = 1.0 / 60;
182                                 // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
183                                 double a_RotateParTimes = M_PI / (2 * 60);
184
185                                 double x = a_pAvatarInformation->m_Direction[0];
186                                 double y = a_pAvatarInformation->m_Direction[1];
187                                 a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) - y * sin(a_RotateParTimes);
188                                 a_pAvatarInformation->m_Direction[1] =  x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
189                         }
190                 }
191         }
192
193         // \89¹\90º\82ð\8d\87\90¬
194
195         // \8eæ\93¾\83R\83}\83\93\83h\82É\91Î\82µ\82Ä\83f\81[\83^\91\97\90M
196         return true;
197 }