OSDN Git Service

update multi login
authorBreak <t_windbreak@yahoo.co.jp>
Tue, 10 Aug 2010 09:55:57 +0000 (18:55 +0900)
committerBreak <t_windbreak@yahoo.co.jp>
Tue, 10 Aug 2010 09:55:57 +0000 (18:55 +0900)
separate CConnection Class
ServerConnection Class and ClientConnection Cllass process
syntactic analysis.
Model Class process main of internetcity.

12 files changed:
common/CClientConnection.cpp [new file with mode: 0644]
common/CClientConnection.h [new file with mode: 0644]
common/CServerConnection.cpp
common/CServerConnection.h
common/CSocket.h
common/Data.h
vc2010_client/vc2010_client/CClientModel.cpp
vc2010_client/vc2010_client/CClientModel.h
vc2010_client/vc2010_client/CClientUI.cpp
vc2010_client/vc2010_client/vc2010_client.vcxproj
vc2010_server/vc2010_server/CServerModel.cpp
vc2010_server/vc2010_server/CServerModel.h

diff --git a/common/CClientConnection.cpp b/common/CClientConnection.cpp
new file mode 100644 (file)
index 0000000..ed2e700
--- /dev/null
@@ -0,0 +1,101 @@
+#include "CClientConnection.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// \83R\83\93\83X\83g\83\89\83N\83^
+////////////////////////////////////////////////////////////////////////////////
+CClientConnection::CClientConnection()
+{
+       m_isLogin = false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// \83f\83X\83g\83\89\83N\83^
+////////////////////////////////////////////////////////////////////////////////
+CClientConnection::~CClientConnection()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// initialize
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::initialize()
+{
+       CSocket::initialize();
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// send
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::send(const CommunicationData* in_pCommunicationData)
+{
+       // \83T\83C\83Y\82Í\8c\88\82ß\91Å\82¿
+       if(::send(m_Socket, reinterpret_cast<const char*>(in_pCommunicationData), MAX_COMMUNICATION_DATA_LENGTH, 0) == SOCKET_ERROR){
+               return false;
+       }
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// receive
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::receive(CommunicationData** out_ppCommunicationData)
+{
+       if(m_Buffer.empty()){
+               return false;
+       }
+
+       *out_ppCommunicationData = reinterpret_cast<CommunicationData*>(m_Buffer.getReadPointer()->m_Buffer);
+       m_Buffer.nextReadBuffer();
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// login
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::login(const char* in_pLoginName)
+{
+       CommunicationData a_SendData;
+       a_SendData.m_DataType = 'i';
+       strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
+       send(&a_SendData);
+
+       // \82±\82Ì\83t\83\89\83O\82Í\8eó\90M\83\81\83b\83Z\81[\83W\82ð\8am\82©\82ß\82Ä\82©\82ç\95Ï\8dX\82·\82é\82×\82«
+       m_isLogin = true;
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// logout
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::logout()
+{
+       CommunicationData a_SendData;
+       a_SendData.m_DataType = 'o';
+       send(&a_SendData);
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// \8dÀ\95W\8eæ\93¾
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::requestPosition()
+{
+       CommunicationData a_SendData;
+       a_SendData.m_DataType = 'p';
+       send(&a_SendData);
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// \88Ú\93®
+////////////////////////////////////////////////////////////////////////////////
+bool CClientConnection::requestMove(char in_Direction)
+{
+       CommunicationData a_SendData;
+       a_SendData.m_DataType = 'a';
+       a_SendData.m_Data.m_ActionCommand.m_CommandType = in_Direction;
+       send(&a_SendData);
+       return true;
+}
+
diff --git a/common/CClientConnection.h b/common/CClientConnection.h
new file mode 100644 (file)
index 0000000..c32c524
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef INC_CClientConnection
+#define INC_CClientConnection
+
+// \83C\83\93\83N\83\8b\81[\83h\82Í\95K\82¸\95K\97v\82È\95¨\82¾\82¯
+// \93à\95\94\82Å\97\98\97p\82·\82é\82¾\82¯\82Ì\95¨\82Í\83\\81[\83X\82É\8bL\8fq
+#include "Environment.h"
+#include "CSocket.h"
+#include "Data.h"
+
+// \8aÖ\90\94\96¼\82Í\83\8d\81[\83\8f\83L\83\83\83\81\83\8b\83P\81[\83X\82Æ\82·\82é
+
+////////////////////////////////////////////////////////////////////////////////
+// CClientConnection
+// \92Ê\90M\97p\83N\83\89\83X
+// internetcity\97p\82Ì\92Ê\90M\97p
+// \83R\83}\83\93\83h\82È\82çTCP\81A\89¹\90º\82È\82çUDP\82ð\8eg\97p\82·\82é
+// \8d\\95\89ð\90Í\82Ì\8b@\94\\82ð\8eÀ\8c»\82·\82é
+// \8f\88\97\9d\82É\82©\82©\82í\82é\93à\97e\82Í\8bL\8fq\82µ\82È\82¢
+////////////////////////////////////////////////////////////////////////////////
+class CClientConnection : public CSocket
+{
+       ////////////////////////////////////////////////////////////////////////////////
+       // \83\81\83\93\83o\95Ï\90\94
+       ////////////////////////////////////////////////////////////////////////////////
+private:
+       bool m_isLogin;
+
+       ////////////////////////////////////////////////////////////////////////////////
+       // \83R\83\93\83X\83g\83\89\83N\83^
+       ////////////////////////////////////////////////////////////////////////////////
+public:
+       CClientConnection();
+
+       ////////////////////////////////////////////////////////////////////////////////
+       // \83f\83X\83g\83\89\83N\83^
+       ////////////////////////////////////////////////////////////////////////////////
+public:
+       ~CClientConnection();
+
+       ////////////////////////////////////////////////////////////////////////////////
+       // static\8aÖ\90\94\81A\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
+       ////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////
+       // \91\80\8dì\83\81\83\\83b\83h
+       ////////////////////////////////////////////////////////////////////////////////
+public:
+       // initialize
+       bool initialize();
+
+       // send\8aÖ\98A
+protected:
+       // send
+       bool send(const CommunicationData* in_pCommunicationData);
+public:
+       // login
+       bool login(const char* in_pLoginName);
+       // logout
+       bool logout();
+       // \8dÀ\95W\8eæ\93¾
+       bool requestPosition();
+       // \88Ú\93®
+       bool requestMove(char in_Direction);
+
+       // receive\8aÖ\98A
+public:
+       // receive
+       bool receive(CommunicationData** out_ppCommunicationData);
+
+       ////////////////////////////////////////////////////////////////////////////////
+       // \91®\90«\83\81\83\\83b\83h
+       ////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////
+       // \83C\83e\83\8c\81[\83V\83\87\83\93
+       ////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////
+       // \8fó\91Ô
+       ////////////////////////////////////////////////////////////////////////////////
+
+       ////////////////////////////////////////////////////////////////////////////////
+       // \89\89\8eZ\8eq
+       ////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////
+       // \8f\83\90\88\89¼\91z\8aÖ\90\94\81A\92è\8b`\82Ì\82Ý\81i\94ñ\8eÀ\91\95\92ñ\8b\9f\81j
+       ////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////
+       // \93à\95\94\83N\83\89\83X
+       ////////////////////////////////////////////////////////////////////////////////
+
+
+};
+
+#endif //INC_CClientConnection
index f6491ee..0a057e3 100644 (file)
@@ -24,3 +24,28 @@ bool CServerConnection::initialize()
        return true;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// send
+////////////////////////////////////////////////////////////////////////////////
+bool CServerConnection::send(const CommunicationData* in_pCommunicationData)
+{
+       // \83T\83C\83Y\82Í\8c\88\82ß\91Å\82¿
+       if(::send(m_Socket, reinterpret_cast<const char*>(in_pCommunicationData), MAX_COMMUNICATION_DATA_LENGTH, 0) == SOCKET_ERROR){
+               return false;
+       }
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// receive
+////////////////////////////////////////////////////////////////////////////////
+bool CServerConnection::receive(CommunicationData** out_ppCommunicationData)
+{
+       if(m_Buffer.empty()){
+               return false;
+       }
+
+       *out_ppCommunicationData = reinterpret_cast<CommunicationData*>(m_Buffer.getReadPointer()->m_Buffer);
+       m_Buffer.nextReadBuffer();
+       return true;
+}
index 198dde1..5c7e2d3 100644 (file)
 
 ////////////////////////////////////////////////////////////////////////////////
 // CServerConnection
-// \92Ê\90M\91\8d\8d\87\8aÇ\97\9d
+// \92Ê\90M\97p\83N\83\89\83X
 // internetcity\97p\82Ì\92Ê\90M\97p
 // \83R\83}\83\93\83h\82È\82çTCP\81A\89¹\90º\82È\82çUDP\82ð\8eg\97p\82·\82é
+// \8d\\95\89ð\90Í\82Ì\8b@\94\\82ð\8eÀ\8c»\82·\82é
+// \8f\88\97\9d\82É\82©\82©\82í\82é\93à\97e\82Í\8bL\8fq\82µ\82È\82¢
 ////////////////////////////////////////////////////////////////////////////////
 class CServerConnection : public CSocket
 {
@@ -20,9 +22,6 @@ class CServerConnection : public CSocket
        // \83\81\83\93\83o\95Ï\90\94
        ////////////////////////////////////////////////////////////////////////////////
 private:
-       // \83A\83o\83^\81[\82Ö\82Ì\83\8a\83\93\83N
-       AvatarInformation* m_pAvatarInformation;
-
        ////////////////////////////////////////////////////////////////////////////////
        // \83R\83\93\83X\83g\83\89\83N\83^
        ////////////////////////////////////////////////////////////////////////////////
@@ -42,22 +41,17 @@ public:
        // \91\80\8dì\83\81\83\\83b\83h
        ////////////////////////////////////////////////////////////////////////////////
 public:
+       // initialize
        bool initialize();
+       // send
+       bool send(const CommunicationData* in_pCommunicationData);
+       // receive
+       bool receive(CommunicationData** out_ppCommunicationData);
 
        ////////////////////////////////////////////////////////////////////////////////
        // \91®\90«\83\81\83\\83b\83h
        ////////////////////////////////////////////////////////////////////////////////
 public:
-       void setAvatarInformationPointer(AvatarInformation* io_pAvatarInformation)
-       {
-               m_pAvatarInformation = io_pAvatarInformation;
-       }
-
-       AvatarInformation* getAvatarInformationPointer()
-       {
-               return m_pAvatarInformation;
-       }
-
        ////////////////////////////////////////////////////////////////////////////////
        // \83C\83e\83\8c\81[\83V\83\87\83\93
        ////////////////////////////////////////////////////////////////////////////////
index 2491fc2..b4392c4 100644 (file)
@@ -32,13 +32,12 @@ class CSocket : public CThread
        ////////////////////////////////////////////////////////////////////////////////
        // \83\81\83\93\83o\95Ï\90\94
        ////////////////////////////////////////////////////////////////////////////////
-private:
+protected:
        WSADATA m_WsaData;
        SOCKET m_Socket;
        sockaddr_in m_SocketAddress;
 
        bool m_isConnect;
-
        CRingBuffer<CommunicationBuffer> m_Buffer;
 
        ////////////////////////////////////////////////////////////////////////////////
index 9e43ebc..564b87e 100644 (file)
@@ -3,11 +3,14 @@
 #ifndef INC_DATA
 #define INC_DATA
 
+static const int MAX_AVATAR_NAME_LENGTH = 32;
+static const int MAX_COMMUNICATION_DATA_LENGTH = 120;
+
 // \83A\83o\83^\81[\82Ì\8fî\95ñ
 struct AvatarInformation
 {
        // \83L\83\83\83\89\83N\83^\81[\96¼
-       char m_Name[256];
+       char m_Name[MAX_AVATAR_NAME_LENGTH];
        // \8dÀ\95W
        double m_Position[3];
        // \95û\8cü
@@ -16,4 +19,35 @@ struct AvatarInformation
        double m_Radias;
 };
 
+// \88ê\94Ê\92Ê\90M\83f\81[\83^
+struct CommunicationData{
+       // \83f\81[\83^\82Ì\8eí\97Þ
+       char m_DataType;
+       // \83f\81[\83^
+       union{
+               struct{
+                       char m_Name[MAX_AVATAR_NAME_LENGTH];
+               } m_LoginData;
+               struct{
+                       // \97L\8cø\82©\82Ç\82¤\82©
+                       char m_Enable;
+                       // \96¼\91O
+                       char m_Name[MAX_AVATAR_NAME_LENGTH];
+                       // \8dÀ\95W
+                       double m_Position[3];
+                       // \95û\8cü
+                       double m_Direction[3];
+                       // \83T\83C\83Y
+                       double m_Radias;
+               } m_AvatarData;
+               struct{
+                       char m_CommandType;
+               } m_ActionCommand;
+               // \89¹\90º
+               char m_Sound[40];
+               // \83f\81[\83^\83T\83C\83Y\92²\90®
+               char m_Dummy[MAX_COMMUNICATION_DATA_LENGTH - 1];
+       } m_Data;
+};
+
 #endif // INC_DATA
index cd48e9f..8cd95e1 100644 (file)
@@ -25,8 +25,7 @@ CClientModel::~CClientModel()
 ////////////////////////////////////////////////////////////////////////////////
 bool CClientModel::initialize()
 {
-       //m_Connection.initialize();
-       m_Socket.initialize();
+       m_Connection.initialize();
        return true;
 }
 
@@ -45,48 +44,34 @@ bool CClientModel::addEvent(std::string in_Event)
 bool CClientModel::process()
 {
        // \92Ê\90M\83N\83\89\83X\82©\82ç\83f\81[\83^\8eæ\93¾
-       CommunicationBuffer* a_pBuffer;
-       if(m_Socket.receive(&a_pBuffer)){
-               //std::cout << a_pBuffer->m_Buffer << std::endl;
-               // \8dÀ\95W\8eæ\93¾
-               if(a_pBuffer->m_Buffer[0] == 'p' && a_pBuffer->m_Buffer[1] == ':'){
-                       char a_LoginName[256];
-                       char* p1 = &a_pBuffer->m_Buffer[2];
-                       char* p2 = a_LoginName;
+       CommunicationData* a_pData;
+       if(m_Connection.receive(&a_pData)){
+               // \8dÀ\95W\83f\81[\83^\82Ì\8fê\8d\87
+               if(a_pData->m_DataType == 'p'){
+                       // \93¯\82\96¼\91O\82Ì\83A\83o\83^\81[\82ª\91\8dÝ\82·\82é\82©\83`\83F\83b\83N\82·\82é
+                       bool check = false;
+                       AvatarInformationList::iterator p = m_AvatarInformations.begin();
                        while(true){
-                               if(*p1 == ':'){
-                                       *p2 = '\0';
-                                       p1++;
+                               // \93¯\82\96¼\91O\82Ì\83A\83o\83^\81[\82ª\91\8dÝ\82µ\82È\82¢\8fê\8d\87\81A\90V\82½\82É\8dì\90¬\82·\82é
+                               if(p == m_AvatarInformations.end()){
+                                       AvatarInformation temp;
+                                       strcpy(temp.m_Name, a_pData->m_Data.m_AvatarData.m_Name);
+                                       m_AvatarInformations.push_front(temp);
+                                       p = m_AvatarInformations.begin();
                                        break;
                                }
-                               *p2 = *p1;
-                               p2++;
-                               p1++;
-                       }
-                       bool check = false;
-                       AvatarInformation* current = NULL;
-                       for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
-                               if(strcmp(p->m_Name, a_LoginName) == 0){
-                                       check = true;
-                                       current = &(*p);
+                               if(strcmp(p->m_Name, a_pData->m_Data.m_AvatarData.m_Name) == 0){
                                        break;
                                }
+                               p++;
                        }
-                       if(current == NULL){
-                               AvatarInformation temp;
-                               strcpy(temp.m_Name, a_LoginName);
-                               m_AvatarInformations.push_back(temp);
-                               current = &m_AvatarInformations.back();
-                       }
-                       sscanf(p1, "%lf:%lf:%lf:%lf:%lf:%lf:%lf;",
-                               &current->m_Position[0],
-                               &current->m_Position[1],
-                               &current->m_Position[2],
-                               &current->m_Direction[0],
-                               &current->m_Direction[1],
-                               &current->m_Direction[2],
-                               &current->m_Radias
-                       );
+                       p->m_Position[0] = a_pData->m_Data.m_AvatarData.m_Position[0];
+                       p->m_Position[1] = a_pData->m_Data.m_AvatarData.m_Position[1];
+                       p->m_Position[2] = a_pData->m_Data.m_AvatarData.m_Position[2];
+                       p->m_Direction[0] = a_pData->m_Data.m_AvatarData.m_Direction[0];
+                       p->m_Direction[1] = a_pData->m_Data.m_AvatarData.m_Direction[1];
+                       p->m_Direction[2] = a_pData->m_Data.m_AvatarData.m_Direction[2];
+                       p->m_Radias = a_pData->m_Data.m_AvatarData.m_Radias;
                }
        }
 
@@ -96,7 +81,7 @@ bool CClientModel::process()
                // connect
                if(a_rEvent == "CONNECT"){
                        //m_Connection.connection();
-                       if(m_Socket.connection()){
+                       if(m_Connection.connection()){
                                std::cout << "seccess connection" << std::endl;
                        }
                        else{
@@ -105,8 +90,7 @@ bool CClientModel::process()
                }
                // disconnect
                else if(a_rEvent == "DISCONNECT"){
-                       //m_Connection.disconnection();
-                       if(m_Socket.disconnection()){
+                       if(m_Connection.disconnection()){
                                std::cout << "sccess disconnection" << std::endl;
                        }
                        else{
@@ -115,47 +99,32 @@ bool CClientModel::process()
                }
                // \83\8d\83O\83C\83\93\8f\88\97\9d
                else if(a_rEvent == "LOGIN"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "i:%s;", m_LoginName.c_str());
-                       //m_Connection.setSendData(&a_SendBuffer);
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.login(m_LoginName.c_str());
                }
                // \83\8d\83O\83A\83E\83g
                else if(a_rEvent == "LOGOUT"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "o;");
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.logout();
                }
                // \8dÀ\95W\8eæ\93¾
                else if(a_rEvent == "POSITION"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p;");
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.requestPosition();
                }
                // \83A\83N\83V\83\87\83\93\83R\83}\83\93\83h
                // \91O\95û\82Ö\88Ú\93®
                else if(a_rEvent == "FRONT"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "f;");
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.requestMove('f');
                }
                // \8cã\95û\82Ö\88Ú\93®
                else if(a_rEvent == "BACK"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "b;");
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.requestMove('b');
                }
                // \89E\90ù\89ñ
                else if(a_rEvent == "TURN_RIGHT"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "r;");
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.requestMove('r');
                }
                // \8d\90ù\89ñ
                else if(a_rEvent == "TURN_LEFT"){
-                       CommunicationBuffer a_SendBuffer;
-                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "l;");
-                       m_Socket.send(&a_SendBuffer);
+                       m_Connection.requestMove('l');
                }
 
                m_Events.pop_front();
index fff4b4f..dc55db9 100644 (file)
@@ -5,7 +5,7 @@
 // \93à\95\94\82Å\97\98\97p\82·\82é\82¾\82¯\82Ì\95¨\82Í\83\\81[\83X\82É\8bL\8fq
 #include "../../common/Data.h"
 //#include "../../common/CConnection.h"
-#include "../../common/CSocket.h"
+#include "../../common/CClientConnection.h"
 
 #include <list>
 
@@ -28,7 +28,7 @@ private:
        // \83A\83o\83^\81[
        AvatarInformationList m_AvatarInformations;
        // \92Ê\90M\83N\83\89\83X
-       CSocket m_Socket;
+       CClientConnection m_Connection;
 
        std::list<std::string> m_Events;
 
index 586279d..c91900c 100644 (file)
@@ -249,28 +249,24 @@ void CClientUI::timer(int value)
        if((g_KeyStatus & KEY_UP_BIT) && !(g_KeyStatus & KEY_DOWN_BIT)){
                sm_pUI->enterCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
                sm_pUI->m_Events.push_back("FRONT");
-               sm_pUI->m_Events.push_back("POSITION");
                sm_pUI->leaveCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
        }
        // \8cã\91Þ
        else if(!(g_KeyStatus & KEY_UP_BIT) && (g_KeyStatus & KEY_DOWN_BIT)){
                sm_pUI->enterCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
                sm_pUI->m_Events.push_back("BACK");
-               sm_pUI->m_Events.push_back("POSITION");
                sm_pUI->leaveCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
        }
        // \89E\90ù\89ñ
        if((g_KeyStatus & KEY_RIGHT_BIT) && !(g_KeyStatus & KEY_LEFT_BIT)){
                sm_pUI->enterCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
                sm_pUI->m_Events.push_back("TURN_RIGHT");
-               sm_pUI->m_Events.push_back("POSITION");
                sm_pUI->leaveCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
        }
        // \8d\90ù\89ñ
        else if(!(g_KeyStatus & KEY_RIGHT_BIT) && (g_KeyStatus & KEY_LEFT_BIT)){
                sm_pUI->enterCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
                sm_pUI->m_Events.push_back("TURN_LEFT");
-               sm_pUI->m_Events.push_back("POSITION");
                sm_pUI->leaveCriticalSectionID(sm_pUI->m_CriticalSectionOfEvent);
        }
 
index 7d4e57e..3982569 100644 (file)
@@ -74,6 +74,7 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\..\common\CClientConnection.cpp" />
     <ClCompile Include="..\..\common\CSocket.cpp" />
     <ClCompile Include="..\..\common\CThread.cpp" />
     <ClCompile Include="CClient.cpp" />
@@ -82,6 +83,7 @@
     <ClCompile Include="main.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\common\CClientConnection.h" />
     <ClInclude Include="..\..\common\CRingBuffer.h" />
     <ClInclude Include="..\..\common\CSocket.h" />
     <ClInclude Include="..\..\common\CThread.h" />
index 6c56320..08967c0 100644 (file)
@@ -16,7 +16,7 @@ CServerModel::CServerModel()
 CServerModel::~CServerModel()
 {
        for(size_t i = 0; i < m_Connections.size(); i++){
-               delete m_Connections[i];
+               delete m_Connections[i].m_pConnection;
        }
        for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
                delete *p;
@@ -33,9 +33,12 @@ bool CServerModel::initialize()
 
        m_Connections.resize(MAX_CONNECTION_NUMBER);
        for(size_t i = 0; i < m_Connections.size(); i++){
-               m_Connections[i] = new CServerConnection();
-               m_Connections[i]->initialize();
-               m_ServerSocket.accept(m_Connections[i]);
+               ConnectionTuple temp;
+               temp.m_pConnection = new CServerConnection();
+               temp.m_pConnection->initialize();
+               m_ServerSocket.accept(temp.m_pConnection);
+               temp.m_pAvatarInformation = NULL;
+               m_Connections[i] = temp;
        }
        return true;
 }
@@ -46,146 +49,26 @@ bool CServerModel::initialize()
 bool CServerModel::process()
 {
        // \92Ê\90M\83N\83\89\83X\82©\82ç\83f\81[\83^\8eæ\93¾
-       CommunicationBuffer* a_pBuffer;
-       for(size_t i = 0; i < m_Connections.size(); i++){
-               if(m_Connections[i]->receive(&a_pBuffer)){
-                       // \83\8d\83O\83C\83\93\8f\88\97\9d
-                       if(a_pBuffer->m_Buffer[0] == 'i'){
-                               char a_LoginName[256];
-                               // \90³\8bK\95\\8c»\82ð\8eg\82¢\82½\82¢\81i\92N\82©\8eÀ\91\95\82µ\82Ä\82­\82¾\82³\82¢\81j
-                               for(size_t p = 0; p < 256; p++){
-                                       if(a_pBuffer->m_Buffer[p + 2] == ';'){
-                                               a_LoginName[p] = '\0';
-                                               break;
-                                       }
-                                       a_LoginName[p] = a_pBuffer->m_Buffer[p + 2];
+       for(ConnectionVector::iterator p = m_Connections.begin(); p != m_Connections.end(); p++){
+               CommunicationData* a_pData;
+               if(p->m_pConnection->receive(&a_pData)){
+                       // \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
+                       if(a_pData->m_DataType == 'i'){
+                               if(login(p, a_pData->m_Data.m_LoginData.m_Name)){
+                                       std::cout << "login " << a_pData->m_Data.m_LoginData.m_Name << std::endl;
                                }
-
-                               AvatarInformation* temp = new AvatarInformation;
-                               strcpy(temp->m_Name, a_LoginName);
-                               temp->m_Position[0] = 0;
-                               temp->m_Position[1] = 0;
-                               temp->m_Position[2] = 0;
-                               temp->m_Direction[0] = 1;
-                               temp->m_Direction[1] = 0;
-                               temp->m_Direction[2] = 0;
-                               temp->m_Radias = 0.3;
-                               m_AvatarInformations.push_back(temp);
-
-                               CommunicationBuffer a_SendBuffer;
-                               a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "i:%s;", a_LoginName);
-                               m_Connections[i]->send(&a_SendBuffer);
-                               m_Connections[i]->setAvatarInformationPointer(temp);
-
-                               std::cout << "login " << a_LoginName << std::endl;
                        }
                        // \83\8d\83O\83A\83E\83g\8f\88\97\9d
-                       else if(a_pBuffer->m_Buffer[0] == 'o'){
-                               AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
-
-                               CommunicationBuffer a_SendBuffer;
-                               a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "o:%s;", a_pAvatarInformation->m_Name);
-                               m_Connections[i]->send(&a_SendBuffer);
-
-                               std::cout << "logout " << a_pAvatarInformation->m_Name << std::endl;
-
-                               // \83A\83o\83^\81[\82ð\8dí\8f\9c\82·\82é
-                               for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
-                                       if(*p == a_pAvatarInformation){
-                                               delete *p;
-                                       }
-                                       m_AvatarInformations.erase(p);
-                                       break;
-                               }
-                               m_Connections[i]->setAvatarInformationPointer(NULL);
+                       else if(a_pData->m_DataType == 'o'){
+                               logout(p, p->m_pAvatarInformation->m_Name);
                        }
                        // \8dÀ\95W\8eæ\93¾
-                       else if(a_pBuffer->m_Buffer[0] == 'p'){
-                               AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
-
-                               CommunicationBuffer a_SendBuffer;
-                               if(!m_AvatarInformations.empty()){
-                                       for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
-                                               a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p:%s:%f:%f:%f:%f:%f:%f:%f;",
-                                                       (*p)->m_Name,
-                                                       (*p)->m_Position[0],
-                                                       (*p)->m_Position[1],
-                                                       (*p)->m_Position[2],
-                                                       (*p)->m_Direction[0],
-                                                       (*p)->m_Direction[1],
-                                                       (*p)->m_Direction[2],
-                                                       (*p)->m_Radias
-                                               );
-                                               if(!m_Connections[i]->send(&a_SendBuffer)){
-                                                       std::cout << "do not send position" << std::endl;
-                                               }
-                                       }
-                               }
-                               else{
-                                       a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p;");
-                                       if(!m_Connections[i]->send(&a_SendBuffer)){
-                                               std::cout << "do not send position" << std::endl;
-                                       }
-                               }
+                       else if(a_pData->m_DataType == 'p'){
+                               requestPosition(p);
                        }
                        // \83A\83N\83V\83\87\83\93\83R\83}\83\93\83h\82ð\8f\88\97\9d
-                       // \91O\95û\82Ö\88Ú\93®
-                       else if(a_pBuffer->m_Buffer[0] == 'f'){
-                               AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
-
-                               const double M_PI = 3.14159265357989;
-                               // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
-                               double a_VelocityParTimes = 1.0 / 60;
-                               // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
-                               double a_RotateParTimes = M_PI / (2 * 60);
-
-                               a_pAvatarInformation->m_Position[0] += a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
-                               a_pAvatarInformation->m_Position[1] += a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
-                               a_pAvatarInformation->m_Position[2] += a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
-                       }
-                       // \8cã\95û\82Ö\88Ú\93®
-                       else if(a_pBuffer->m_Buffer[0] == 'b'){
-                               AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
-
-                               const double M_PI = 3.14159265357989;
-                               // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
-                               double a_VelocityParTimes = 1.0 / 60;
-                               // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
-                               double a_RotateParTimes = M_PI / (2 * 60);
-
-                               a_pAvatarInformation->m_Position[0] -= a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
-                               a_pAvatarInformation->m_Position[1] -= a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
-                               a_pAvatarInformation->m_Position[2] -= a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
-                       }
-                       // \89E\90ù\89ñ
-                       else if(a_pBuffer->m_Buffer[0] == 'r'){
-                               AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
-
-                               const double M_PI = 3.14159265357989;
-                               // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
-                               double a_VelocityParTimes = 1.0 / 60;
-                               // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
-                               double a_RotateParTimes = M_PI / (2 * 60);
-
-                               double x = a_pAvatarInformation->m_Direction[0];
-                               double y = a_pAvatarInformation->m_Direction[1];
-                               a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) + y * sin(a_RotateParTimes);
-                               a_pAvatarInformation->m_Direction[1] = -x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
-                       }
-                       // \8d\90ù\89ñ
-                       else if(a_pBuffer->m_Buffer[0] == 'l'){
-                               AvatarInformation* a_pAvatarInformation = m_Connections[i]->getAvatarInformationPointer();;
-
-                               const double M_PI = 3.14159265357989;
-                               // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
-                               double a_VelocityParTimes = 1.0 / 60;
-                               // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
-                               double a_RotateParTimes = M_PI / (2 * 60);
-
-                               double x = a_pAvatarInformation->m_Direction[0];
-                               double y = a_pAvatarInformation->m_Direction[1];
-                               a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) - y * sin(a_RotateParTimes);
-                               a_pAvatarInformation->m_Direction[1] =  x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
+                       else if(a_pData->m_DataType == 'a'){
+                               requestMove(p, a_pData->m_Data.m_ActionCommand.m_CommandType);
                        }
                }
        }
@@ -195,3 +78,142 @@ bool CServerModel::process()
        // \8eæ\93¾\83R\83}\83\93\83h\82É\91Î\82µ\82Ä\83f\81[\83^\91\97\90M
        return true;
 }
+
+////////////////////////////////////////////////////////////////////////////////
+// login
+////////////////////////////////////////////////////////////////////////////////
+bool CServerModel::login(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName)
+{
+       AvatarInformation* temp = new AvatarInformation;
+       strcpy(temp->m_Name, in_pLoginName);
+       temp->m_Position[0] = 0;
+       temp->m_Position[1] = 0;
+       temp->m_Position[2] = 0;
+       temp->m_Direction[0] = 1;
+       temp->m_Direction[1] = 0;
+       temp->m_Direction[2] = 0;
+       temp->m_Radias = 0.3;
+       m_AvatarInformations.push_back(temp);
+
+       CommunicationData a_SendData;
+       a_SendData.m_DataType = 'i';
+       strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
+       io_ConnectionIterator->m_pConnection->send(&a_SendData);
+       io_ConnectionIterator->m_pAvatarInformation = temp;
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// logout
+////////////////////////////////////////////////////////////////////////////////
+bool CServerModel::logout(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName)
+{
+       // \96¢\83\8d\83O\83C\83\93
+       if(io_ConnectionIterator->m_pAvatarInformation == NULL){
+               return false;
+       }
+
+       CommunicationData a_SendData;
+       a_SendData.m_DataType = 'o';
+       strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
+       io_ConnectionIterator->m_pConnection->send(&a_SendData);
+
+       std::cout << "logout " << io_ConnectionIterator->m_pAvatarInformation->m_Name << std::endl;
+
+       // \83A\83o\83^\81[\82ð\8dí\8f\9c\82·\82é
+       for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
+               if(*p == io_ConnectionIterator->m_pAvatarInformation){
+                       delete *p;
+               }
+               m_AvatarInformations.erase(p);
+               break;
+       }
+       io_ConnectionIterator->m_pAvatarInformation = NULL;
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// position
+////////////////////////////////////////////////////////////////////////////////
+bool CServerModel::requestPosition(ConnectionVector::iterator io_ConnectionIterator)
+{
+       // \96¢\83\8d\83O\83C\83\93
+       if(io_ConnectionIterator->m_pAvatarInformation == NULL){
+               return false;
+       }
+
+       if(!m_AvatarInformations.empty()){
+               for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
+                       CommunicationData a_SendData;
+                       a_SendData.m_DataType = 'p';
+                       strcpy(a_SendData.m_Data.m_AvatarData.m_Name, (*p)->m_Name);
+                       a_SendData.m_Data.m_AvatarData.m_Position[0] = (*p)->m_Position[0];
+                       a_SendData.m_Data.m_AvatarData.m_Position[1] = (*p)->m_Position[1];
+                       a_SendData.m_Data.m_AvatarData.m_Position[2] = (*p)->m_Position[2];
+                       a_SendData.m_Data.m_AvatarData.m_Direction[0] = (*p)->m_Direction[0];
+                       a_SendData.m_Data.m_AvatarData.m_Direction[1] = (*p)->m_Direction[1];
+                       a_SendData.m_Data.m_AvatarData.m_Direction[2] = (*p)->m_Direction[2];
+                       a_SendData.m_Data.m_AvatarData.m_Radias = (*p)->m_Radias;
+
+                       if(!io_ConnectionIterator->m_pConnection->send(&a_SendData)){
+                               std::cout << "do not send position" << std::endl;
+                       }
+               }
+       }
+       /*
+       else{
+               CommunicationData a_SendData;
+               a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p;");
+               if(!io_pConnection->send(&a_SendBuffer)){
+                       std::cout << "do not send position" << std::endl;
+               }
+       }
+       */
+       return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// move
+////////////////////////////////////////////////////////////////////////////////
+bool CServerModel::requestMove(ConnectionVector::iterator io_ConnectionIterator, char in_pMoveDirection)
+{
+       const double M_PI = 3.14159265357989;
+       // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
+       const double a_VelocityParTimes = 1.0 / 60;
+       // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
+       const double a_RotateParTimes = M_PI / (2 * 60);
+
+       // \96¢\83\8d\83O\83C\83\93
+       if(io_ConnectionIterator->m_pAvatarInformation == NULL){
+               return false;
+       }
+
+       AvatarInformation* a_pAvatarInformation = io_ConnectionIterator->m_pAvatarInformation;
+
+       if(in_pMoveDirection == 'f'){
+               a_pAvatarInformation->m_Position[0] += a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
+               a_pAvatarInformation->m_Position[1] += a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
+               a_pAvatarInformation->m_Position[2] += a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
+       }
+       // \8cã\95û\82Ö\88Ú\93®
+       else if(in_pMoveDirection == 'b'){
+               a_pAvatarInformation->m_Position[0] -= a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
+               a_pAvatarInformation->m_Position[1] -= a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
+               a_pAvatarInformation->m_Position[2] -= a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
+       }
+       // \89E\90ù\89ñ
+       else if(in_pMoveDirection == 'r'){
+               double x = a_pAvatarInformation->m_Direction[0];
+               double y = a_pAvatarInformation->m_Direction[1];
+               a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) + y * sin(a_RotateParTimes);
+               a_pAvatarInformation->m_Direction[1] = -x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
+       }
+       // \8d\90ù\89ñ
+       else if(in_pMoveDirection == 'l'){
+               double x = a_pAvatarInformation->m_Direction[0];
+               double y = a_pAvatarInformation->m_Direction[1];
+               a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) - y * sin(a_RotateParTimes);
+               a_pAvatarInformation->m_Direction[1] =  x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
+       }
+       return true;
+}
index 3ef7cb4..57c23ce 100644 (file)
 #include <vector>
 
 // \92Ê\90M\83N\83\89\83X\83\8a\83X\83g
-typedef std::vector<CServerConnection*> ConnectionVector;
+struct ConnectionTuple{
+       CServerConnection* m_pConnection;
+       AvatarInformation* m_pAvatarInformation;
+};
+typedef std::vector<ConnectionTuple> ConnectionVector;
 
 // \83A\83o\83^\81[\8aÇ\97\9d\83\8a\83X\83g
 typedef std::list<AvatarInformation*> AvatarInformationList;
@@ -63,6 +67,16 @@ public:
        // \8f\88\97\9d
        bool process();
 
+private:
+       // login
+       bool login(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName);
+       // logout
+       bool logout(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName);
+       // position
+       bool requestPosition(ConnectionVector::iterator io_ConnectionIterator);
+       // move
+       bool requestMove(ConnectionVector::iterator io_ConnectionIterator, char in_pMoveDirection);
+
        ////////////////////////////////////////////////////////////////////////////////
        // \91®\90«\83\81\83\\83b\83h
        ////////////////////////////////////////////////////////////////////////////////