Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 10, 2012, 5:13:00 PM (12 years ago)
Author:
jo
Message:

Merged pCuts branch.

Location:
code/branches/presentation2012merge
Files:
9 edited
4 copied

Legend:

Unmodified
Added
Removed
  • code/branches/presentation2012merge

  • code/branches/presentation2012merge/src/modules/tetris/CMakeLists.txt

    r8706 r9286  
    33  TetrisCenterpoint.cc
    44  TetrisStone.cc
     5  TetrisBrick.cc
     6  TetrisScore.cc
    57)
    68
     
    1012  LINK_LIBRARIES
    1113    orxonox
     14    overlays
    1215  SOURCE_FILES ${TETRIS_SRC_FILES}
    1316)
  • code/branches/presentation2012merge/src/modules/tetris/Tetris.cc

    r8858 r9286  
    2323 *      ...
    2424 *   Co-authors:
    25  *      ...
    26  *
     25 *      Johannes Ritz
     26 *
     27 *
     28 *BUG c) destroying the old stones causes segfault -> WeakPointer as solution ?
     29 *BUG d) wrong collision detection: sometimes stones "bounce off"
     30 *
     31 *
     32 *TASK c) end the game in a nicer way
     33 *TASK d) save the highscore
     34 *TASK e) eye candy
    2735 */
    2836
     
    4250#include "TetrisCenterpoint.h"
    4351#include "TetrisStone.h"
     52#include "TetrisBrick.h"
    4453#include "infos/PlayerInfo.h"
    4554
     
    5261    @brief
    5362        Constructor. Registers and initializes the object.
     63    @ingroup Tetris
    5464    */
    5565    Tetris::Tetris(BaseObject* creator) : Deathmatch(creator)
     
    5767        RegisterObject(Tetris);
    5868
    59         this->activeStone_ = NULL;
     69        this->activeBrick_ = NULL;
    6070
    6171        // Pre-set the timer, but don't start it yet.
    62         this->starttimer_.setTimer(1.0, false, createExecutor(createFunctor(&Tetris::startStone, this)));
     72        this->starttimer_.setTimer(1.0, false, createExecutor(createFunctor(&Tetris::startBrick, this)));
    6373        this->starttimer_.stopTimer();
    6474
    6575        this->player_ = NULL;
     76        this->endGameCriteria_ = 0.0f;
     77        this->setHUDTemplate("TetrisHUD");
     78        this->futureBrick_ = NULL;
    6679    }
    6780
     
    8295    void Tetris::cleanup()
    8396    {
     97        /*for(int i = 0;i < this->stones_.size(); i++) //TODO: Why isn't there any code like this
     98        {                                              // compensating the 'new' statement?
     99            delete this->stones_[i];
     100        }//*/
    84101
    85102    }
     
    89106        SUPER(Tetris, tick, dt);
    90107
    91         if(this->activeStone_ != NULL)
    92         {
    93             if(!this->isValidStonePosition(this->activeStone_, this->activeStone_->getPosition()))
    94             {
    95                 this->activeStone_->setVelocity(Vector3::ZERO);
    96                 this->createStone();
    97                 this->startStone();
     108        if((this->activeBrick_ != NULL)&&(!this->hasEnded()))
     109        {
     110                this->endGameCriteria_ += dt;
     111            if(!this->isValidBrickPosition(this->activeBrick_, this->activeBrick_->getPosition()))
     112            {
     113                this->activeBrick_->setVelocity(Vector3::ZERO);
     114                this->activeBrick_->releaseStones(this->center_);
     115                //delete this->activeBrick_; //releasing the memory
     116                this->findFullRows();
     117                if(this->endGameCriteria_ < 0.1f) //end game if two bricks are created within a 0.1s interval.
     118                    this->end();
     119                this->createBrick();
     120                this->startBrick();
     121                this->endGameCriteria_ = 0.0f;
    98122            }
    99123        }
     
    123147    }
    124148
     149    /**
     150    @brief
     151        Check for each stone in a brick if it is moved the right way.
     152    */
     153    bool Tetris::isValidMove(TetrisBrick* brick, const Vector3& position, bool isRotation = false)
     154    {
     155        assert(brick);
     156
     157        for (unsigned int i = 0; i < brick->getNumberOfStones(); i++ )
     158        {
     159            TetrisStone* stone = brick->getStone(i);
     160            Vector3 stonePosition; //the current stone's offset to position
     161            if(isRotation)
     162                stonePosition = rotateVector(stone->getPosition(), brick->getRotationCount()+1);
     163            else
     164                stonePosition = rotateVector(stone->getPosition(), brick->getRotationCount());
     165
     166            if(! this->isValidMove(stone, position + stonePosition ))
     167            {
     168                return false;
     169            }
     170
     171            //catch illegal rotation (such that collisions with ground are not permitted)
     172            if(isRotation)
     173            {
     174                if((position + stonePosition).y < this->center_->getStoneSize()/2.0f) //!< If the stone has reached the bottom of the level
     175                {
     176                    return false;
     177                }
     178            }
     179        }
     180        return true;
     181
     182    }
     183
     184
     185
    125186    bool Tetris::isValidStonePosition(TetrisStone* stone, const Vector3& position)
    126187    {
     
    130191        for(std::vector<TetrisStone*>::const_reverse_iterator it = this->stones_.rbegin(); it != this->stones_.rend(); ++it)
    131192        {
    132             if(stone == *it)
     193            if(this->activeBrick_->contains(*it))//skip the moving brick' stones
    133194                continue;
    134 
     195            //Vector3 currentStonePosition = rotateVector((*it)->getPosition(), this->activeBrick_->getRotationCount());
    135196            const Vector3& currentStonePosition = (*it)->getPosition(); //!< Saves the position of the currentStone
    136 
     197            //!< Saves the position of the currentStone
     198
     199            //filter out cases where the falling stone is already below a steady stone
     200            if(position.y < currentStonePosition.y - this->center_->getStoneSize()/2.0f)
     201                continue;
    137202            if((position.x == currentStonePosition.x) && (position.y < currentStonePosition.y + this->center_->getStoneSize()))
    138203            {
    139                 this->activeStone_->setPosition(Vector3(this->activeStone_->getPosition().x, currentStonePosition.y+this->center_->getStoneSize(), this->activeStone_->getPosition().z));
     204                int y_offset = static_cast<int>((this->activeBrick_->getPosition().y-currentStonePosition.y+10)/10)*10 + currentStonePosition.y;
     205                if(y_offset < 0) //filter out extreme cases (very rare bug)
     206                        y_offset = 0;
     207                this->activeBrick_->setPosition(Vector3(this->activeBrick_->getPosition().x, y_offset, this->activeBrick_->getPosition().z));
    140208                return false;
    141209            }// This case applies if the stones overlap partially vertically
     
    145213        if(position.y < this->center_->getStoneSize()/2.0f) //!< If the stone has reached the bottom of the level
    146214        {
    147             stone->setPosition(Vector3(stone->getPosition().x, this->center_->getStoneSize()/2.0f, stone->getPosition().z));
     215                int yOffset = stone->getPosition().y + this->center_->getStoneSize()/2.0f;//calculate offset
     216                if(yOffset < 0) //catch brake-throughs
     217                    yOffset = 0;
     218                this->activeBrick_->setPosition(Vector3(this->activeBrick_->getPosition().x, yOffset, this->activeBrick_->getPosition().z));
    148219            return false;
    149220        }
     
    151222        return true;
    152223    }
     224    /**
     225     * @brief This function determines wether a brick touches another brick or the ground.
     226     *
     227     */
     228    bool Tetris::isValidBrickPosition(TetrisBrick* brick, const Vector3& position)
     229    {
     230        assert(brick);
     231
     232        for (unsigned int i = 0; i < brick->getNumberOfStones(); i++ )
     233        {
     234            TetrisStone* stone = brick->getStone(i);
     235            Vector3 stonePosition = rotateVector(stone->getPosition(), brick->getRotationCount());
     236            if(! this->isValidStonePosition(stone, position + stonePosition) )
     237                return false;
     238        }
     239        return true;
     240    }
     241
     242    /**
     243    @brief
     244        A Vector3 is rolled 90 * degrees * amount (anticlockwise rotation)
     245    */
     246    Vector3 Tetris::rotateVector(Vector3 position, unsigned int amount)
     247    {
     248        int temp = 0;
     249        for(unsigned int i = 0; i < amount; i++)
     250        {
     251            temp = position.x;
     252            position.x = -position.y;
     253            position.y = temp;
     254        }
     255        return position;
     256    }
    153257
    154258    /**
     
    160264        if (this->center_ != NULL) // There needs to be a TetrisCenterpoint, i.e. the area the game takes place.
    161265        {
    162             // Create the first stone.
    163             this->createStone();
     266            // Create the futureBrick_
     267            this->createBrick();
     268            // Create the first brick.
     269            this->createBrick();
    164270        }
    165271        else // If no centerpoint was specified, an error is thrown and the level is exited.
     
    190296    void Tetris::end()
    191297    {
     298        this->activeBrick_->setVelocity(Vector3::ZERO);
     299        if(this->activeBrick_ != NULL)
     300        {
     301            this->player_->stopControl();
     302        }
     303
    192304        this->cleanup();
    193305
     
    225337    }
    226338
    227     /**
    228     @brief
    229         Starts the first stone.
    230     */
    231     void Tetris::startStone(void)
     339
     340
     341    void Tetris::startBrick(void)
    232342    {
    233343        if(this->player_ == NULL)
     
    235345
    236346        unsigned int cameraIndex = 0;
    237         if(this->activeStone_ != NULL)
     347        if(this->activeBrick_ != NULL)
    238348        {
    239349            // Get camera settings
    240             cameraIndex = this->activeStone_->getCurrentCameraIndex();
     350            cameraIndex = this->activeBrick_->getCurrentCameraIndex();
    241351            this->player_->stopControl();
    242352        }
    243        
    244         // Make the last stone to be created the active stone.
    245         this->activeStone_ = this->stones_.back();
    246        
    247         this->player_->startControl(this->activeStone_);
    248         this->activeStone_->setVelocity(0.0f, -this->center_->getStoneSpeed(), 0.0f);
    249         this->activeStone_->setCameraPosition(cameraIndex);
    250     }
    251 
    252     /**
    253     @brief
    254         Creates a new stone.
    255     */
    256     void Tetris::createStone(void)
    257     {
    258         // Create a new stone and add it to the list of stones.
    259         TetrisStone* stone = new TetrisStone(this->center_);
    260         this->stones_.push_back(stone);
    261        
     353
     354        // Make the last brick to be created the active brick.
     355        this->activeBrick_ = this->bricks_.back();
     356
     357        this->player_->startControl(this->activeBrick_);
     358        this->activeBrick_->setVelocity(0.0f, -this->center_->getStoneSpeed(), 0.0f);
     359        this->activeBrick_->setCameraPosition(cameraIndex);
     360    }
     361
     362    void Tetris::createBrick(void)             //TODO: random rotation offset between 0 and 3 (times 90°)
     363    {
     364        // Use the futureBrick_ as new currentBrick by setting its position and storing it in this->bricks
     365        if(this->futureBrick_ != NULL)
     366        {
     367            for (unsigned int i = 0; i < this->futureBrick_->getNumberOfStones(); i++)
     368            {
     369                this->stones_.push_back(this->futureBrick_->getStone(i));
     370            }
     371            float xPos = (this->center_->getWidth()/2 + ((this->center_->getWidth() % 2)*2-1)/2.0f)*this->center_->getStoneSize();
     372            float yPos = (this->center_->getHeight()-0.5f)*this->center_->getStoneSize();
     373            this->futureBrick_->setPosition(xPos, yPos, 0.0f);
     374            this->bricks_.push_back(this->futureBrick_);
     375        }
     376        // create new futureBrick_
     377        this->futureBrick_ = new TetrisBrick(this->center_);
     378
     379
    262380        // Apply the stone template to the stone.
    263         stone->addTemplate(this->center_->getStoneTemplate());
    264        
    265         // Attach the stone to the Centerpoint and set the position of the stone to be at the top middle.
    266         this->center_->attach(stone);
    267         float xPos = (this->center_->getWidth()/2 + ((this->center_->getWidth() % 2)*2-1)/2.0f)*this->center_->getStoneSize();
    268         float yPos = (this->center_->getHeight()-0.5f)*this->center_->getStoneSize();
    269         stone->setPosition(xPos, yPos, 0.0f);
    270         stone->setGame(this);
    271     }
     381        this->futureBrick_->addTemplate(this->center_->getBrickTemplate());
     382
     383        // Attach the brick to the Centerpoint and set the position of the brick to be at the left side.
     384        this->center_->attach(this->futureBrick_);
     385        float xPos = (this->center_->getWidth()*1.6 + ((this->center_->getWidth() % 2)*2-1)/2.0f)*this->center_->getStoneSize();
     386        float yPos = (this->center_->getHeight()-5.1f)*this->center_->getStoneSize();
     387        this->futureBrick_->setPosition(xPos, yPos, 0.0f);
     388        this->futureBrick_->setGame(this);
     389    }
     390
    272391
    273392    /**
     
    282401    }
    283402
     403    /*TetrisCenterpoint* Tetris::getCenterpoint(void) const
     404    {
     405        return this->center_;
     406    }*/
     407
    284408    /**
    285409    @brief Set the TetrisCenterpoint (the playing field).
     
    291415    }
    292416
     417    /**
     418    @brief Check each row if it is full. Removes all full rows. Update
     419    @brief Manages score.
     420    */
     421    void Tetris::findFullRows()
     422    {
     423        unsigned int correctPosition = 0;
     424        unsigned int stonesPerRow = 0;
     425        for (unsigned int row = 0; row < this->center_->getHeight(); row++)
     426        {
     427            stonesPerRow = 0;
     428            for(std::vector<TetrisStone*>::iterator it = this->stones_.begin(); it != this->stones_.end(); ++it)
     429            {
     430                correctPosition = static_cast<unsigned int>(((*it)->getPosition().y - 5)/this->center_->getStoneSize());
     431                if(correctPosition == row)
     432                {
     433                    stonesPerRow++;
     434                    if(stonesPerRow == this->center_->getWidth())
     435                    {
     436                        clearRow(row);
     437                        row--; //the row counter has to be decreased in order to detect multiple rows!
     438                        this->playerScored(this->player_);// add points
     439                        //increase the stone's speed
     440                        this->center_->setStoneSpeed(this->center_->getStoneSpeed()+1.0f);
     441                    }
     442                }
     443            }
     444        }
     445    }
     446
     447    void Tetris::clearRow(unsigned int row)
     448    {// clear the full row
     449        for(std::vector<TetrisStone*>::iterator it = this->stones_.begin(); it != this->stones_.end(); ++it)
     450        {
     451            if(static_cast<unsigned int>(((*it)->getPosition().y - 5)/this->center_->getStoneSize()) == row)
     452                (*it)->setPosition(Vector3(-50,-50,100));
     453                //{(*it)->destroy(); this->stones_.erase(it); orxout()<< "destroy row "<<endl;}//experimental
     454        }
     455      // adjust height of stones above the deleted row //TODO: check if this could be a source of a bug.
     456        for(std::vector<TetrisStone*>::iterator it2 = this->stones_.begin(); it2 != this->stones_.end(); ++it2)
     457        {
     458            if(static_cast<unsigned int>(((*it2)->getPosition().y - 5)/this->center_->getStoneSize()) > row)
     459                (*it2)->setPosition((*it2)->getPosition()-Vector3(0,10,0));
     460        }
     461
     462    }
     463
     464
    293465}
  • code/branches/presentation2012merge/src/modules/tetris/Tetris.h

    r8706 r9286  
    6868
    6969            PlayerInfo* getPlayer(void) const; //!< Get the player.
     70            WeakPtr<TetrisCenterpoint> getCenterpoint(void)
     71                { return this->center_; }
    7072
    7173            bool isValidMove(TetrisStone* stone, const Vector3& position);
     74            bool isValidMove(TetrisBrick* brick, const Vector3& position, bool isRotation);
     75            Vector3 rotateVector(Vector3 position, unsigned int amount);
    7276
    7377        protected:
    7478            virtual void spawnPlayersIfRequested(); //!< Spawns player.
    7579
     80
    7681        private:
    77             void startStone(void); //!< Starts with the first stone.
    78             void createStone(void);
     82            void startBrick(void);
     83            void createBrick(void);
    7984            void cleanup(void); //!< Cleans up the Gametype by destroying the ball and the bats.
    8085            bool isValidStonePosition(TetrisStone* stone, const Vector3& position);
     86            bool isValidBrickPosition(TetrisBrick* brick, const Vector3& position);
     87            void findFullRows(void);
     88            void clearRow(unsigned int row);
     89
    8190           
    8291            PlayerInfo* player_;
    8392
    8493            WeakPtr<TetrisCenterpoint> center_; //!< The playing field.
     94            std::vector<TetrisBrick*> bricks_; //!< A list of all bricks in play.
    8595            std::vector<TetrisStone*> stones_; //!< A list of all stones in play.
    8696            std::vector< std::vector<bool> > grid_;
    87             TetrisStone* activeStone_;
     97            TetrisBrick* activeBrick_;
     98            TetrisBrick* futureBrick_;
    8899           
    89100            Timer starttimer_; //!< A timer to delay the start of the game.
     101            float endGameCriteria_; //<! Works as a timer which is resetted, whenever a brick is created.
    90102    };
    91103}
  • code/branches/presentation2012merge/src/modules/tetris/TetrisCenterpoint.cc

    r8706 r9286  
    3030    @file TetrisCenterpoint.cc
    3131    @brief Implementation of the TetrisCenterpoint class.
     32    @ingroup Tetris
    3233*/
    3334
     
    5556        this->stoneSize_ = 10.0f;
    5657        this->stoneTemplate_ = "";
     58        this->brickTemplate_ = "";
    5759        this->stoneSpeed_ = 20.0f;
    5860       
     
    6971
    7072        XMLPortParam(TetrisCenterpoint, "width", setWidth, getWidth, xmlelement, mode); // die Breite
    71         XMLPortParam(TetrisCenterpoint, "height", setHeight, setWidth, xmlelement, mode); // die Grösse
     73        XMLPortParam(TetrisCenterpoint, "height", setHeight, getHeight, xmlelement, mode); // die Grösse //was sollte das mit setWidth??
    7274        XMLPortParam(TetrisCenterpoint, "stoneSize", setStoneSize, getStoneSize, xmlelement, mode);
    7375        XMLPortParam(TetrisCenterpoint, "stoneTemplate", setStoneTemplate, getStoneTemplate, xmlelement, mode);
     76        XMLPortParam(TetrisCenterpoint, "brickTemplate", setBrickTemplate, getBrickTemplate, xmlelement, mode);
    7477        XMLPortParam(TetrisCenterpoint, "stoneSpeed", setStoneSpeed, getStoneSpeed, xmlelement, mode);
    7578    }
  • code/branches/presentation2012merge/src/modules/tetris/TetrisCenterpoint.h

    r8706 r9286  
    4545
    4646namespace orxonox
    47 {
     47{//idea: add 2 triggers to the centerpoint (one to determine when a box would go above the centerpoint;
     48//the other to find out when the lowest row is filled totally)
    4849   
    4950    /**
     
    118119           
    119120            /**
     121            @brief Set the template for the bricks.
     122            @param template The template name to be applied to each brick.
     123            */
     124            void setBrickTemplate(const std::string& templateName)
     125                { this->brickTemplate_ = templateName; }
     126            /**
     127            @brief Get the template for the bricks.
     128            @return Returns the template name to be applied to each brick.
     129            */
     130            const std::string& getBrickTemplate(void) const
     131                { return this->brickTemplate_; }
     132
     133            /**
    120134            @brief Set the speed of the stones.
    121135            @param speed The speed to be set.
     
    137151            float stoneSize_;
    138152            std::string stoneTemplate_;
     153            std::string brickTemplate_;
    139154            float stoneSpeed_;
    140155
  • code/branches/presentation2012merge/src/modules/tetris/TetrisPrereqs.h

    r8706 r9286  
    6868    class TetrisCenterpoint;
    6969    class TetrisStone;
     70    class TetrisBrick;
     71    class TetrisScore;
    7072}
    7173
  • code/branches/presentation2012merge/src/modules/tetris/TetrisStone.cc

    r8706 r9286  
    3030    @file TetrisStone.cc
    3131    @brief Implementation of the TetrisStone class.
     32    @ingroup Tetris
    3233*/
    3334
     
    4748        Constructor. Registers and initializes the object.
    4849    */
    49     TetrisStone::TetrisStone(BaseObject* creator) : ControllableEntity(creator)
     50    TetrisStone::TetrisStone(BaseObject* creator) : Pawn(creator)
    5051    {
    5152        RegisterObject(TetrisStone);
    52        
     53
    5354        this->size_ = 10.0f;
    5455        this->delay_ = false;
    5556        this->delayTimer_.setTimer(0.2f, false, createExecutor(createFunctor(&TetrisStone::enableMovement, this)));
     57        this->lockRotation_ = false;
     58
    5659    }
    5760
     
    6467    void TetrisStone::moveFrontBack(const Vector2& value)
    6568    {
    66         if(value.x < 0)
     69        if(value.x < 0) //speedup on key down
    6770        {
    6871            this->setVelocity(this->getVelocity()*1.1);
     72        }
     73        else if(!this->lockRotation_) //rotate when key up is pressed
     74        {
     75            this->lockRotation_ = true; // multiple calls of this function have to be filtered out.
     76            this->rotationTimer_.setTimer(0.1f, false, createExecutor(createFunctor(&TetrisStone::unlockRotation, this)));
     77            Quaternion q(Degree(90), Vector3::UNIT_Z);
     78            this->setOrientation(this->getOrientation()*q); //rotation: roll 90°
     79
    6980        }
    7081    }
  • code/branches/presentation2012merge/src/modules/tetris/TetrisStone.h

    r8706 r9286  
    3838#include "tetris/TetrisPrereqs.h"
    3939
    40 #include "worldentities/ControllableEntity.h"
     40#include "worldentities/pawns/Pawn.h"
    4141#include "tools/Timer.h"
    4242
     
    5151    @ingroup Tetris
    5252    */
    53     class _TetrisExport TetrisStone : public ControllableEntity
     53    class _TetrisExport TetrisStone : public Pawn
    5454    {
    5555        public:
     
    8181            void enableMovement(void)
    8282                { this->delay_ = false; }
    83            
     83            void unlockRotation(void)
     84                { this->lockRotation_ = false; }
     85
    8486            float size_; //!< The dimensions a stone has in the game world.
    8587            bool delay_;
     88            bool lockRotation_;
    8689            Timer delayTimer_;
     90            Timer rotationTimer_; ///!< This timer is used to filter out multiple rotation inputs.
    8791
    8892            Tetris* tetris_;
Note: See TracChangeset for help on using the changeset viewer.