00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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 ; 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
00123 playerRef.setDirection(Game::DOWN);
00124 playerRef.setDirection(Game::NO_DIRECTION);
00125 }
00126
00127 void AbstractPlayer::PlayerAfterParseValidator::getValue(std::istream& input) {
00128
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 {
00168 actions |= getMovementFromDirection(getDirection());
00169 }
00170 return actions;
00171 }