| [3280] | 1 |  | 
|---|
 | 2 |  | 
|---|
 | 3 | /*  | 
|---|
 | 4 |    orxonox - the future of 3D-vertical-scrollers | 
|---|
 | 5 |  | 
|---|
 | 6 |    Copyright (C) 2004 orx | 
|---|
 | 7 |  | 
|---|
 | 8 |    This program is free software; you can redistribute it and/or modify | 
|---|
 | 9 |    it under the terms of the GNU General Public License as published by | 
|---|
 | 10 |    the Free Software Foundation; either version 2, or (at your option) | 
|---|
 | 11 |    any later version. | 
|---|
 | 12 |  | 
|---|
 | 13 |    ### File Specific: | 
|---|
 | 14 |    main-programmer: Patrick Boenzli | 
|---|
 | 15 |    co-programmer: Christian Meyer | 
|---|
 | 16 | */ | 
|---|
 | 17 |  | 
|---|
 | 18 | #include "player.h" | 
|---|
 | 19 | #include "stdincl.h" | 
|---|
 | 20 | #include "collision.h" | 
|---|
 | 21 | #include "command_node.h" | 
|---|
 | 22 |  | 
|---|
 | 23 | using namespace std; | 
|---|
 | 24 |  | 
|---|
 | 25 |  | 
|---|
 | 26 | Player::Player(bool isFree) : WorldEntity(isFree) | 
|---|
 | 27 | { | 
|---|
 | 28 |  | 
|---|
 | 29 |   obj = new Object ("reaplow.obj"); | 
|---|
 | 30 |   tottime=0.0f; | 
|---|
 | 31 |   numPressed=0; | 
|---|
 | 32 |   movfinishright=movfinishleft=movfinishup=movfinishdown=false; | 
|---|
 | 33 |   angleturn=false; | 
|---|
 | 34 |   | 
|---|
 | 35 |   /* | 
|---|
 | 36 |   objectList = glGenLists(1); | 
|---|
 | 37 |   glNewList (objectList, GL_COMPILE); | 
|---|
 | 38 |  | 
|---|
 | 39 |   glBegin(GL_TRIANGLES); | 
|---|
 | 40 |   glColor3f(1,1,1); | 
|---|
 | 41 |   glVertex3f(0,0,0.5); | 
|---|
 | 42 |   glVertex3f(-0.5,0,-1); | 
|---|
 | 43 |   glVertex3f(0.5,0,-1); | 
|---|
 | 44 |  | 
|---|
 | 45 |   glVertex3f(0,0,0.5); | 
|---|
 | 46 |   glVertex3f(0,0.5,-1); | 
|---|
 | 47 |   glVertex3f(0,-0.5,-1); | 
|---|
 | 48 |   glEnd(); | 
|---|
 | 49 |      | 
|---|
 | 50 |   glBegin(GL_QUADS); | 
|---|
 | 51 |   glColor3f(0,0,1); | 
|---|
 | 52 |   glVertex3f(0.5,0.5,-1); | 
|---|
 | 53 |   glVertex3f(0.5,-0.5,-1); | 
|---|
 | 54 |   glVertex3f(-0.5,-0.5,-1); | 
|---|
 | 55 |   glVertex3f(-0.5,0.5,-1); | 
|---|
 | 56 |   glEnd(); | 
|---|
 | 57 |    | 
|---|
 | 58 |   glEndList (); | 
|---|
 | 59 |   */ | 
|---|
 | 60 | } | 
|---|
 | 61 |  | 
|---|
 | 62 | Player::~Player ()  | 
|---|
 | 63 |  | 
|---|
 | 64 | { | 
|---|
 | 65 | } | 
|---|
 | 66 |  | 
|---|
 | 67 | void Player::post_spawn () | 
