Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/CPlayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CPlayer.cpp')
-rwxr-xr-xsrc/CPlayer.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/src/CPlayer.cpp b/src/CPlayer.cpp
new file mode 100755
index 0000000..719fe0f
--- /dev/null
+++ b/src/CPlayer.cpp
@@ -0,0 +1,263 @@
+#include "CPlayer.h"
+
+CPlayer::CPlayer(CSurface *aScreenSurface, CTileMap *aMap)
+{
+ mScreenSurface = aScreenSurface;
+ mMap = aMap;
+ mXoxiAnimation = new CSpriteAnimation("assets/images/xoxi/xoxi_frames.png", 9, 9, 1, CGameConstants::PLAYER_IMAGE_WIDTH, CGameConstants::PLAYER_IMAGE_HEIGHT, false, false);
+
+ mXoxiSpr = new CSprite(mXoxiAnimation, mScreenSurface);
+ mXoxiSpr->setRenderOffsets(CGameConstants::PLAYER_OFFSET_RENDER_X, CGameConstants::PLAYER_OFFSET_RENDER_Y);
+
+ mXoxiSpr->setXY(400, 500);
+// mXoxiSpr->setXY(0, 0);
+
+ WALKING_SPEED = 1.0f;
+ mCurrentDirection = DOWN;
+ setState(STALE);
+}
+
+CPlayer::~CPlayer(void)
+{
+ destroy();
+}
+
+void CPlayer::destroy(void)
+{
+ if (mXoxiAnimation != NULL)
+ {
+ delete mXoxiAnimation;
+ mXoxiAnimation = NULL;
+ }
+
+ if (mXoxiSpr != NULL)
+ {
+ delete mXoxiSpr;
+ mXoxiSpr = NULL;
+ }
+}
+
+void CPlayer::update(void)
+{
+ mKeys = SDL_GetKeyState(NULL);
+
+ switch (mState)
+ {
+ case STALE:
+ if (mKeys[SDLK_LEFT])
+ {
+ checkMapCollisions(mXoxiSpr->getIntX()-WALKING_SPEED, mXoxiSpr->getIntY());
+ if (upLeft && centerLeft && downLeft)
+ {
+ setState(WALKING_LEFT);
+ break;
+ }
+ }
+ if (mKeys[SDLK_RIGHT])
+ {
+ checkMapCollisions(mXoxiSpr->getIntX()+WALKING_SPEED, mXoxiSpr->getIntY());
+ if (upRight && centerRight && downRight)
+ {
+ setState(WALKING_RIGHT);
+ break;
+ }
+ }
+ if (mKeys[SDLK_UP])
+ {
+ checkMapCollisions(mXoxiSpr->getIntX(), mXoxiSpr->getIntY()-WALKING_SPEED);
+ if (upLeft && centerUp && upRight)
+ {
+ setState(WALKING_UP);
+ break;
+ }
+ }
+ if (mKeys[SDLK_DOWN])
+ {
+ checkMapCollisions(mXoxiSpr->getIntX(), mXoxiSpr->getIntY()+WALKING_SPEED);
+ if (downLeft && centerDown && downRight)
+ {
+ setState(WALKING_DOWN);
+ break;
+ }
+ }
+ break;
+
+ case WALKING_RIGHT:
+ if (!mKeys[SDLK_RIGHT])
+ {
+ setState(STALE);
+ break;
+ }
+ else
+ {
+ checkMapCollisions(mXoxiSpr->getIntX()+WALKING_SPEED, mXoxiSpr->getIntY());
+ if (!upRight || !centerRight || !downRight)
+ {
+ setState(STALE);
+ break;
+ }
+ }
+ break;
+
+ case WALKING_LEFT:
+ if (!mKeys[SDLK_LEFT])
+ {
+ setState(STALE);
+ break;
+ }
+ else
+ {
+ checkMapCollisions(mXoxiSpr->getIntX()-WALKING_SPEED, mXoxiSpr->getIntY());
+ if (!upLeft || !centerLeft || !downLeft)
+ {
+ setState(STALE);
+ break;
+ }
+ }
+ break;
+
+ case WALKING_UP:
+ if (!mKeys[SDLK_UP])
+ {
+ setState(STALE);
+ break;
+ }
+ else
+ {
+ checkMapCollisions(mXoxiSpr->getIntX(), mXoxiSpr->getIntY()-WALKING_SPEED);
+ if (!upLeft || !centerUp || !upRight)
+ {
+ setState(STALE);
+ break;
+ }
+ }
+ break;
+
+ case WALKING_DOWN:
+ if (!mKeys[SDLK_DOWN])
+ {
+ setState(STALE);
+ break;
+ }
+ else
+ {
+ checkMapCollisions(mXoxiSpr->getIntX(), mXoxiSpr->getIntY()+WALKING_SPEED);
+ if (!downLeft || !centerDown || !downRight)
+ {
+ setState(STALE);
+ break;
+ }
+ }
+ break;
+
+/* case CLIMBING_STALE:
+ if (mKeys[SDLK_LEFT])
+ {
+ setState(WALKING_LEFT);
+ break;
+ }
+ if (mKeys[SDLK_RIGHT])
+ {
+ setState(WALKING_RIGHT);
+ break;
+ }
+ if (mKeys[SDLK_UP])
+ {
+ setState(CLIMBING_UP);
+ break;
+ }
+ if (mKeys[SDLK_DOWN])
+ {
+ setState(CLIMBING_DOWN);
+ break;
+ }
+ break;
+*/
+ case JUMPING:
+ break;
+ }
+
+ // Debug-------------------------------
+ if (mKeys[SDLK_SPACE])
+ {
+
+ }
+ //-------------------------------------
+
+ mXoxiSpr->update();
+}
+
+void CPlayer::render(void)
+{
+ mXoxiSpr->render();
+}
+
+void CPlayer::setState(int aState)
+{
+ mState = aState;
+
+ switch (mState)
+ {
+ case STALE:
+ mXoxiSpr->setXVel(0);
+ mXoxiSpr->setYVel(0);
+ mXoxiSpr->setAnim(0, 0, false);
+ break;
+
+ case WALKING_RIGHT:
+ mCurrentDirection = RIGHT;
+ mXoxiSpr->setXVel(WALKING_SPEED);
+ mXoxiSpr->setAnim(1, 2, true);
+ break;
+
+ case WALKING_LEFT:
+ mCurrentDirection = LEFT;
+ mXoxiSpr->setXVel(-WALKING_SPEED);
+ mXoxiSpr->setAnim(3, 4, true);
+ break;
+
+ case WALKING_UP:
+ mCurrentDirection = UP;
+ mXoxiSpr->setYVel(-WALKING_SPEED);
+ mXoxiSpr->setAnim(5, 6, true);
+ break;
+
+ case WALKING_DOWN:
+ mCurrentDirection = DOWN;
+ mXoxiSpr->setYVel(WALKING_SPEED);
+ mXoxiSpr->setAnim(7, 8, true);
+ break;
+
+ case JUMPING:
+ break;
+ }
+}
+
+void CPlayer::checkMapCollisions(int aX, int aY)
+{
+ // TODO: Cambiar este valor por 0 cuando se mueva bien por los bordes. Remover esta vairable.
+ int v = 4;
+
+ //int x = mXoxiSpr->getIntX();
+ //int y = mXoxiSpr->getIntY();
+ int leftX = (aX+v) / CGameConstants::TILE_WIDTH;
+ int upY = (aY+v) / CGameConstants::TILE_HEIGHT;
+ int rightX = ((aX + CGameConstants::PLAYER_WIDTH-1-v)) / CGameConstants::TILE_WIDTH;
+ int downY = ((aY + (CGameConstants::PLAYER_HEIGHT-1)-v)) / CGameConstants::TILE_HEIGHT;
+ int centerX = (aX + (CGameConstants::PLAYER_WIDTH / 2)) / CGameConstants::TILE_WIDTH;
+ int centerY = (aY + (CGameConstants::PLAYER_HEIGHT / 2)) / CGameConstants::TILE_HEIGHT;
+
+ upLeft = mMap->isWalkable(leftX, upY);
+ upRight = mMap->isWalkable(rightX, upY);
+ downLeft = mMap->isWalkable(leftX, downY);
+ downRight = mMap->isWalkable(rightX, downY);
+ centerLeft = mMap->isWalkable(leftX, centerY);
+ centerRight = mMap->isWalkable(rightX, centerY);
+ centerUp = mMap->isWalkable(centerX, upY);
+ centerDown = mMap->isWalkable(centerX, downY);
+
+ //fprintf(stdout, "upLeft = %d %d!\n", xTile, yTile);
+ //fprintf(stdout, "upLeft = %d!\n", upLeft);
+ //fprintf(stdout, "upRight = %d!\n", upRight);
+ fprintf(stdout, "upLeft = %d downLeft = %d!\n", upLeft, downLeft);
+}