--- /dev/null
+#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;
+}
+
--- /dev/null
+#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
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;
+}
////////////////////////////////////////////////////////////////////////////////
// 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
{
// \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^
////////////////////////////////////////////////////////////////////////////////
// \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
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// \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;
////////////////////////////////////////////////////////////////////////////////
#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ü
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
////////////////////////////////////////////////////////////////////////////////
bool CClientModel::initialize()
{
- //m_Connection.initialize();
- m_Socket.initialize();
+ m_Connection.initialize();
return true;
}
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;",
- ¤t->m_Position[0],
- ¤t->m_Position[1],
- ¤t->m_Position[2],
- ¤t->m_Direction[0],
- ¤t->m_Direction[1],
- ¤t->m_Direction[2],
- ¤t->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;
}
}
// connect
if(a_rEvent == "CONNECT"){
//m_Connection.connection();
- if(m_Socket.connection()){
+ if(m_Connection.connection()){
std::cout << "seccess connection" << std::endl;
}
else{
}
// disconnect
else if(a_rEvent == "DISCONNECT"){
- //m_Connection.disconnection();
- if(m_Socket.disconnection()){
+ if(m_Connection.disconnection()){
std::cout << "sccess disconnection" << std::endl;
}
else{
}
// \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();
// \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>
// \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;
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);
}
</Link>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\..\common\CClientConnection.cpp" />
<ClCompile Include="..\..\common\CSocket.cpp" />
<ClCompile Include="..\..\common\CThread.cpp" />
<ClCompile Include="CClient.cpp" />
<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" />
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;
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;
}
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);
}
}
}
// \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;
+}
#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;
// \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
////////////////////////////////////////////////////////////////////////////////