Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 4597 was 4597, checked in by bensch, 19 years ago

orxonox/trunk: setClassID implemented in all files

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