Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: no more seg-fault

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 "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
148  //printf( "object ref %p\n", ObjectManager::getInstance()->getFromDeadList(CL_TEST_BULLET));
149
150  //Projectile* pj = new TestBullet(this);
151  pj->setAbsCoor(this->getAbsCoor() + this->projectileOffset);
152  pj->setAbsDir(this->getAbsDir());
153  pj->setFlightDirection(this->getAbsDir());
154  pj->setSpeed(this->getSpeed());
155  this->worldEntities->add(pj);
156  this->localTime = 0;
157 
158  this->animation1->replay();
159}
160
161
162/**
163   \brief is called, when the weapon gets hit (=collide with something)
164   \param from which entity it is been hit
165   \param where it is been hit
166
167   this may not be used, since it would make the game relay complicated when one
168   can destroy the weapons of enemies or vice versa.
169*/
170void TestGun::hit (WorldEntity* entity, Vector* position) 
171{}
172
173
174/**
175   \brief is called, when the weapon is destroyed
176
177   this is in conjunction with the hit function, so when a weapon is able to get
178   hit, it can also be destoryed.
179*/
180void TestGun::destroy () 
181{}
182
183
184/**
185   \brief tick signal for time dependent/driven stuff
186*/
187void TestGun::tick (float time) 
188{
189  this->localTime += time;
190}
191
192
193/**
194   \brief is called, when there is no fire button pressed
195*/
196void TestGun::weaponIdle()
197{}
198
199
200/**
201   \brief this will draw the weapon
202*/
203void TestGun::draw () 
204{
205  /* draw gun body */
206  glMatrixMode(GL_MODELVIEW);
207  glPushMatrix();
208  float matrix[4][4];
209  glTranslatef (this->getAbsCoor ().x, 
210                this->getAbsCoor ().y, 
211                this->getAbsCoor ().z); 
212  this->getAbsDir ().matrix (matrix);
213  glMultMatrixf((float*)matrix);
214  if( this->leftRight == W_RIGHT)
215    glScalef(1.0, 1.0, -1.0);
216  this->model->draw(1);
217  glPopMatrix();
218
219  /* draw objectComponent1: gun coil - animated stuff */
220  glMatrixMode(GL_MODELVIEW);
221  glPushMatrix();
222  glTranslatef (this->objectComponent1->getAbsCoor ().x, 
223                this->objectComponent1->getAbsCoor ().y, 
224                this->objectComponent1->getAbsCoor ().z);
225  this->objectComponent1->getAbsDir ().matrix (matrix);
226  glMultMatrixf((float*)matrix);
227  this->model->draw(0);
228  glPopMatrix();
229}
230
Note: See TracBrowser for help on using the repository browser.