The Game Engine  1
Player.cpp
Go to the documentation of this file.
1 #include "Player.h"
2 #include "Game.h"
3 
4 Player::Player(string filename):useJoystick(false), mKeyMaps(), mJoyButtonMaps(), mJoyStickMaps()
5 {
8  //*
10 
11  //set up default hotkeys
12  vector<SDLKey> keys = vector<SDLKey>();
13  vector<JoyButton> joyButtons = vector<JoyButton>();
14  vector<JoyStick> joySticks = vector<JoyStick>();
15  //movement
16  if(!useJoystick){
17  keys.push_back(SDLK_w);
18  mKeyMaps[MoveUp] = keys; keys.clear();
19  keys.push_back(SDLK_s);
20  mKeyMaps[MoveDown] = keys; keys.clear();
21  keys.push_back(SDLK_a);
22  mKeyMaps[MoveLeft] = keys; keys.clear();
23  keys.push_back(SDLK_d);
24  mKeyMaps[MoveRight] = keys; keys.clear();
25  }
26  else{
27  joySticks.push_back(JoyLeft);//joystick JoyLeft is left
28  mJoyStickMaps[MoveUp] = joySticks; joySticks.clear();
29  joySticks.push_back(JoyLeft);//joystick JoyLeft is left
30  mJoyStickMaps[MoveDown] = joySticks; joySticks.clear();
31  joySticks.push_back(JoyLeft);//joystick JoyLeft is left
32  mJoyStickMaps[MoveLeft] = joySticks; joySticks.clear();
33  joySticks.push_back(JoyLeft);//joystick JoyLeft is left
34  mJoyStickMaps[MoveRight] = joySticks; joySticks.clear();
35  }
36  //cursor
37  if(!useJoystick){
38  keys.push_back(SDLK_UP);
39  mKeyMaps[CursorUp] = keys; keys.clear();
40  keys.push_back(SDLK_DOWN);
41  mKeyMaps[CursorDown] = keys; keys.clear();
42  keys.push_back(SDLK_LEFT);
43  mKeyMaps[CursorLeft] = keys; keys.clear();
44  keys.push_back(SDLK_RIGHT);
45  mKeyMaps[CursorRight] = keys; keys.clear();
46  }
47  else{
48  joySticks.push_back(JoyRight);//joystick JoyRight is left
49  mJoyStickMaps[CursorUp] = joySticks; joySticks.clear();
50  joySticks.push_back(JoyRight);//joystick JoyRight is left
51  mJoyStickMaps[CursorDown] = joySticks; joySticks.clear();
52  joySticks.push_back(JoyRight);//joystick JoyRight is left
53  mJoyStickMaps[CursorLeft] = joySticks; joySticks.clear();
54  joySticks.push_back(JoyRight);//joystick JoyRight is left
55  mJoyStickMaps[CursorRight] = joySticks; joySticks.clear();
56  }
57  //yes/no
58  if(!useJoystick){
59  keys.push_back(SDLK_RETURN);
60  keys.push_back(SDLK_j);
61  mKeyMaps[Accept] = keys; keys.clear();
62  keys.push_back(SDLK_ESCAPE);
63  keys.push_back(SDLK_k);
64  mKeyMaps[Deny] = keys; keys.clear();
65  }
66  else{
67  joyButtons.push_back(A);
68  joyButtons.push_back(Start);
69  mJoyButtonMaps[Accept] = joyButtons; joyButtons.clear();
70  joyButtons.push_back(B);
71 
72  mJoyButtonMaps[Deny] = joyButtons; joyButtons.clear();
73  }
74  //esc
75  if(!useJoystick){
76  keys.push_back(SDLK_ESCAPE);
77  keys.push_back(SDLK_k);
78  mKeyMaps[Esc] = keys; keys.clear();
79  }
80  else{
81  joyButtons.push_back(Select);
82  mJoyButtonMaps[OpenMenu] = joyButtons; joyButtons.clear();
83  }
84  //menu
85  if(!useJoystick){
86  keys.push_back(SDLK_RETURN);
87  keys.push_back(SDLK_ESCAPE);
88  mKeyMaps[OpenMenu] = keys; keys.clear();
89  }
90  else{
91  }
92  //hotkeys
93  if(!useJoystick){
94  keys.push_back(SDLK_j);
95  mKeyMaps[Action] = keys; keys.clear();
96  keys.push_back(SDLK_k);
97  mKeyMaps[HotKey1] = keys; keys.clear();
98  keys.push_back(SDLK_l);
99  mKeyMaps[HotKey2] = keys; keys.clear();
100  keys.push_back(SDLK_SEMICOLON);
101  mKeyMaps[HotKey3] = keys; keys.clear();
102  keys.push_back(SDLK_1);
103  mKeyMaps[HotKey4] = keys; keys.clear();
104  keys.push_back(SDLK_2);
105  mKeyMaps[HotKey5] = keys; keys.clear();
106  keys.push_back(SDLK_3);
107  mKeyMaps[HotKey6] = keys; keys.clear();
108  keys.push_back(SDLK_4);
109  mKeyMaps[HotKey7] = keys; keys.clear();
110  keys.push_back(SDLK_5);
111  mKeyMaps[HotKey8] = keys; keys.clear();
112  keys.push_back(SDLK_6);
113  mKeyMaps[HotKey9] = keys; keys.clear();
114  keys.push_back(SDLK_7);
115  mKeyMaps[HotKey10] = keys; keys.clear();
116  keys.push_back(SDLK_8);
117  mKeyMaps[HotKey11] = keys; keys.clear();
118  }
119  else{
120  }
121  //*/
122 }
123 
124 Player::Player(map<Player::InputAction, vector<SDLKey>> mKeyMaps)
125 {
126  mKeyMaps = mKeyMaps;
127 }
128 
129 Player::Player(map<Player::InputAction, vector<JoyStick>> joyMaps, map<Player::InputAction, vector<JoyButton>> buttonMaps, int moveJoy )
130 {
131  mJoyButtonMaps = buttonMaps;
132  mJoyStickMaps = joyMaps;
133 }
134 
136  mObjects.push_back(wo);
137 }
138 
140  foritr(obj, mObjects){
141  if(*obj==wo){
142  mObjects.erase(obj);
143  }
144  }
145 }
146 
147 void Player::RemoveControl(string woName){
148  foritr(obj, mObjects){
149  if((*obj)->getName()==woName){
150  mObjects.erase(obj);
151  }
152  }
153 }
154 
156 {
157  for(unsigned int i = 0, size = mObjects.size(); i < size; i++){
158  if (mObjects[i]->getName() == name){
159  return mObjects[i];
160  }
161  }
162 
163  return NULL;
164 }
165 
167 {
168  return index < mObjects.size() ? mObjects[index] : NULL;
169 }
170 
171 vector<WorldObject*> Player::getObjects()
172 {
173  return mObjects;
174 }
175 
176 vector<WorldObject*> Player::getObjects(string name, int count)
177 {
178  vector<WorldObject*> objects = vector<WorldObject*>();
179 
180  for(unsigned int i=0; i < mObjects.size(); i++) {
181  if(count > 0 && objects.size() == count)
182  return objects;
183  if(mObjects[i]->getName() == name)
184  objects.push_back(mObjects[i]);
185  }
186 
187  return objects; //if a valid object wasn't found, return empty
188 }
189 
191 {
192  Point2D sum;
193 
194  for (unsigned int i = 0, size = mObjects.size(); i < size; i++){
195  sum += mObjects[i]->getPosition();
196  }
197 
198  return ( sum / mObjects.size() );
199 }
200 
202 {
203  WorldObject* object = getObject(name);
204 
205  return object->getPosition();
206 }
207 
209 {
210  Point2D sum;
211 
212  for (unsigned int i = 0; i < indices.size(); i++){
213  sum += mObjects[indices[i]]->getPosition();
214  }
215 
216  return ( sum / indices.size() );
217 }
218 
219 Point2D Player::getAveragePosition(vector<string> names)
220 {
221  Point2D sum;
222  int count = 0;
223 
224  for (unsigned int i = 0; i < names.size(); i++){
225  vector<WorldObject*> objects = getObjects(names[i]);
226  for (unsigned int j = 0; j < objects.size(); j++){
227  sum += objects[j]->getPosition();
228  count++;
229  }
230  }
231 
232  return ( sum / count);
233 }
234 
235 void Player::setPosition(double x, double y)
236 {
237  Point2D centroid = getAveragePosition();
238  double dx, dy;
239 
240  dx = x - centroid.x;
241  dy = y - centroid.y;
242 
243  move(dx, dy);
244 }
245 
247 {
248  Point2D centroid = getAveragePosition();
249  double dx, dy;
250 
251  dx = pos.x - centroid.x;
252  dy = pos.y - centroid.y;
253 
254  move(dx, dy);
255 }
256 
257 void Player::move(double dx, double dy)
258 {
259  for(unsigned int i = 0, size = mObjects.size(); i < size; i++){
260  mObjects[i]->move(dx, dy);
261  }
262 }
263 
264 void Player::move(Point2D direction)
265 {
266  for(unsigned int i = 0, size = mObjects.size(); i < size; i++){
267  mObjects[i]->move(direction);
268  }
269 }
270 
272 {
274  for(unsigned int i = 0, size = mObjects.size(); i < size; i++){
275  mObjects[i]->moveTowards(point);
276  }
277 }
278 
280 {
281  for (unsigned int i = 0, size = mObjects.size(); i < size; i++){
282  mObjects[i]->setTransparency(f);
283  }
284 }
285 
287 {
288  for (unsigned int i = 0, size = mObjects.size(); i < size; i++){
289  float f = mObjects[i]->getTransparency() + df;
290 
291  mObjects[i]->setTransparency(f);
292  }
293 }
294 
296 {
297  Level* l = Game::game()->getCurrentLevel();
298  for(unsigned int i=0, end = l->getNumPlayers(); i < end; ++i){
299  Player* p = l->getPlayer(i);
300  if(p->pressed(act))
301  return true;
302  }
303  return false;
304 }
305 
307 {
308  Level* l = Game::game()->getCurrentLevel();
309  for(unsigned int i=0, end = l->getNumPlayers(); i < end; ++i){
310  Player* p = l->getPlayer(i);
311  if(p->triggered(act,ms))
312  return true;
313  }
314  return false;
315 }
316 
318 {
319  Point2D dir;
320  Level* l = Game::game()->getCurrentLevel();
321  for(unsigned int i=0, end = l->getNumPlayers(); i < end; ++i){
322  Player* p = l->getPlayer(i);
323  dir+= p->getMovement(act);
324  }
325  return dir;
326 }
327 
329 {
330  bool retval = false;
331  if(useJoystick){
332  vector<JoyButton> vals = mJoyButtonMaps[act];
333  for(unsigned int i=0, end = vals.size(); i<end;++i){
334  retval = retval || mInput->triggered(vals[i]);
335  }
336  }
337  else{
338  vector<SDLKey> vals = mKeyMaps[act];
339  for(unsigned int i=0, end = vals.size(); i<end;++i){
340  retval = retval || mInput->triggered(vals[i]);
341  }
342  }
343  return retval;
344 }
345 
347 {
348  bool retval = false;
349  if(useJoystick){
350  vector<JoyButton> vals = mJoyButtonMaps[act];
352  for(unsigned int i=0, end = vals.size(); i<end;++i){
353  retval = retval || mInput->doubleTapped(vals[i]);
354  }
355  }
356  else{
357  vector<SDLKey> vals = mKeyMaps[act];
358  for(unsigned int i=0, end = vals.size(); i<end;++i){
359  retval = retval || mInput->doubleTapped(vals[i]);
360  }
361  }
362  return retval;
363 }
364 
366 {
367  if(useJoystick){
369  }
370  else{
371  return act==Move?
372  Point2D(
373  pressed(MoveRight)?1:
374  pressed(MoveLeft)?-1:0,
375  pressed(MoveUp)?-1:
376  pressed(MoveDown)?1:0):
377  act==Cursor?
378  Point2D(
379  pressed(CursorRight)?1:
380  pressed(CursorLeft)?-1:0,
381  pressed(CursorUp)?-1:
382  pressed(CursorDown)?1:0):
384  }
385 }
386 
388 {
389  bool retval = false;
390  if(useJoystick){
391  vector<JoyButton> vals = mJoyButtonMaps[act];
392  for(int i=0,end=vals.size(); i<end;++i){
393  retval = retval || mInput->pressed(vals[i]);
394  }
395  }
396  else{
397  vector<SDLKey> vals = mKeyMaps[act];
398  for(int i=0,end=vals.size(); i<end;++i){
399  retval = retval || mInput->pressed(vals[i]);
400  }
401  }
402  return retval;
403 }
404