Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: remake of the Projectile and TestBullet

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