Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/core/world.cc @ 1902

Last change on this file since 1902 was 1902, checked in by patrick, 20 years ago

orxonox/trunk: collision npc-player added

File size: 6.7 KB
RevLine 
[1853]1
2/*
3   orxonox - the future of 3D-vertical-scrollers
4
5   Copyright (C) 2004 orx
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
[1855]11
12   ### File Specific:
13   main-programmer: Patrick Boenzli
14   co-programmer:
[1853]15*/
16
17
18#include "world.h"
19
[1856]20#include <iostream>
[1853]21
[1856]22using namespace std;
[1853]23
24
[1858]25/**
26   \brief Create a new World
27   
28   This creates a new empty world!
29*/
[1853]30World::World () {
[1855]31  lastPlayer = null;
[1858]32  lastNPC = null;
[1883]33  lastEnv = null;
[1853]34}
35
36
37World::~World () {}
38
39
[1855]40/**
41   \brief Add Player
42   \param player A reference to the new player object
43   
44   Add a new Player to the game. Player has to be initialised previously
45*/
46bool World::addPlayer(Player* player) 
47{
48  playerList* listMember = new playerList;
49  listMember->player = player;
[1856]50  if ( lastPlayer != null ) 
51    {
52      listMember->number = lastPlayer->number + 1;
53      listMember->next = lastPlayer;
54    }
55  else 
56    {
57      listMember->number = 0;
58      listMember->next = null;
59    }
[1855]60  lastPlayer = listMember;
61}
62
63
[1858]64/**
65   \brief Remove Player
66   \param player A reference to the new npc object
67   
68   Remove a new Player to the game.
69*/
70bool World::removePlayer(Player* player) {
71  cout << "World::removeNPC not implemented yet" << endl;
72}
[1855]73
[1872]74Player* World::getLocalPlayer() 
75{
76  return localPlayer;
77}
[1858]78
[1872]79
[1855]80/**
[1858]81   \brief Add Non-Player-Character
82   \param player A reference to the new npc object
83   
84   Add a new Non-Player-Character to the game. Player has to be initialised previously
85*/
86bool World::addNPC(NPC* npc) 
87{
88  npcList* listMember = new npcList;
89  listMember->npc = npc;
90  if ( lastNPC != null ) 
91    {
92      listMember->number = lastNPC->number + 1;
93      listMember->next = lastNPC;
94    }
95  else 
96    {
97      listMember->number = 0;
98      listMember->next = null;
99    }
100  lastNPC = listMember;
101}
102
103
104/**
[1883]105   \brief Add environmental object
106   \param player A reference to the new env object
107   
108   Add a new Environment to the world. Env has to be initialised before.
109*/
110bool World::addEnv(Environment* env) 
111{
112  envList* listMember = new envList;
113  listMember->env = env;
114  if ( lastEnv != null ) 
115    {
116      listMember->number = lastEnv->number + 1;
117      listMember->next = lastEnv;
118    }
119  else 
120    {
121      listMember->number = 0;
122      listMember->next = null;
123    }
124  lastEnv = listMember;
125}
126
127
[1896]128
129
[1899]130
[1896]131/**
132   \brief Remove Non-Player Character
[1858]133   \param player A reference to the new npc object
134   
135   Remove a new Non-Player-Character to the game.
136*/
137bool World::removeNPC(NPC* npc) {
138  cout << "World::removeNPC not implemented yet" << endl;
139}
140
141
142
143/**
144   \brief Draws the World and all Objects contained
145   
[1879]146   Calls the draw function of all: Objects, Players, Environement. This is the core of all graphics here.
[1858]147*/
148void World::drawWorld(void) 
149{
[1879]150  /* first draw all players */
[1858]151  playerList* tmpPlayer = lastPlayer;
152  Player* player = tmpPlayer->player;
153  while( tmpPlayer != null ) 
154    {
155      (*tmpPlayer->player).drawPlayer();
156      tmpPlayer = tmpPlayer->next;
157    }
[1879]158  /* second draw all npcs */
[1858]159  npcList* tmpNPC = lastNPC;
160  while( tmpNPC != null )
161    {
162      (*tmpNPC->npc).drawNPC();
163      tmpNPC = tmpNPC->next;
164    }
[1879]165  /* now draw the rest of the world: environement */
[1883]166  envList* tmpEnv = lastEnv;
167  while( tmpEnv != null )
168    {
169      (*tmpEnv->env).drawEnvironment();
170      tmpEnv = tmpEnv->next;
171    }
[1899]172
[1883]173 
174  glColor3f(0.0, 1.0, 0.0);
175 
176  glBegin(GL_LINES);
177  for (int x = 0; x < 60; x += 2)
178    {
179      for (int y = 0; y < 60; y += 2)
180        {
181          glVertex3f((float)(x - 30), (float)(y - 30), surface[x][y]);
182          glVertex3f((float)(x - 30), (float)(y - 28), surface[x][y+2]);
183        }
184    }
185  glEnd();
186 
187 
188  glBegin(GL_LINES);
189  for (int y = 0; y < 60; y += 2)
190    {
191      for (int x = 0; x < 60; x += 2)
192        {
193          glVertex3f((float)(x - 30), (float)(y - 30), surface[x][y]);
194          glVertex3f((float)(x - 28), (float)(y - 30), surface[x+2][y]);
195        }
196    }
197  glEnd();
198 
199}
[1879]200
201
[1883]202void World::initEnvironement()
203{
[1879]204
[1883]205 for (int x = 0; x < 60; x += 2)
206    {
207      for (int y = 0; y < 60; y += 2)
208        {
209          surface[x][y] = 0;
210        }
211    }
[1858]212}
213
214
215/**
216   \brief Updates the world and all its objects
217   
218   Calculates the new state of the world. User-input and AI of
219   the enemies are accounted for.
220*/
221void World::updateWorld(void) 
222{
223 
224
225}
226
227
[1899]228/* collision detection */
229/* fix: bad efficency: stupid brute force */
[1858]230
[1899]231void World::detectCollision() 
232{
[1900]233  //cout << "World::detectCollision" << endl;
[1899]234  float xOff, yOff, zOff, radius;
235  npcList* tmpNPC;
236
237  //cout << "World::detectCollsions" << endl;
238  /* first: check if any player's shoots trigger a collision */
239  playerList* tmpPlayer = lastPlayer;
240  Player* player = tmpPlayer->player;
241  while( tmpPlayer != null ) 
242    {
243      tmpNPC = lastNPC;
244      while( tmpNPC != null )
245        {
246          radius = tmpNPC->npc->collisionRadius;
247          ShootLaser::shoot* shoota = tmpPlayer->player->shootLaser->lastShoot;
248          while( shoota != null )
249            {
250              xOff = shoota->xCor - tmpNPC->npc->xCor;
251              yOff = shoota->yCor - tmpNPC->npc->yCor;
252              zOff = shoota->zCor - tmpNPC->npc->zCor;
253              if ( sqrt(xOff*xOff + yOff*yOff + zOff*zOff) < radius )
254                cout << "COLLISION " << endl;
255              shoota = shoota->next;
256            }
257          tmpNPC = tmpNPC->next;
258        }
259     
260      tmpPlayer = tmpPlayer->next;
261    }
262
263  /* second: check if any player hits an enemy */
264
[1902]265 
[1900]266  tmpPlayer = lastPlayer;
267  while( tmpPlayer != null ) 
268    {
269      tmpNPC = lastNPC;
270      while( tmpNPC != null )
271        {
272          radius = tmpNPC->npc->collisionRadius + tmpPlayer->player->collisionRadius;
273          xOff = tmpPlayer->player->xCor - tmpNPC->npc->xCor;
274          yOff = tmpPlayer->player->yCor - tmpNPC->npc->yCor;
275          zOff = tmpPlayer->player->zCor - tmpNPC->npc->zCor;
276          if ( sqrt(xOff*xOff + yOff*yOff + zOff*zOff) < radius )
277            cout << "COLLISION " << endl;
278         
279          tmpNPC = tmpNPC->next;
280        }
281     
282      tmpPlayer = tmpPlayer->next;
283    }
284 
[1902]285 
[1900]286
[1899]287  /* third: check if any enemy shoots a player */
288
289  //cout << "World::detectCollisions end" << endl;
290}
291
292
293
[1858]294/**
[1855]295   \brief Routine for testing purposes.
296   
297   testing, testing, testing...
298*/
[1858]299void World::testThaTest(void) 
[1855]300{
[1856]301  cout << "World::testThaTest() called" << endl;
302  /* test addPlayer */
303  cout << "addPlayer test..." << endl;
304  playerList* pl = lastPlayer;
305  while ( pl != null )
306    {
307      cout << "player " << pl->number << " was found" << endl;
308      pl = pl->next;
309    }
[1855]310
[1858]311  /* test addNPC */
312  cout << "addNPC test..." << endl;
313  npcList* nl = lastNPC;
314  while ( nl != null )
315    {
316      cout << "npc " << nl->number << " was found" << endl;
317      nl = nl->next;
318    }
319
[1883]320
321  /* test addEnv */
322  cout << "addEnv test..." << endl;
323  envList* en = lastEnv;
324  while ( en != null )
325    {
326      cout << "env " << en->number << " was found" << endl;
327      en = en->next;
328    }
329
[1858]330  /* test drawWorld() */
[1855]331}
Note: See TracBrowser for help on using the repository browser.