|---|
 | 68 | { | 
|---|
 | 69 |   travel_speed = 15.0; | 
|---|
 | 70 |   velocity = Vector(); | 
|---|
 | 71 |   bUp = bDown = bLeft = bRight = bAscend = bDescend = false; | 
|---|
 | 72 |   bFire = false; | 
|---|
 | 73 |   acceleration = 10.0; | 
|---|
 | 74 |   set_collision (new CollisionCluster (1.0, Vector(0,0,0))); | 
|---|
 | 75 | } | 
|---|
 | 76 |  | 
|---|
 | 77 | void Player::tick (float time) | 
|---|
 | 78 | { | 
|---|
 | 79 |         // movement | 
|---|
 | 80 |         move (time); | 
|---|
 | 81 | } | 
|---|
 | 82 |  | 
|---|
 | 83 | void Player::hit (WorldEntity* weapon, Vector loc) | 
|---|
 | 84 | { | 
|---|
 | 85 | } | 
|---|
 | 86 |  | 
|---|
 | 87 | void Player::destroy () | 
|---|
 | 88 | { | 
|---|
 | 89 | } | 
|---|
 | 90 |  | 
|---|
 | 91 | void Player::collide (WorldEntity* other,  Uint32 ownhitflags, Uint32 otherhitflags) | 
|---|
 | 92 | { | 
|---|
 | 93 | } | 
|---|
 | 94 |  | 
|---|
 | 95 | void Player::command (Command* cmd) | 
|---|
 | 96 | { | 
|---|
 | 97 |   //printf("Player|recieved command [%s]\n", cmd->cmd); | 
|---|
 | 98 |   numPressed=cmd->NumPressed; | 
|---|
 | 99 |    | 
|---|
 | 100 |   rottime=cmd->rottime; | 
|---|
 | 101 |   if(numPressed<1){ | 
|---|
 | 102 |         tottime=cmd->tottime; | 
|---|
 | 103 |         angleturn=cmd->angleturn; | 
|---|
 | 104 |   } | 
|---|
 | 105 |    | 
|---|
 | 106 |    | 
|---|
 | 107 |    | 
|---|
 | 108 |   if( !strcmp( cmd->cmd, "up")) bUp = !cmd->bUp; | 
|---|
 | 109 |   else if( !strcmp( cmd->cmd, "down")) bDown = !cmd->bUp; | 
|---|
 | 110 |   else if( !strcmp( cmd->cmd, "left")) bLeft = !cmd->bUp; | 
|---|
 | 111 |   else if( !strcmp( cmd->cmd, "right")) bRight = !cmd->bUp; | 
|---|
 | 112 |   else if( !strcmp( cmd->cmd, "fire")) bFire = !cmd->bUp; | 
|---|
 | 113 | } | 
|---|
 | 114 |  | 
|---|
 | 115 | void Player::draw () | 
|---|
 | 116 | {  | 
|---|
 | 117 |   glMatrixMode(GL_MODELVIEW); | 
|---|
 | 118 |   glLoadIdentity(); | 
|---|
 | 119 |   float matrix[4][4]; | 
|---|
 | 120 |   float a[3]; | 
|---|
 | 121 |   a[0]=.8f; | 
|---|
 | 122 |   a[1]=.8f; | 
|---|
 | 123 |   a[2]=.8f; | 
|---|
 | 124 |   glMaterialfv(GL_FRONT,GL_DIFFUSE,a); | 
|---|
 | 125 |   glTranslatef(get_placement()->r.x,get_placement()->r.y,get_placement()->r.z); | 
|---|
 | 126 |   get_placement()->w.matrix (matrix); | 
|---|
 | 127 |   glMultMatrixf ((float*)matrix); | 
|---|
 | 128 |   | 
|---|
 | 129 |   glMatrixMode (GL_MODELVIEW); | 
|---|
 | 130 |   glRotatef (angle,0,0,1); | 
|---|
 | 131 |   glRotatef (-90, 0,1,0); | 
|---|
 | 132 |    | 
|---|
 | 133 |   obj->draw(); | 
|---|
 | 134 |   //  glCallList (objectList); | 
|---|
 | 135 |  | 
|---|
 | 136 |    | 
|---|
 | 137 |    | 
|---|
 | 138 |   //printf("Player@%f/%f/%f\n", get_placement()->r.x, get_placement()->r.y, get_placement()->r.z); | 
|---|
 | 139 | } | 
