Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: states are now flow'n through

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
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  Animation3D* animation1 = this->getAnimation(WS_SHOOTING, this->objectComponent1);
56  Animation3D* animation2 = this->getAnimation(WS_ACTIVATING, this);
57  Animation3D* animation3 = this->getAnimation(WS_DEACTIVATING, this);
58  //parent->addChild(this->objectComponent1, PNODE_ALL);
59  this->addChild(this->objectComponent1, PNODE_ALL);
60
61  animation1->setInfinity(ANIM_INF_CONSTANT);
62  animation2->setInfinity(ANIM_INF_CONSTANT);
63  animation3->setInfinity(ANIM_INF_CONSTANT);
64  if( this->leftRight == W_LEFT)
65    {
66      this->projectileOffset = Vector(1.0, 0.0, -0.35);
67
68      animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
69      animation1->addKeyFrame(Vector(-0.4, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
70      animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.0, ANIM_LINEAR, ANIM_CONSTANT);
71
72      animation2->addKeyFrame(Vector(-2.6, 0.1, 2.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
73      animation2->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
74
75      animation3->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
76      animation3->addKeyFrame(Vector(-2.6, 0.1, 2.0), Quaternion(), 0.3, 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      animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
84      animation1->addKeyFrame(Vector(-0.4, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
85      animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.0, ANIM_LINEAR, ANIM_CONSTANT);
86
87      animation2->addKeyFrame(Vector(-2.6, 0.1, -2.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
88      animation2->addKeyFrame(Vector(-2.6, 0.1, -3.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
89
90      animation3->addKeyFrame(Vector(-2.6, 0.1, -3.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
91      animation3->addKeyFrame(Vector(-2.6, 0.1, -2.0), Quaternion(), 0.3, 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, .4);
103  this->setStateDuration(WS_RELOADING, 1);
104  //this->setStateDuration(WS_ACTIVATING, .4);
105  //this->setStateDuration(WS_DEACTIVATING, .4);
106
107  this->energy = 100;
108  this->minCharge = 2;
109
110  this->setActionSound(WA_SHOOT, "sound/shot1.wav");
111}
112
113
114/**
115 *  standard deconstructor
116*/
117TestGun::~TestGun ()
118{
119  // model will be deleted from WorldEntity-destructor
120}
121
122
123/**
124 *  this activates the weapon
125
126   This is needed, since there can be more than one weapon on a ship. the
127   activation can be connected with an animation. for example the weapon is
128   been armed out.
129*/
130void TestGun::activate()
131{
132}
133
134
135/**
136 *  this deactivates the weapon
137
138   This is needed, since there can be more than one weapon on a ship. the
139   activation can be connected with an animation. for example the weapon is
140   been armed out.
141*/
142void TestGun::deactivate()
143{
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  Projectile* pj =  new TestBullet(this);//dynamic_cast<Projectile*>(ObjectManager::getInstance()->getFromDeadList(CL_TEST_BULLET & CL_MASK_LOWLEVEL_CLASS));
156//  weaponSource->play();
157
158  pj->setAbsCoor(this->getAbsCoor() + this->projectileOffset);
159  pj->setAbsDir(this->getAbsDir());
160  pj->setVelocity(this->getVelocity());
161  State::getWorldEntityList()->add(pj);
162}
163
164
165/**
166 *  is called, when the weapon gets hit (=collide with something)
167 * @param from which entity it is been hit
168 * @param where it is been hit
169
170   this may not be used, since it would make the game relay complicated when one
171   can destroy the weapons of enemies or vice versa.
172*/
173void TestGun::hit (WorldEntity* entity, Vector* position)
174{}
175
176
177/**
178 *  is called, when the weapon is destroyed
179
180   this is in conjunction with the hit function, so when a weapon is able to get
181   hit, it can also be destoryed.
182*/
183void TestGun::destroy ()
184{}
185
186/**
187 *  this will draw the weapon
188*/
189void TestGun::draw ()
190{
191  /* draw gun body */
192  glMatrixMode(GL_MODELVIEW);
193  glPushMatrix();
194  float matrix[4][4];
195  glTranslatef (this->getAbsCoor ().x,
196                this->getAbsCoor ().y,
197                this->getAbsCoor ().z);
198  this->getAbsDir ().matrix (matrix);
199  glMultMatrixf((float*)matrix);
200  if( this->leftRight == W_RIGHT)
201    glScalef(1.0, 1.0, -1.0);
202  this->model->draw(1);
203  glPopMatrix();
204
205  /* draw objectComponent1: gun coil - animated stuff */
206  glMatrixMode(GL_MODELVIEW);
207  glPushMatrix();
208  glTranslatef (this->objectComponent1->getAbsCoor ().x,
209                this->objectComponent1->getAbsCoor ().y,
210                this->objectComponent1->getAbsCoor ().z);
211  this->objectComponent1->getAbsDir ().matrix (matrix);
212  glMultMatrixf((float*)matrix);
213  this->model->draw(0);
214  glPopMatrix();
215}
216
Note: See TracBrowser for help on using the repository browser.