Hosting courtesy of Sourceforge

SourceForge Logo
Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

Player.cpp

Go to the documentation of this file.
00001 //
00002 //      Copyright (C) 2002 Robert Renaud
00003 //
00004 //      This program is free software; you can redistribute it and/or
00005 //      modify it under the terms of the GNU General Public License
00006 //      as published by the Free Software Foundation; either version 2
00007 //      of the License, or (at your option) any later version.
00008 //
00009 //      This program is distributed in the hope that it will be useful,
00010 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 //
00013 //      See the GNU General Public License for more details.
00014 //
00015 //      You should have received a copy of the GNU General Public License
00016 //      along with this program; if not, write to the Free Software
00017 //      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018 //
00019 
00020 #include "Player.h"
00021 
00022 #include "../Util/STL_Helper.h"
00023 #include "../Util/StringUtil.h"
00024 
00025 using namespace Game;
00026 
00027 Direction Game::getDirectionFromMovement(PlayerAction pa) {
00028         switch (pa) {
00029         case Constants::MOVE_RIGHT: return RIGHT;
00030         case Constants::MOVE_LEFT: return LEFT;
00031         case Constants::MOVE_DOWN: return DOWN;
00032         case Constants::MOVE_UP: return UP;
00033         default: return NO_DIRECTION;
00034         }
00035 }
00036 
00037 PlayerAction Game::getMovementFromDirection(Direction d) {
00038         switch (d) {
00039         case RIGHT: return Constants::MOVE_RIGHT;
00040         case LEFT: return Constants::MOVE_LEFT;
00041         case DOWN: return Constants::MOVE_DOWN;
00042         case UP: return Constants::MOVE_UP;
00043         }
00044         return Constants::NO_ACTION;
00045 }
00046 
00047 AbstractPlayer::AbstractPlayer(Sint16 startX, Sint16 startY) :
00048 MoveableItem(startX, startY, Constants::PLAYER_STARTING_MOVE_SPEED),
00049 movingImages(4, (Graphics::AbstractImage*) 0),
00050 idleImages(4, (Graphics::AbstractImage*) 0),
00051 bombRadius(Constants::DEFAULT_START_BOMB_RADIUS),
00052 bombsLeft(Constants::DEFAULT_START_NUM_BOMBS),
00053 framesTilNextBomb(0)
00054 {
00055 
00056 }
00057 
00058 void AbstractPlayer::draw(SDL_Surface* screen) {
00059         (*activeImage)->drawAt(screen, &picPosition);
00060 }
00061 
00062 void AbstractPlayer::setDirection(Direction newState) {
00063         if (newState == NO_DIRECTION && dir == NO_DIRECTION) return;
00064         if (newState == NO_DIRECTION)   activeImage=&idleImages[dir];
00065         else                                            activeImage=&movingImages[newState];
00066         dir = newState;
00067 }
00068 
00069 void AbstractPlayer::increaseBombsLeft() {
00070         bombsLeft++;
00071 }
00072 
00073 void AbstractPlayer::decreaseBombsLeft() {
00074         bombsLeft--;
00075 }
00076 
00077 int AbstractPlayer::getBombRadius() {
00078         return bombRadius;
00079 }
00080 
00081 void AbstractPlayer::setBombRadius(int newRad) {
00082         bombRadius=newRad;
00083 }
00084 
00085 Parse::Parser* AbstractPlayer::makeParserToParseMe(std::istream& input) {
00086         Parse::Parser* parser = new Parse::SimpleParser(input);
00087         
00088         parser->addAction("movingdown"  , new Graphics::ReadImage(movingImages[DOWN]));
00089         parser->addAction("movingright" , new Graphics::ReadImage(movingImages[RIGHT]));
00090         parser->addAction("movingup"    , new Graphics::ReadImage(movingImages[UP]));
00091         parser->addAction("movingleft"  , new Graphics::ReadImage(movingImages[LEFT]));
00092         
00093         parser->addAction("facingdown"  , new Graphics::ReadImage(idleImages[DOWN]));
00094         parser->addAction("facingright" , new Graphics::ReadImage(idleImages[RIGHT]));
00095         parser->addAction("facingleft"  , new Graphics::ReadImage(idleImages[LEFT]));
00096         parser->addAction("facingup"    , new Graphics::ReadImage(idleImages[UP]));
00097         
00098         parser->addAction("AfterParseValidator", new PlayerAfterParseValidator(*this));
00099         
00100         return parser;
00101 }
00102 
00103 AbstractPlayer::~AbstractPlayer() {
00104         Util::freeDynamicContainer(movingImages);
00105         Util::freeDynamicContainer(idleImages);
00106 }
00107 
00108 
00109 AbstractPlayer::PlayerAfterParseValidator::PlayerAfterParseValidator(AbstractPlayer& p) :
00110 playerRef(p)
00111 { }
00112 
00113 void AbstractPlayer::PlayerAfterParseValidator::finishingAction() {
00114         for (size_t i = 0; i < 4 /* all cardinal directions */; i++) {
00115                 if (playerRef.movingImages[i] == NULL) throw Util::GeneralException("Player image not defined", __FILE__, __LINE__);
00116                 if (playerRef.idleImages[i] == NULL) {
00117                         playerRef.idleImages[i] = playerRef.movingImages[i]->dynCopyImage();
00118                 }
00119                 playerRef.idleImages[i]->setTransparency(SDL_SRCCOLORKEY);
00120                 playerRef.movingImages[i]->setTransparency(SDL_SRCCOLORKEY);
00121         }
00122         // make player face down but not move
00123         playerRef.setDirection(Game::DOWN);
00124         playerRef.setDirection(Game::NO_DIRECTION);
00125 }
00126 
00127 void AbstractPlayer::PlayerAfterParseValidator::getValue(std::istream& input) {
00128         // nothing... this shouldn't get called
00129 }
00130 
00131 Parse::Parser* LocalPlayer::makeParserToParseMe(std::istream& input) {
00132         Parse::Parser* parser= AbstractPlayer::makeParserToParseMe(input);
00133         
00134         parser->addAction("keyboard", new Parse::NaturalParser<PlayerController, KeyboardController>(controller));
00135         parser->addAction("joystick", new Parse::NaturalParser<PlayerController, JoystickController>(controller));
00136 
00137         return parser;
00138 }
00139 
00140 LocalPlayer::LocalPlayer(Sint16 startX, Sint16 startY) :
00141 AbstractPlayer(startX, startY),
00142 controller(NULL)
00143 {
00144         
00145 }
00146 
00147 LocalPlayer::~LocalPlayer() {
00148         delete controller;
00149 }
00150 
00151 PlayerAction LocalPlayer::getInput() {
00152 #ifdef DEBUG_GAME_PLAYER
00153         debugOut << "LocalPlayer::getInput()" << endl;
00154 #endif
00155         framesTilNextBomb--;
00156         PlayerAction actions=Constants::NO_ACTION;
00157 
00158         if (controller->actionIsEnabled(Constants::DROP_BOMB) && bombsLeft && framesTilNextBomb <= 0) {
00159                 framesTilNextBomb= Constants::BOMB_DROP_REFRESH_INTERVAL;
00160                 actions |= Constants::DROP_BOMB;
00161         }
00162         if (!dirIsLocked) {
00163                 if (controller->actionIsEnabled(Constants::MOVE_RIGHT))         actions |= Constants::MOVE_RIGHT;
00164                 if (controller->actionIsEnabled(Constants::MOVE_DOWN))          actions |= Constants::MOVE_DOWN;
00165                 if (controller->actionIsEnabled(Constants::MOVE_LEFT))          actions |= Constants::MOVE_LEFT;
00166                 if (controller->actionIsEnabled(Constants::MOVE_UP))            actions |= Constants::MOVE_UP;
00167         } else {  // direction is locked, keep moving in the current direction
00168                 actions |= getMovementFromDirection(getDirection());
00169         }
00170         return actions;
00171 }

Generated on Tue May 21 07:26:51 2002 for BomberLAN by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001