Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/world_entities/test_gun.cc @ 3986

Last change on this file since 3986 was 3986, checked in by patrick, 19 years ago

orxonox/trunk: fixed two major bugs in the animation3d framework (addKeyFrame, tick issues), added shoot animation again. one of both animation is still placed at the wrong place, since the weapons are not symmetrical

File size: 6.3 KB
Line 
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:
16
17
18   \todo: direction in which the projectile flights
19   \todo: a target to set/hit
20*/
21
22
23#include "test_gun.h"
24
25#include "stdincl.h"
26#include "world_entity.h"
27#include "model.h"
28#include "test_bullet.h"
29
30#include "vector.h"
31#include "list.h"
32#include "animation3d.h"
33
34using namespace std;
35
36
37/**
38   \brief standard constructor
39
40   creates a new weapon
41*/
42TestGun::TestGun (PNode* parent, const Vector& coordinate, const Quaternion& direction, int leftRight) 
43  :  Weapon (parent, coordinate, direction) 
44{
45  this->model = (Model*)ResourceManager::getInstance()->load("models/test_gun.obj", OBJ, RP_CAMPAIGN);
46  this->idleTime = 0.2f;
47  this->leftRight = leftRight;
48
49  this->objectComponent1 = new PNode();
50  this->animation1 = new Animation3D(this->objectComponent1);
51  //this->animation2 = new Animation3D(this);
52  //parent->addChild(this->objectComponent1, PNODE_ALL);
53  this->addChild(this->objectComponent1, PNODE_ALL);
54
55  this->animation1->setInfinity(ANIM_INF_CONSTANT);
56  //this->animation2->setInfinity(ANIM_INF_CONSTANT);
57  if( this->leftRight == W_LEFT)
58    {
59      this->projectileOffset = Vector(1.0, 0.0, -0.35);
60
61      //this->animation1->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.1, ANIM_LINEAR);
62      //this->animation1->addKeyFrame(Vector(-3.0, 0.1, 3.0), Quaternion(), 0.5, ANIM_LINEAR);
63      //this->animation1->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.1, ANIM_LINEAR);
64
65      this->animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
66      this->animation1->addKeyFrame(Vector(-0.4, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
67      this->animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.0, ANIM_LINEAR, ANIM_CONSTANT);
68
69
70      //this->animation2->addKeyFrame(Vector(0, 0, 0.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_LINEAR);
71      //this->animation2->addKeyFrame(Vector(0, 0, 2.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_LINEAR);
72      //this->animation2->addKeyFrame(Vector(0, 0, 0.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_LINEAR);
73    }
74  else if( this->leftRight == W_RIGHT)
75    {
76      this->projectileOffset = Vector(1.0, 0.0, 0.5);
77
78      //this->animation1->addKeyFrame(Vector(-2.6, 0.1, -2.5), Quaternion(), 0.1, ANIM_LINEAR);
79      //this->animation1->addKeyFrame(Vector(-3.0, 0.1, -2.5), Quaternion(), 0.5, ANIM_LINEAR);
80      //this->animation1->addKeyFrame(Vector(-2.6, 0.1, -2.5), Quaternion(), 0.1, ANIM_LINEAR);
81
82      this->animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
83      this->animation1->addKeyFrame(Vector(-0.4, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
84      this->animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.0, ANIM_LINEAR, ANIM_CONSTANT);
85
86
87      //this->animation2->addKeyFrame(Vector(0, 0, 0.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_LINEAR);
88      //this->animation2->addKeyFrame(Vector(0, 0, 2.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_LINEAR);
89      //this->animation2->addKeyFrame(Vector(0, 0, 0.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_LINEAR);
90    }
91
92}
93
94
95/**
96   \brief standard deconstructor
97*/
98TestGun::~TestGun () 
99{
100  // model will be deleted from WorldEntity-destructor
101}
102
103
104/**
105   \brief this activates the weapon
106
107   This is needed, since there can be more than one weapon on a ship. the
108   activation can be connected with an animation. for example the weapon is
109   been armed out.
110*/
111void TestGun::activate()
112{
113  printf("ACTIVATE \n");
114  //this->animation2->replay();
115}
116
117
118/**
119   \brief this deactivates the weapon
120
121   This is needed, since there can be more than one weapon on a ship. the
122   activation can be connected with an animation. for example the weapon is
123   been armed out.
124*/
125void TestGun::deactivate()
126{
127  printf("DEACTIVATE\n");
128}
129
130
131/**
132   \brief fires the weapon
133   
134   this is called from the player.cc, when fire-button is been pushed
135*/
136void TestGun::fire()
137{
138  if( !this->hasWeaponIdleTimeElapsed())
139    {
140      this->weaponIdle();
141      return;
142    }
143
144  Projectile* pj = new TestBullet(this);
145  pj->setAbsCoor(this->getAbsCoor() + this->projectileOffset);
146  pj->setAbsDir(this->getAbsDir());
147  pj->setFlightDirection(this->getAbsDir());
148  pj->setSpeed(this->getSpeed());
149  this->worldEntities->add(pj);
150  this->localTime = 0;
151 
152  this->animation1->replay();
153}
154
155
156/**
157   \brief is called, when the weapon gets hit (=collide with something)
158   \param from which entity it is been hit
159   \param where it is been hit
160
161   this may not be used, since it would make the game relay complicated when one
162   can destroy the weapons of enemies or vice versa.
163*/
164void TestGun::hit (WorldEntity* entity, Vector* position) 
165{}
166
167
168/**
169   \brief is called, when the weapon is destroyed
170
171   this is in conjunction with the hit function, so when a weapon is able to get
172   hit, it can also be destoryed.
173*/
174void TestGun::destroy () 
175{}
176
177
178/**
179   \brief tick signal for time dependent/driven stuff
180*/
181void TestGun::tick (float time) 
182{
183  this->localTime += time;
184}
185
186
187/**
188   \brief is called, when there is no fire button pressed
189*/
190void TestGun::weaponIdle()
191{}
192
193
194/**
195   \brief this will draw the weapon
196*/
197void TestGun::draw () 
198{
199  //this->getRelCoor().debug();
200  //this->getAbsCoor().debug();
201
202  this->objectComponent1->getRelCoor().debug();
203  //this->objectComponent1->getAbsCoor().debug();
204
205  /* draw gun body */
206  glMatrixMode(GL_MODELVIEW);
207  glPushMatrix();
208  float matrix[4][4];
209  glTranslatef (this->getAbsCoor ().x, 
210                this->getAbsCoor ().y, 
211                this->getAbsCoor ().z); 
212  this->getAbsDir ().matrix (matrix);
213  glMultMatrixf((float*)matrix);
214  if( this->leftRight == W_RIGHT)
215    glScalef(1.0, 1.0, -1.0);
216  this->model->draw(1);
217  glPopMatrix();
218
219  /* draw objectComponent1: gun coil - animated stuff */
220  glMatrixMode(GL_MODELVIEW);
221  glPushMatrix();
222  glTranslatef (this->objectComponent1->getAbsCoor ().x, 
223                this->objectComponent1->getAbsCoor ().y, 
224                this->objectComponent1->getAbsCoor ().z);
225  this->objectComponent1->getAbsDir ().matrix (matrix);
226  glMultMatrixf((float*)matrix);
227  this->model->draw(0);
228  glPopMatrix();
229}
230
Note: See TracBrowser for help on using the repository browser.