Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: animation3D-update, so now one should be able to let the setPos/setDir away, but it does not really work

File size: 6.4 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#include "weapon_manager.h"
29
30#include "state.h"
31#include "vector.h"
32#include "list.h"
33#include "animation3d.h"
34#include "sound_engine.h"
35
36#include "null_parent.h"
37
38#include "fast_factory.h"
39
40
41using namespace std;
42
43CREATE_FACTORY(TestGun);
44
45/**
46 *  standard constructor
47
48   creates a new weapon
49*/
50TestGun::TestGun (WeaponManager* weaponManager, int leftRight)
51  : Weapon(weaponManager)
52{
53  this->init();
54
55
56  this->leftRight = leftRight;
57
58  this->objectComponent1 = new PNode();
59  Animation3D* animation1 = this->getAnimation(WS_SHOOTING, this->objectComponent1);
60  Animation3D* animation2 = this->getAnimation(WS_ACTIVATING, this);
61  Animation3D* animation3 = this->getAnimation(WS_DEACTIVATING, this);
62  //parent->addChild(this->objectComponent1, PNODE_ALL);
63  this->addChild(this->objectComponent1, PNODE_ALL);
64
65  animation1->setInfinity(ANIM_INF_CONSTANT);
66  animation2->setInfinity(ANIM_INF_CONSTANT);
67  animation3->setInfinity(ANIM_INF_CONSTANT);
68
69  if( this->leftRight == W_LEFT)
70  {
71    this->setEmissionPoint(1.0, 0.0, -0.35);
72
73    animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
74    animation1->addKeyFrame(Vector(-0.4, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
75    animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.0, ANIM_LINEAR, ANIM_NULL);
76
77    animation2->addKeyFrame(Vector(0.0, 0.0, -1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
78    animation2->addKeyFrame(Vector(0.0, 0.0, 0.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
79
80    animation3->addKeyFrame(Vector(0.0, 0.0, 0.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
81    animation3->addKeyFrame(Vector(0.0, 0.0, -1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
82  }
83  else if( this->leftRight == W_RIGHT)
84  {
85    this->setEmissionPoint(1.0, 0.0, 0.5);
86
87    this->objectComponent1->setRelCoor(Vector(0,0,0.35));
88    animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
89    animation1->addKeyFrame(Vector(-0.4, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
90    animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.0, ANIM_LINEAR, ANIM_NULL);
91
92    animation2->addKeyFrame(Vector(.0, .0, 1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
93    animation2->addKeyFrame(Vector(.0, .0, .0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
94
95    animation3->addKeyFrame(Vector(.0, .0, 0.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
96    animation3->addKeyFrame(Vector(.0, .0, 1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
97  }
98}
99
100
101TestGun::TestGun(const TiXmlElement* root)
102{
103  this->init();
104  this->loadParams(root);
105}
106
107/**
108 *  standard deconstructor
109*/
110TestGun::~TestGun ()
111{
112  // model will be deleted from WorldEntity-destructor
113}
114
115
116void TestGun::init()
117{
118  this->setClassID(CL_TEST_GUN, "TestGun");
119
120//  this->model = (Model*)ResourceManager::getInstance()->load("models/guns/test_gun.obj", OBJ, RP_CAMPAIGN);
121
122  this->loadModel("models/guns/test_gun.obj");
123
124  this->setStateDuration(WS_SHOOTING, .3);
125  this->setStateDuration(WS_RELOADING, .5);
126  this->setStateDuration(WS_ACTIVATING, .4);
127  this->setStateDuration(WS_DEACTIVATING, .4);
128
129  this->setMaximumEnergy(1000, 100);
130  this->increaseEnergy(1000);
131  //this->minCharge = 2;
132
133  this->setActionSound(WA_SHOOT, "sound/shot1.wav");
134
135  this->setProjectile(CL_TEST_BULLET);
136  this->getProjectileFactory()->prepare(20);
137}
138
139
140void TestGun::loadParams(const TiXmlElement* root)
141{
142
143
144}
145
146
147/**
148 *  this activates the weapon
149
150   This is needed, since there can be more than one weapon on a ship. the
151   activation can be connected with an animation. for example the weapon is
152   been armed out.
153*/
154void TestGun::activate()
155{
156}
157
158
159/**
160 *  this deactivates the weapon
161
162   This is needed, since there can be more than one weapon on a ship. the
163   activation can be connected with an animation. for example the weapon is
164   been armed out.
165*/
166void TestGun::deactivate()
167{
168}
169
170
171/**
172 *  fires the weapon
173
174   this is called from the player.cc, when fire-button is been pushed
175   @todo: the ObjectManager deliveres Projectiles not TestBullets! this should be diffrent
176*/
177void TestGun::fire()
178{
179  Projectile* pj =  dynamic_cast<Projectile*>(this->getProjectileFactory()->resurrect());
180
181  pj->setParent(NullParent::getInstance());
182
183  pj->setVelocity(this->getVelocity() + this->getAbsDir().apply(Vector(1,0,0))*20);
184
185  pj->setAbsCoor(this->getEmissionPoint());
186  pj->setAbsDir(this->getAbsDir());
187  State::getWorldEntityList()->add(pj);
188}
189
190
191/**
192 *  is called, when the weapon gets hit (=collide with something)
193 * @param from which entity it is been hit
194 * @param where it is been hit
195
196   this may not be used, since it would make the game relay complicated when one
197   can destroy the weapons of enemies or vice versa.
198*/
199void TestGun::hit (WorldEntity* entity, Vector* position)
200{}
201
202
203/**
204 *  is called, when the weapon is destroyed
205
206   this is in conjunction with the hit function, so when a weapon is able to get
207   hit, it can also be destoryed.
208*/
209void TestGun::destroy ()
210{}
211
212/**
213 *  this will draw the weapon
214*/
215void TestGun::draw ()
216{
217  /* draw gun body */
218  glMatrixMode(GL_MODELVIEW);
219  glPushMatrix();
220  glTranslatef (this->getAbsCoor ().x,
221                this->getAbsCoor ().y,
222                this->getAbsCoor ().z);
223
224  Vector tmpRot = this->getAbsDir().getSpacialAxis();
225  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
226
227  if( this->leftRight == W_RIGHT)
228    glScalef(1.0, 1.0, -1.0);
229  this->model->draw(1);
230  glPopMatrix();
231
232  /* draw objectComponent1: gun coil - animated stuff */
233  glMatrixMode(GL_MODELVIEW);
234  glPushMatrix();
235  glTranslatef (this->objectComponent1->getAbsCoor ().x,
236                this->objectComponent1->getAbsCoor ().y,
237                this->objectComponent1->getAbsCoor ().z);
238  tmpRot = this->objectComponent1->getAbsDir().getSpacialAxis();
239  glRotatef (this->objectComponent1->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
240  this->model->draw(0);
241  glPopMatrix();
242}
243
Note: See TracBrowser for help on using the repository browser.