Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/OrxoBlox_FS19/src/modules/weapons/projectiles/BallProjectile.cc @ 12387

Last change on this file since 12387 was 12387, checked in by pomselj, 5 years ago

new, smaller CollisionShape for Projectiles

File size: 9.3 KB
RevLine 
[12281]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file ParticleProjectile.h
31    @brief Implementation of the ParticleProjectile class.
32*/
33
34#include "BallProjectile.h"
[12368]35#include "gametypes/Gametype.h"
[12281]36
[12368]37
[12281]38#include <OgreParticleEmitter.h>
39#include "core/CoreIncludes.h"
40#include "tools/ParticleInterface.h"
41#include "Scene.h"
42#include "core/command/Executor.h"
43#include "util/Convert.h"
[12310]44#include <bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h>
45#include <bullet/LinearMath/btVector3.h>
[12281]46
47namespace orxonox
48{
49    RegisterClass(BallProjectile);
50
51    BallProjectile::BallProjectile(Context* context) : BillboardProjectile(context)
52    {
53        RegisterObject(BallProjectile);
54        this->textureIndex_ = 1;
55        this->setMass(0.1f);
56        this->maxTextureIndex_ = 8;
57        this->setDestroyAfterCollision(false); //I want the ball to bounce, not to be destroyed
[12371]58        this->fieldWidth_ = 46;
59        this->fieldHeight_ =  49;
[12384]60        this->orxoblox_ = this->getOrxoBlox();
[12387]61        this->setCollisionShapeRadius(2.5);
[12281]62
63        //setEffect("Orxonox/sparks2");
64    }
65
66    void BallProjectile::registerVariables()
67    {
68        registerVariable(this->materialBase_);
[12310]69        registerVariable( this->speed_ );
[12281]70    }
71
72    /**
73    @brief
74        Set the material.
75    @param material
76        The name of the material. Material names with 1 to 8 appended must exist.
77    */
78    void BallProjectile::setMaterial(const std::string& material)
79    {
80        this->materialBase_ = material;
81
82        BillboardProjectile::setMaterial(material + multi_cast<std::string>(this->textureIndex_));
83    }
84
85    /**
86    @brief
87        Change the texture.
88    */
89    void BallProjectile::changeTexture()
90    {
91        this->textureIndex_++;
92        if (this->textureIndex_ > this->maxTextureIndex_)
93            this->textureIndex_ = 1;
94
95        this->setMaterial(this->materialBase_);
96    }
97
[12310]98
99
[12281]100    void BallProjectile::Bounce(WorldEntity* otherObject, btManifoldPoint& contactPoint, const btCollisionShape* cs) {
101
102        Vector3 velocity = this->getVelocity();
[12310]103        Vector3 myPosition = otherObject->getPosition();
104        btVector3 positionOtherObject = contactPoint.getPositionWorldOnA();
[12281]105       
[12310]106            int distance_X = positionOtherObject.getX() - myPosition.x;
107            int distance_Z = positionOtherObject.getZ() - myPosition.z;
[12281]108
109            if (distance_X < 0)
[12310]110                distance_X = -distance_X;
[12281]111   
112
[12310]113            if (distance_Z < 0)
114                distance_Z = -distance_Z;
[12281]115
[12376]116            //orxout() << distance_X << endl;
117            //orxout() << distance_Z << endl;
[12310]118
119            if (distance_X < distance_Z) {
120                velocity.z = -velocity.z;
[12376]121                //orxout() << "z" << endl;
[12310]122            }
123            if (distance_Z < distance_X) {
[12281]124                velocity.x = -velocity.x;
[12376]125                //orxout() << "x" << endl;
[12310]126            }
[12281]127            else {
128                velocity.x = -velocity.x;
[12310]129                velocity.z = -velocity.z;
[12376]130                //orxout() << "both" << endl;
[12281]131            }
[12310]132            this->setVelocity(velocity);
[12281]133        //}
134    }
135
136   
137    bool BallProjectile::processCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint, const btCollisionShape* cs)
138    {
139        bool result = BasicProjectile::processCollision(otherObject, contactPoint, cs);
[12371]140        if (result == true) {
141            if (otherObject->isA(Class(OrxoBloxStones))) {
142                Bounce(otherObject, contactPoint, cs);
[12378]143                orxout() << "BOUNCED!" << endl;
[12371]144            }
145        }
[12281]146        return result;
147    }
[12310]148
149
[12384]150   
[12368]151    OrxoBlox* BallProjectile::getOrxoBlox()
152    {
153        if (this->getGametype() != nullptr && this->getGametype()->isA(Class(OrxoBlox)))
154        {
155            OrxoBlox* orxobloxGametype = orxonox_cast<OrxoBlox*>(this->getGametype());
156            return orxobloxGametype;
157        }
158        else orxout()<<"There is no Gametype for OrxoBlox! ask Anna"<< endl;
159        return nullptr;
160    }
[12384]161   
[12310]162
163
164    void BallProjectile::tick(float dt)
165    {
166        SUPER(BallProjectile, tick, dt);
167
[12368]168               // Get the current position, velocity and acceleration of the ball.
[12310]169        Vector3 position = this->getPosition();
170        Vector3 velocity = this->getVelocity();
171        Vector3 acceleration = this->getAcceleration();
172
[12371]173        velocity.y = 0;
174        position.y = 0;
175
[12310]176        // If the ball has gone over the top or bottom boundary of the playing field (i.e. the ball has hit the top or bottom delimiters).
[12371]177        if (position.z > this->fieldHeight_ || position.z < -this->fieldHeight_)
[12310]178        {
[12368]179
[12310]180            velocity.z = -velocity.z;
[12368]181            // And its position is set as to not overstep the boundary it has just crossed. Remember z axis is reverted!!!
[12371]182            if (position.z > this->fieldHeight_){
[12368]183                // Set the ball to be exactly at the boundary.
[12371]184                position.z = this-> fieldHeight_;
[12368]185               
[12384]186                orxoblox_->LevelUp();
[12310]187
[12368]188
189                //this->setSpeed(0); // doesn't work here, why??;
190                //Stopping ball
[12376]191                //orxout() << "Ball stopped" << endl;
[12368]192                velocity.x = 0;
193                velocity.y = 0;
194                velocity.z = 0; 
195
196                //ChatManager::message("Waiting for your input");
197                //Input new speed here:
198                //ChatManager::message("Setting new speed");
199               
200                //%%%%%%%%%%%%
201                //MAUSPOSITION
202                //%%%%%%%%%%%%
203                //Reads current mouse position
204                //TODO: read Mouse position on click!
205                //int mousex = InputManager::getInstance().getMousePosition().first;
206                //int mousey = InputManager::getInstance().getMousePosition().second;
207                //ChatManager::message("Read mouse position");
208                //orxout() << "Mouseposition" << endl;
209                //orxout() << mousex << endl;
210                //ChatManager::message(mousex);
211                //ChatManager::message("mousey");
212                //ChatManager::message(mousey);
213                //Set new speed here!!
214                velocity.x = rnd(-100,100);
215                velocity.z = rnd(-50,-100);
216               
217
218            }
[12371]219            if (position.z < -this->fieldHeight_){
220                position.z = -this->fieldHeight_;
[12368]221               
222            }
223
[12310]224            this->fireEvent();
225        }
226       
227        //Ball hits the right or left wall and should bounce back.
228        // If the ball has crossed the left or right boundary of the playing field.
[12371]229        if (position.x > this->fieldWidth_ || position.x < -this->fieldWidth_)
[12310]230        {
231            //Ball hits the right Wall
[12371]232            if (position.x > this->fieldWidth_)
[12310]233                {
234                    // Set the ball to be exactly at the boundary.
[12371]235                    position.x = this->fieldWidth_;
[12310]236                    // Invert its velocity in x-direction (i.e. it bounces off).
237                    velocity.x = -velocity.x;
238                    this->fireEvent();
239                    }
240
241            //Ball hits the left wall
[12371]242            else if (position.x < -this->fieldWidth_)
[12310]243                {
244                        // Set the ball to be exactly at the boundary.
[12371]245                        position.x = -this->fieldWidth_;
[12310]246                        // Invert its velocity in x-direction (i.e. it bounces off).
247                        velocity.x = -velocity.x;
248                        this->fireEvent();
249                    }
250        }
251
252        // Set the position, velocity and acceleration of the ball, if they have changed.
253        if (acceleration != this->getAcceleration())
254            this->setAcceleration(acceleration);
255        if (velocity != this->getVelocity())
256            this->setVelocity(velocity);
257        if (position != this->getPosition())
258            this->setPosition(position);
[12368]259        //this->Collides((this->orxoblox_->CheckForCollision(this)));
260
[12310]261    }
262
263
264
265    void BallProjectile::setSpeed(float speed)
266    {
267        if (speed != this->speed_) // If the speed changes
268        {
269            this->speed_ = speed;
270
271            // Set the speed in the direction of the balls current velocity.
272            Vector3 velocity = this->getVelocity();
273            if (velocity.x != 0)
274                velocity.x = sgn(velocity.x) * this->speed_;
275            else // If the balls current velocity is zero, the speed is set in a random direction.
276                velocity.x = this->speed_ * sgn(rnd(-1,1));
277
278            this->setVelocity(velocity);
279        }
280    }
281
[12378]282    void BallProjectile::destroyObject(void)
283    {
284        if(GameMode::isMaster()) {
285        }
286    }
[12310]287
[12378]288
289
[12281]290}
Note: See TracBrowser for help on using the repository browser.