Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/dave/src/player.cc @ 3581

Last change on this file since 3581 was 3402, checked in by dave, 20 years ago

branches/dave/src: Das direkte Zurueckdrehen ist jetzt nicht mehr moeglich! Zuerst muss das Raumschiffchen in die Nulllage zurueckdrehen

File size: 4.9 KB
RevLine 
[1853]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.
[1872]12
13   ### File Specific:
14   main-programmer: Patrick Boenzli
[2190]15   co-programmer: Christian Meyer
[1853]16*/
17
[2036]18#include "player.h"
[2190]19#include "stdincl.h"
20#include "collision.h"
[3365]21#include "importer/model.h"
[2036]22
[1856]23using namespace std;
[1853]24
25
[2190]26Player::Player(bool isFree) : WorldEntity(isFree)
27{
[2811]28
[3401]29  this->model = new Model("../data/models/reaplow.obj",.4f);
[3210]30  /*
[2730]31  objectList = glGenLists(1);
32  glNewList (objectList, GL_COMPILE);
33
34  glBegin(GL_TRIANGLES);
35  glColor3f(1,1,1);
36  glVertex3f(0,0,0.5);
37  glVertex3f(-0.5,0,-1);
38  glVertex3f(0.5,0,-1);
39
40  glVertex3f(0,0,0.5);
41  glVertex3f(0,0.5,-1);
42  glVertex3f(0,-0.5,-1);
43  glEnd();
44   
45  glBegin(GL_QUADS);
46  glColor3f(0,0,1);
47  glVertex3f(0.5,0.5,-1);
48  glVertex3f(0.5,-0.5,-1);
49  glVertex3f(-0.5,-0.5,-1);
50  glVertex3f(-0.5,0.5,-1);
51  glEnd();
52 
53  glEndList ();
[3210]54  */
[1872]55}
[1853]56
[3365]57Player::~Player ()
[3194]58{
[3365]59  delete this->model;
[1896]60}
[1853]61
[3365]62void Player::postSpawn ()
[1858]63{
[3227]64  travelSpeed = 15.0;
[2816]65  velocity = Vector();
66  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
67  bFire = false;
[3401]68  acceleration = 20.0;
[3227]69  setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
[1858]70}
71
[3365]72void Player::tick (float time)
[1872]73{
[3209]74  // movement
[3365]75  this->move (time);
[1872]76}
[1858]77
[3365]78void Player::hit (WorldEntity* weapon, Vector loc)
[1900]79{
80}
81
[3365]82void Player::destroy ()
[1872]83{
84}
85
[3365]86void Player::collide (WorldEntity* other, Uint32 ownhitflags, Uint32 otherhitflags)
[1872]87{
88}
89
[3365]90void Player::command (Command* cmd)
[1872]91{
[2636]92  //printf("Player|recieved command [%s]\n", cmd->cmd);
93  if( !strcmp( cmd->cmd, "up")) bUp = !cmd->bUp;
94  else if( !strcmp( cmd->cmd, "down")) bDown = !cmd->bUp;
95  else if( !strcmp( cmd->cmd, "left")) bLeft = !cmd->bUp;
96  else if( !strcmp( cmd->cmd, "right")) bRight = !cmd->bUp;
97  else if( !strcmp( cmd->cmd, "fire")) bFire = !cmd->bUp;
[1872]98}
99
[3365]100void Player::draw ()
[2640]101{ 
[2551]102  glMatrixMode(GL_MODELVIEW);
103  glLoadIdentity();
104  float matrix[4][4];
[3401]105  //glRotatef(90.0f,1.0f,0.0f,0.0f);
[3370]106  /* translate */
107  glTranslatef (this->getAbsCoor ().x, 
108                this->getAbsCoor ().y, 
109                this->getAbsCoor ().z);
110  /* rotate */
[3365]111  this->getAbsDir ().matrix (matrix);
[3226]112  glMultMatrixf((float*)matrix);
[3401]113  glRotatef(angle,1.0f,0.0f,0.0f);
[3226]114  glMatrixMode(GL_MODELVIEW);
[3365]115  this->model->draw();
[3226]116  // glCallList(objectList);
[2190]117}
[2036]118
[3365]119
120/*PN
[3226]121void Player::getLookat(Location* locbuf)
[1896]122{
[3227]123  *locbuf = *getLocation();
[3210]124  //locbuf->dist += 5.0;
[2190]125}
[3365]126*/
[2036]127
[3365]128void Player::leftWorld ()
[2190]129{
[1872]130}
131
[3365]132void Player::move (float time)
[1858]133{
[3401]134 
[2551]135  Vector accel(0.0, 0.0, 0.0);
[3401]136 
[3227]137  /* FIXME: calculating the direction and orthDirection every timeSlice is redundant! save it somewhere */
[3365]138  //Placement *pos = getPlacement();
139 
[2551]140  /* calculate the direction in which the craft is heading  */
[3365]141  Vector direction (1.0, 0.0, 0.0);
[3401]142   
143 
144 
[3365]145  //direction = this->absDirection.apply (direction);
146  Vector orthDirection (0.0, 0.0, 1.0);
[3401]147 
[3365]148  //orthDirection = orthDirection.cross (direction);
[2551]149
[3401]150  if( bUp) { accel = accel+(direction*acceleration);accelSlipDirection=accel; }
151  if( bDown) { accel = accel-(direction*acceleration);accelSlipDirection=accel; }
[3402]152  if( bLeft ) {if(angle<0) {accel = accel-(orthDirection*acceleration);}rotate(time);accelSlip=accel; }
153  if( bRight ) { if(angle>0){accel = accel+(orthDirection*acceleration);}rotate(time);accelSlip=accel;}
[2551]154  if( bAscend ) { /* not yet implemented but just: (0,0,1)*acceleration */}
[3210]155  if( bDescend) {/* FIXME */} /* \todo up and down player movement */
[3401]156  if((int)angle!=0&&!bLeft&&!bRight){backRotate(time);accelSlip=accelSlip-slip(time,accelSlip);}
157  if(!bUp&&!bDown){accelSlipDirection=accelSlipDirection-slip(time,accelSlipDirection);}
[2551]158
[3365]159  //Location* l = getLocation();
[2551]160 
161  // r(t) = r(0) + v(0)*t + 1/2*a*t^2
162  // r = position
163  // v = velocity
164  // a = acceleration
165
166  /* this the base-speed of the player: determines how fast and how the player follows the track*/
[3365]167  //l->dist = l->dist + travelSpeed * time;
168 
[3401]169  //Vector* shift = new Vector (this->travelSpeed * time, 0, 0);
170  Vector shift(this->travelSpeed*time,0,0);
[3365]171 
[3401]172  this->shiftCoor (&shift);
173 
[2551]174  /* this updates the player position on the track - user interaction */
[3365]175  //l->pos = l->pos + accel*time;
[3401]176 
[3365]177  Vector move = accel * time;
178  this->shiftCoor (&move);
[3401]179 
[1896]180}
[3401]181void Player::rotate(float time){
182    if(bLeft&&angle>-40.0f){
183        angle=angle-time*200.0f;
184               
185    }
186    if(bRight&&angle<40.0f){
187        angle=angle+time*200.0f;
188               
189    }
190}
191
192void Player::backRotate(float time){
193    if(angle<0){
194    angle=angle+3.0f*(exp(angle*.0015f*time));
195   
196   
197    }
198    if(angle>0){
199    angle=angle-3.0f*(exp(-angle*.0015f*time));
200   
201   
202    }
203
204}
205//When the sidewords movement is finished, the ship will still slip untill it stands still
206Vector Player::slip(float time,Vector accel){
207        Vector move= accel*time;
208        this->shiftCoor(&move);
209        return accel*time*3.0f;
210   
211}
212
213
214
215
216
Note: See TracBrowser for help on using the repository browser.