Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: reimplemented the shoot speed function

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