|---|
 | 140 |  | 
|---|
 | 141 | void Player::get_lookat (Location* locbuf) | 
|---|
 | 142 | { | 
|---|
 | 143 |         *locbuf = *get_location(); | 
|---|
 | 144 |         //locbuf->dist += 5.0; | 
|---|
 | 145 | } | 
|---|
 | 146 |  | 
|---|
 | 147 | void Player::left_world () | 
|---|
 | 148 | { | 
|---|
 | 149 | } | 
|---|
 | 150 |  | 
|---|
 | 151 | void Player::move (float time) | 
|---|
 | 152 | { | 
|---|
 | 153 |   Vector accel(0.0, 0.0, 0.0); | 
|---|
 | 154 |   /* FIXME: calculating the direction and orthDirection every time_slice is redundant! save it somewhere */ | 
|---|
 | 155 |   Placement *pos = get_placement(); | 
|---|
 | 156 |   /* calculate the direction in which the craft is heading  */ | 
|---|
 | 157 |   Vector direction(0.0, 0.0, 1.0); | 
|---|
 | 158 |   direction = pos->w.apply(direction); | 
|---|
 | 159 |   Vector orthDirection(0.0, 0.0, 1.0); | 
|---|
 | 160 |   orthDirection = orthDirection.cross(direction); | 
|---|
 | 161 |    | 
|---|
 | 162 |   if(rottime<1.0f) | 
|---|
 | 163 |           rottime=rottime+2.5f*time; | 
|---|
 | 164 |   else | 
|---|
 | 165 |           rottime=1.0f; | 
|---|
 | 166 |   if(tottime<1.5f) | 
|---|
 | 167 |           tottime=tottime+4.0f*time; | 
|---|
 | 168 |   else | 
|---|
 | 169 |           tottime=1.5f; | 
|---|
 | 170 |    | 
|---|
 | 171 |   //Langsam zurückdrehen    ->anlgeturn ist für das Zurückdrehen verantwortlich! | 
|---|
 | 172 |   if((angleturn||bLeft&&bRight)&&angle<=0.0f){ | 
|---|
 | 173 |           if(!bLeft) | 
|---|
 | 174 |           angle=angle+rottime*10.0f; | 
|---|
 | 175 |           if(angle>0.0f){ | 
|---|
 | 176 |                    | 
|---|
 | 177 |                   angleturn=false; | 
|---|
 | 178 |                   angle=0.0f;} | 
|---|
 | 179 |           } | 
|---|
 | 180 |    | 
|---|
 | 181 |   if((angleturn||bLeft&&bRight)&&angle>=0.0f){ | 
|---|
 | 182 |           if(!bRight) | 
|---|
 | 183 |           angle=angle-rottime*10.0f; | 
|---|
 | 184 |           if(angle<0.0f){ | 
|---|
 | 185 |                   angleturn=false; | 
|---|
 | 186 |                   angle=0.0f;} | 
|---|
 | 187 |                 } | 
|---|
 | 188 |   //Bewegung lansam abbremsen    ************** | 
|---|
 | 189 |   if(movfinishleft&&!bLeft){ | 
|---|
 | 190 |           accel=accel+(orthDirection*acceleration*(tottimecopy-pow(tottime,1.5f)+.5f)); | 
|---|
 | 191 |           if(tottime>tottimecopy) | 
|---|
 | 192 |                   movfinishleft=false; | 
|---|
 | 193 |   } | 
|---|
 | 194 |   if(movfinishright&&!bRight){ | 
|---|
 | 195 |         accel=accel-(orthDirection*acceleration*(tottimecopy-pow(tottime,1.5f)+.5f)); | 
|---|
 | 196 |         if(tottime>tottimecopy) | 
|---|
 | 197 |                 movfinishright=false; | 
|---|
 | 198 |   } | 
|---|
 | 199 |   if(movfinishup&&!bUp){ | 
|---|
 | 200 |         accel=accel+(direction*acceleration*(tottimecopy-pow(tottime,1.5f)+.5f)); | 
|---|
 | 201 |         if(tottime>tottimecopy) | 
|---|
 | 202 |                 movfinishup=false; | 
|---|
 | 203 |   } | 
|---|
 | 204 |    | 
|---|
 | 205 |   if(movfinishdown&&!bDown){ | 
|---|
 | 206 |         accel=accel-(direction*acceleration*(tottimecopy-pow(tottime,1.5f)+.5f)); | 
|---|
 | 207 |         if(tottime>tottimecopy) | 
|---|
 | 208 |                 movfinishdown=false; | 
|---|
 | 209 |   }   | 
|---|
 | 210 |   //                            ************** | 
|---|
 | 211 |    | 
|---|
 | 212 |   if( bUp) { accel = accel+(direction*acceleration*pow(tottime,2.0f));movfinishup=true;tottimecopy=tottime;} | 
|---|
 | 213 |   if( bDown) { accel = accel-(direction*acceleration*pow(tottime,2.0f));movfinishdown=true;tottimecopy=tottime; } | 
|---|
 | 214 |   if( bLeft ) { accel = accel + (orthDirection*acceleration*pow(tottime,2.0f)); | 
|---|
 | 215 |         if(angle>-20.0f){ | 
|---|
 | 216 |           angle=angle-rottime*20.0f;} | 
|---|
 | 217 |         movfinishleft=true; | 
|---|
 | 218 |         tottimecopy=tottime;} | 
|---|
 | 219 |   if( bRight ) { accel = accel - (orthDirection*acceleration*pow(tottime,2.0f)); | 
|---|
 | 220 |         if(angle<20.0f){ | 
|---|
 | 221 |           angle=angle+rottime*20.0f;} | 
|---|
 | 222 |           movfinishright=true; | 
|---|
 | 223 |           tottimecopy=tottime; | 
|---|
 | 224 |   } | 
|---|
 | 225 |   if( bAscend ) { /* not yet implemented but just: (0,0,1)*acceleration */} | 
|---|
 | 226 |   if( bDescend) {/* FIXME */} | 
|---|
 | 227 |  | 
|---|
 | 228 |   Location* l = get_location(); | 
|---|
 | 229 |    | 
|---|
 | 230 |   // r(t) = r(0) + v(0)*t + 1/2*a*t^2 | 
|---|
 | 231 |   // r = position | 
|---|
 | 232 |   // v = velocity | 
|---|
 | 233 |   // a = acceleration | 
|---|
 | 234 |  | 
|---|
 | 235 |   /* this the base-speed of the player: determines how fast and how the player follows the track*/ | 
|---|
 | 236 |   l->dist = l->dist + travel_speed * time; | 
|---|
 | 237 |  | 
|---|
 | 238 |   /* this updates the player position on the track - user interaction */ | 
|---|
 | 239 |   l->pos = l->pos + (accel*time); | 
|---|
 | 240 | } | 
|---|
 | 241 |  | 
|---|
 | 242 |  | 
|---|
 | 243 |  | 
|---|
 | 244 |  | 
|---|
 | 245 |  | 
|---|
 | 246 |  | 
|---|
 | 247 |  | 
|---|
 | 248 |  | 
|---|
 | 249 |  | 
|---|
 | 250 |  | 
|---|
 | 251 |  | 
|---|
 | 252 |  | 
|---|
 | 253 |  | 
|---|
 | 254 |  | 
|---|
 | 255 |  | 
|---|
 | 256 |  | 
|---|
 | 257 |  | 
|---|
 | 258 |  | 
|---|