Changes in / [384b7e0:093c141] in network-game
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
common/Common.h
r384b7e0 r093c141 20 20 } POSITION; 21 21 22 typedef struct 23 { 24 float x; 25 float y; 26 } FLOAT_POSITION; 27 22 28 #endif -
common/Player.cpp
r384b7e0 r093c141 4 4 #include <sstream> 5 5 #include <cstring> 6 #include <cmath> 6 7 7 8 using namespace std; … … 12 13 this->name = ""; 13 14 this->password = ""; 14 this->pos.x = 0;15 this->pos.y = 0;15 this->pos.x = this->target.x = 0; 16 this->pos.y = this->target.y = 0; 16 17 } 17 18 … … 23 24 this->pos.x = p.pos.x; 24 25 this->pos.y = p.pos.y; 26 this->target.x = p.target.x; 27 this->target.y = p.target.y; 25 28 this->addr = p.addr; 26 29 } … … 31 34 this->name = name; 32 35 this->password = password; 33 this->pos.x = 200;34 this->pos.y = 200;36 this->pos.x = this->target.x = 200; 37 this->pos.y = this->target.y = 200; 35 38 } 36 39 … … 40 43 this->name = name; 41 44 this->password = ""; 42 this->pos.x = 200;43 this->pos.y = 200;45 this->pos.x = this->target.x = 200; 46 this->pos.y = this->target.y = 200; 44 47 this->addr = addr; 45 48 } … … 79 82 this->addr = addr; 80 83 } 84 85 void Player::move(void) { 86 // timeLastMoved 87 // pos 88 // target 89 int speed = 100; // pixels per second 90 91 timespec curTS, diffTS; 92 clock_gettime(CLOCK_REALTIME, &curTS); 93 94 // get time elapsed 95 diffTS.tv_sec = curTS.tv_sec - timeLastUpdated.tv_sec; 96 diffTS.tv_nsec = curTS.tv_nsec - timeLastUpdated.tv_nsec; 97 if (diffTS.tv_nsec < 0) { 98 diffTS.tv_sec -= 1; 99 diffTS.tv_nsec += 1000000000; 100 } 101 102 cout << "elapsed secs: " << diffTS.tv_sec << endl; 103 cout << "elapsed nsecs: " << diffTS.tv_nsec << endl; 104 105 // here we move 100 pixels per second 106 float pixels = 100 * (diffTS.tv_sec+diffTS.tv_nsec/1000000000.0); 107 cout << "We need to move " << pixels << "pixels" << endl; 108 109 double angle = atan2(target.y-pos.y, target.x-pos.x); 110 111 // we just need to check that we don't overjump the target 112 pos.x += cos(angle)*pixels; 113 pos.y += sin(angle)*pixels; 114 115 timeLastUpdated.tv_sec = curTS.tv_sec; 116 timeLastUpdated.tv_nsec = curTS.tv_nsec; 117 } -
common/Player.h
r384b7e0 r093c141 12 12 13 13 #include <string> 14 #include <sys/time.h> 14 15 15 16 #include "Common.h" … … 32 33 void setAddr(sockaddr_in addr); 33 34 35 void move(); 36 34 37 int id; 35 38 string name; 36 39 string password; 37 40 sockaddr_in addr; 38 POSITION pos; 41 FLOAT_POSITION pos; 42 POSITION target; 43 timespec timeLastUpdated; 39 44 }; 40 45 -
server/DataAccess.cpp
r384b7e0 r093c141 81 81 } 82 82 83 if ( ( row = mysql_fetch_row(result)) != NULL ) 83 if ( ( row = mysql_fetch_row(result)) != NULL ) { 84 cout << "Creating a new player" << endl; 84 85 p = new Player(string(row[1]), string(row[2])); 85 else {86 }else { 86 87 cout << "Returned no results for some reason" << endl; 87 88 p = NULL; -
server/makefile
r384b7e0 r093c141 1 1 CC = g++ 2 LIB_FLAGS = -lssl -lmysqlclient -lcrypt 2 LIB_FLAGS = -lssl -lmysqlclient -lcrypt -lrt 3 3 FLAGS = $(LIB_FLAGS) 4 4 COMMON_PATH = ../common 5 DEPENDENCIES = Common.o Message.o Player.o Map.o DataAccess.o5 DEPENDENCIES = Common.o Message.o Player.o WorldMap.o DataAccess.o 6 6 7 7 server : server.cpp $(DEPENDENCIES) … … 17 17 $(CC) -c -o $@ $? 18 18 19 Map.o : $(COMMON_PATH)/Map.cpp19 WorldMap.o : $(COMMON_PATH)/WorldMap.cpp 20 20 $(CC) -c -o $@ $? 21 21 -
server/server.cpp
r384b7e0 r093c141 6 6 #include <sstream> 7 7 #include <cstring> 8 #include <cmath> 9 #include <sys/time.h> 8 10 9 11 #include <vector> … … 26 28 #include "../common/Common.h" 27 29 #include "../common/Message.h" 30 #include "../common/WorldMap.h" 28 31 #include "../common/Player.h" 29 32 … … 32 35 using namespace std; 33 36 34 bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG &serverMsg);37 bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, map<unsigned int, Player>& mapPlayers, WorldMap* gameMap, unsigned int& unusedId, NETWORK_MSG &serverMsg); 35 38 36 39 void updateUnusedId(unsigned int& id, map<unsigned int, Player>& mapPlayers); … … 106 109 exit(1); 107 110 } 111 112 WorldMap* gameMap = WorldMap::createDefaultMap(); 108 113 109 114 sock = socket(AF_INET, SOCK_DGRAM, 0); … … 119 124 set_nonblock(sock); 120 125 126 Player testP; 127 clock_gettime(CLOCK_REALTIME, &testP.timeLastUpdated); 128 129 cout << "Before sleep" << endl; 130 // wait some time 131 sleep(3); 132 cout << "After sleep" << endl; 133 134 testP.move(); 135 136 /* 121 137 bool broadcastResponse; 122 138 while (true) { … … 129 145 cout << "Got a message" << endl; 130 146 131 broadcastResponse = processMessage(clientMsg, from, mapPlayers, unusedId, serverMsg);147 broadcastResponse = processMessage(clientMsg, from, mapPlayers, gameMap, unusedId, serverMsg); 132 148 133 149 // probably replace this with a function that prints based on the … … 158 174 } 159 175 } 176 */ 160 177 161 178 return 0; 162 179 } 163 180 164 bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG& serverMsg)181 bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, WorldMap* gameMap, unsigned int& unusedId, NETWORK_MSG& serverMsg) 165 182 { 166 183 DataAccess da; … … 199 216 case MSG_TYPE_LOGIN: 200 217 { 218 cout << "Got login message" << endl; 219 201 220 string username(clientMsg.buffer); 202 221 string password(strchr(clientMsg.buffer, '\0')+1); … … 287 306 case MSG_TYPE_PLAYER_MOVE: 288 307 { 308 cout << "Got a move message" << endl; 309 289 310 istringstream iss; 290 311 iss.str(clientMsg.buffer); … … 305 326 mapPlayers[id].addr.sin_port == from.sin_port ) 306 327 { 307 memcpy(&mapPlayers[id].pos.x, clientMsg.buffer+4, 4); 308 memcpy(&mapPlayers[id].pos.y, clientMsg.buffer+8, 4); 309 310 serverMsg.type = MSG_TYPE_PLAYER_MOVE; 311 memcpy(serverMsg.buffer, clientMsg.buffer, 12); 312 313 broadcastResponse = true; 328 // we need to make sure the player can move here 329 if (0 <= x && x < 300 && 0 <= y && y < 300 && 330 gameMap->getElement(x/25, y/25) == WorldMap::TERRAIN_GRASS) 331 { 332 // first we get the correct vector 333 mapPlayers[id].target.x = x; 334 mapPlayers[id].target.y = y; 335 int xDiff = mapPlayers[id].target.x - mapPlayers[id].pos.x; 336 int yDiff = mapPlayers[id].target.y - mapPlayers[id].pos.y; 337 cout << "xDiff: " << xDiff << endl; 338 cout << "yDiff: " << yDiff << endl; 339 340 // then we get the correct angle 341 double angle = atan2(yDiff, xDiff); 342 cout << "angle: " << angle << endl; 343 344 // finally we use the angle to determine 345 // how much the player moves 346 // the player will move 50 pixels in the correct direction 347 mapPlayers[id].pos.x += cos(angle)*50; 348 mapPlayers[id].pos.y += sin(angle)*50; 349 cout << "new x: " << mapPlayers[id].pos.x << endl; 350 cout << "new y: " << mapPlayers[id].pos.y << endl; 351 352 serverMsg.type = MSG_TYPE_PLAYER_MOVE; 353 354 memcpy(serverMsg.buffer, &id, 4); 355 memcpy(serverMsg.buffer+4, &mapPlayers[id].pos.x, 4); 356 memcpy(serverMsg.buffer+8, &mapPlayers[id].pos.y, 4); 357 //memcpy(serverMsg.buffer, clientMsg.buffer, 12); 358 359 broadcastResponse = true; 360 } 361 else 362 cout << "Bad terrain detected" << endl; 314 363 } 315 364 else // nned to send back a message indicating failure … … 328 377 } 329 378 379 cout << "Got to the end of the switch" << endl; 380 330 381 return broadcastResponse; 331 382 }
Note:
See TracChangeset
for help on using the changeset viewer.