source: network-game/common/Player.cpp@ 05051c7

Last change on this file since 05051c7 was 05051c7, checked in by dportnoy <dmp1488@…>, 12 years ago

Added support for objects that can be at any pixel on the map, not just one per grid cell. What used to be called objects are now caled structures

  • Property mode set to 100644
File size: 3.5 KB
Line 
1#include "Player.h"
2
3#include <iostream>
4#include <sstream>
5#include <cstring>
6#include <cmath>
7
8using namespace std;
9
10Player::Player()
11{
12 this->id = 0;
13 this->name = "";
14 this->password = "";
15 this->pos.x = this->target.x = 0;
16 this->pos.y = this->target.y = 0;
17 this->timeLastUpdated = 0;
18 this->team = 0; // blue team by default
19 this->hasBlueFlag = false;
20 this->hasRedFlag = false;
21}
22
23Player::Player(const Player& p)
24{
25 this->id = p.id;
26 this->name = p.name;
27 this->password = p.password;
28 this->pos.x = p.pos.x;
29 this->pos.y = p.pos.y;
30 this->target.x = p.target.x;
31 this->target.y = p.target.y;
32 this->addr = p.addr;
33 this->team = 0; // blue team by default
34 this->hasBlueFlag = false;
35 this->hasRedFlag = false;
36}
37
38Player::Player(string name, string password)
39{
40 this->id = 0;
41 this->name = name;
42 this->password = password;
43 this->pos.x = this->target.x = 200;
44 this->pos.y = this->target.y = 200;
45 this->team = 0; // blue team by default
46 this->hasBlueFlag = false;
47 this->hasRedFlag = false;
48}
49
50Player::~Player()
51{
52}
53
54void Player::serialize(char* buffer)
55{
56 memcpy(buffer, &this->id, 4);
57 memcpy(buffer+4, &this->pos.x, 4);
58 memcpy(buffer+8, &this->pos.y, 4);
59 memcpy(buffer+12, &this->target.x, 4);
60 memcpy(buffer+16, &this->target.y, 4);
61 memcpy(buffer+20, &this->team, 4);
62 memcpy(buffer+24, &this->hasBlueFlag, 1);
63 memcpy(buffer+25, &this->hasRedFlag, 1);
64 strcpy(buffer+26, this->name.c_str());
65}
66
67void Player::deserialize(char* buffer)
68{
69 memcpy(&this->id, buffer, 4);
70 memcpy(&this->pos.x, buffer+4, 4);
71 memcpy(&this->pos.y, buffer+8, 4);
72 memcpy(&this->target.x, buffer+12, 4);
73 memcpy(&this->target.y, buffer+16, 4);
74 memcpy(&this->team, buffer+20, 4);
75 memcpy(&this->hasBlueFlag, buffer+24, 1);
76 memcpy(&this->hasRedFlag, buffer+25, 1);
77 this->name.assign(buffer+26);
78}
79
80void Player::setId(int id)
81{
82 this->id = id;
83}
84
85void Player::setAddr(sockaddr_in addr)
86{
87 this->addr = addr;
88}
89
90bool Player::move(WorldMap *map) {
91 int speed = 100; // pixels per second
92 unsigned long long curTime = getCurrentMillis();
93 bool moveCanceled = false;
94
95 // if we're at our target, don't move
96 if (pos.x != target.x || pos.y != target.y) {
97 float pixels = speed * (curTime-timeLastUpdated) / 1000.0;
98 double angle = atan2(target.y-pos.y, target.x-pos.x);
99 float dist = sqrt(pow(target.x-pos.x, 2) + pow(target.y-pos.y, 2));
100 FLOAT_POSITION newPos;
101
102 if (dist <= pixels) {
103 newPos.x = target.x;
104 newPos.y = target.y;
105 }else {
106 newPos.x = pos.x + cos(angle)*pixels;
107 newPos.y = pos.y + sin(angle)*pixels;
108 }
109
110 switch(map->getElement(newPos.x/25, newPos.y/25)) {
111 case WorldMap::TERRAIN_NONE:
112 case WorldMap::TERRAIN_OCEAN:
113 case WorldMap::TERRAIN_ROCK:
114 target.x = pos.x;
115 target.y = pos.y;
116 moveCanceled = true;
117 break;
118 default: // if there are no obstacles
119 pos.x = newPos.x;
120 pos.y = newPos.y;
121 break;
122 }
123
124 // using moveCanceled in a hacky way just to indicate that the server
125 // has updated some player info. Should change the variable name
126 switch(map->getStructure(newPos.x/25, newPos.y/25)) {
127 case WorldMap::STRUCTURE_BLUE_FLAG:
128 hasBlueFlag = true;
129 moveCanceled = true;
130 break;
131 case WorldMap::STRUCTURE_RED_FLAG:
132 hasRedFlag = true;
133 moveCanceled = true;
134 break;
135 }
136 }
137
138 timeLastUpdated = curTime;
139
140 return !moveCanceled;
141}
Note: See TracBrowser for help on using the repository browser.