Platform game written for the GHI/OutrageousCircuits RETRO game device. Navigate the caves collecting all the pickups and avoiding the creatures and haunted mine carts that patrol the caves. Oh and remember to watch out for the poisonous plants... This game demonstrates the ability to have multiple animated sprites where the sprites can overlap the background environment. See how the player moves past the fence and climbs the wall in the 3rd screen.

Dependencies:   mbed

Committer:
taylorza
Date:
Mon Feb 16 03:46:57 2015 +0000
Revision:
16:f9227904afc4
Parent:
11:9ae9a88a1da8
Added a 4th game screen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taylorza 0:2ee0812e2615 1 class Player : public GameObject
taylorza 0:2ee0812e2615 2 {
taylorza 0:2ee0812e2615 3 public:
taylorza 4:45ff7fc8a431 4 enum State { Stopped, Walking, Jumping, Falling, OnLadder, Dying };
taylorza 0:2ee0812e2615 5
taylorza 4:45ff7fc8a431 6 Player() :
taylorza 0:2ee0812e2615 7 _state(Stopped),
taylorza 0:2ee0812e2615 8 _jumpY(0),
taylorza 4:45ff7fc8a431 9 _jumpX(0),
taylorza 4:45ff7fc8a431 10 _introMode(false),
taylorza 4:45ff7fc8a431 11 _forceLeaveLadder(false)
taylorza 0:2ee0812e2615 12 {
taylorza 3:a93fe5f207f5 13 setCollisionRect(2, 0, 11, 16);
taylorza 0:2ee0812e2615 14 }
taylorza 0:2ee0812e2615 15
taylorza 2:97d01ba6cd91 16 void alignX()
taylorza 0:2ee0812e2615 17 {
taylorza 4:45ff7fc8a431 18 Point &position = getPosition();
taylorza 4:45ff7fc8a431 19 if (position.X % 8 != 0)
taylorza 2:97d01ba6cd91 20 {
taylorza 2:97d01ba6cd91 21 int8_t dx = getLastXDirection();
taylorza 3:a93fe5f207f5 22 if (dx < 0) moveLeft();
taylorza 3:a93fe5f207f5 23 else if (dx > 0) moveRight();
taylorza 2:97d01ba6cd91 24 }
taylorza 2:97d01ba6cd91 25 }
taylorza 2:97d01ba6cd91 26
taylorza 4:45ff7fc8a431 27 void setIntroMode(bool flag)
taylorza 4:45ff7fc8a431 28 {
taylorza 4:45ff7fc8a431 29 _introMode = flag;
taylorza 4:45ff7fc8a431 30 if (_introMode)
taylorza 4:45ff7fc8a431 31 setSpriteId(1);
taylorza 4:45ff7fc8a431 32 else
taylorza 4:45ff7fc8a431 33 setSpriteId(0);
taylorza 4:45ff7fc8a431 34 }
taylorza 4:45ff7fc8a431 35
taylorza 2:97d01ba6cd91 36 virtual void update()
taylorza 4:45ff7fc8a431 37 {
taylorza 4:45ff7fc8a431 38 static int counter = 0;
taylorza 0:2ee0812e2615 39
taylorza 4:45ff7fc8a431 40 counter++;
taylorza 4:45ff7fc8a431 41 if (_introMode)
taylorza 4:45ff7fc8a431 42 {
taylorza 4:45ff7fc8a431 43 static bool shuffleRight = true;
taylorza 4:45ff7fc8a431 44
taylorza 4:45ff7fc8a431 45 if (shuffleRight)
taylorza 4:45ff7fc8a431 46 {
taylorza 4:45ff7fc8a431 47 if (!moveRight()) shuffleRight = false;
taylorza 4:45ff7fc8a431 48 }
taylorza 4:45ff7fc8a431 49 else
taylorza 4:45ff7fc8a431 50 {
taylorza 4:45ff7fc8a431 51 if (!moveLeft()) shuffleRight = true;
taylorza 4:45ff7fc8a431 52 }
taylorza 4:45ff7fc8a431 53 animate();
taylorza 4:45ff7fc8a431 54 }
taylorza 4:45ff7fc8a431 55 else if (_state == Dying)
taylorza 0:2ee0812e2615 56 {
taylorza 4:45ff7fc8a431 57 animate();
taylorza 4:45ff7fc8a431 58 if (counter == 4)
taylorza 4:45ff7fc8a431 59 {
taylorza 4:45ff7fc8a431 60 Game::Instance->die();
taylorza 4:45ff7fc8a431 61 _state = Stopped;
taylorza 4:45ff7fc8a431 62 }
taylorza 4:45ff7fc8a431 63 }
taylorza 4:45ff7fc8a431 64 else
taylorza 4:45ff7fc8a431 65 {
taylorza 4:45ff7fc8a431 66 if (_forceLeaveLadder && !isLadderAbove() && !isOverLadder() && _state != Stopped) _forceLeaveLadder = false;
taylorza 4:45ff7fc8a431 67
taylorza 4:45ff7fc8a431 68 if (_state == OnLadder && !isLadderBelow()) _state = Stopped;
taylorza 4:45ff7fc8a431 69 if (_state == OnLadder || (isLadderAbove() && isOpenBelow())) setSpriteId(1);
taylorza 4:45ff7fc8a431 70 else setSpriteId(0);
taylorza 4:45ff7fc8a431 71
taylorza 4:45ff7fc8a431 72 if (_state != Jumping && _state != Falling)
taylorza 2:97d01ba6cd91 73 {
taylorza 4:45ff7fc8a431 74 if (_state != OnLadder || isLadderAbove())
taylorza 4:45ff7fc8a431 75 {
taylorza 4:45ff7fc8a431 76 if (GameInput::isLeftPressed())
taylorza 4:45ff7fc8a431 77 {
taylorza 4:45ff7fc8a431 78 if (_state != OnLadder || isLadderLeft())
taylorza 4:45ff7fc8a431 79 {
taylorza 4:45ff7fc8a431 80 _state = moveLeft() ? Walking : Stopped;
taylorza 4:45ff7fc8a431 81 animate();
taylorza 4:45ff7fc8a431 82 }
taylorza 4:45ff7fc8a431 83 }
taylorza 4:45ff7fc8a431 84 else if (GameInput::isRightPressed())
taylorza 4:45ff7fc8a431 85 {
taylorza 4:45ff7fc8a431 86 if (_state != OnLadder || isLadderRight())
taylorza 4:45ff7fc8a431 87 {
taylorza 4:45ff7fc8a431 88 _state = moveRight() ? Walking : Stopped;
taylorza 4:45ff7fc8a431 89 animate();
taylorza 4:45ff7fc8a431 90 }
taylorza 4:45ff7fc8a431 91 }
taylorza 2:97d01ba6cd91 92 }
taylorza 4:45ff7fc8a431 93
taylorza 4:45ff7fc8a431 94 if (GameInput::isCirclePressed())
taylorza 2:97d01ba6cd91 95 {
taylorza 4:45ff7fc8a431 96 if (GameInput::isLeftPressed()) _jumpX = -1;
taylorza 4:45ff7fc8a431 97 else if (GameInput::isRightPressed()) _jumpX = 1;
taylorza 4:45ff7fc8a431 98 else _jumpX = 0;
taylorza 4:45ff7fc8a431 99
taylorza 4:45ff7fc8a431 100 if (_state == OnLadder || isLadderAbove())
taylorza 4:45ff7fc8a431 101 {
taylorza 4:45ff7fc8a431 102 _forceLeaveLadder = true;
taylorza 4:45ff7fc8a431 103 }
taylorza 4:45ff7fc8a431 104
taylorza 4:45ff7fc8a431 105 if (_state != OnLadder || _jumpX != 0 || _forceLeaveLadder)
taylorza 4:45ff7fc8a431 106 {
taylorza 4:45ff7fc8a431 107 _state = Jumping;
taylorza 4:45ff7fc8a431 108 PLAY_EFFECT(0, Sound_PlayerJumping);
taylorza 4:45ff7fc8a431 109 _jumpY = 0;
taylorza 4:45ff7fc8a431 110 }
taylorza 2:97d01ba6cd91 111 }
taylorza 4:45ff7fc8a431 112
taylorza 4:45ff7fc8a431 113 if (GameInput::isUpPressed())
taylorza 4:45ff7fc8a431 114 {
taylorza 4:45ff7fc8a431 115 if (_state == OnLadder || isLadderAbove())
taylorza 4:45ff7fc8a431 116 {
taylorza 4:45ff7fc8a431 117 if(moveUp())
taylorza 4:45ff7fc8a431 118 {
taylorza 11:9ae9a88a1da8 119 _state = OnLadder;
taylorza 4:45ff7fc8a431 120 animate();
taylorza 4:45ff7fc8a431 121 }
taylorza 4:45ff7fc8a431 122 else
taylorza 4:45ff7fc8a431 123 {
taylorza 4:45ff7fc8a431 124 _state = Stopped;
taylorza 4:45ff7fc8a431 125 }
taylorza 4:45ff7fc8a431 126 }
taylorza 4:45ff7fc8a431 127 }
taylorza 4:45ff7fc8a431 128 else if (GameInput::isDownPressed())
taylorza 4:45ff7fc8a431 129 {
taylorza 4:45ff7fc8a431 130 if (_state == OnLadder || isLadderBelow())
taylorza 4:45ff7fc8a431 131 {
taylorza 4:45ff7fc8a431 132 if(moveDown())
taylorza 4:45ff7fc8a431 133 {
taylorza 4:45ff7fc8a431 134 _state = OnLadder;
taylorza 4:45ff7fc8a431 135 animate();
taylorza 4:45ff7fc8a431 136 }
taylorza 4:45ff7fc8a431 137 else
taylorza 4:45ff7fc8a431 138 {
taylorza 4:45ff7fc8a431 139 _state = Stopped;
taylorza 4:45ff7fc8a431 140 }
taylorza 4:45ff7fc8a431 141 }
taylorza 4:45ff7fc8a431 142 else if (isLadderAbove() && isOpenBelow())
taylorza 4:45ff7fc8a431 143 {
taylorza 4:45ff7fc8a431 144 _forceLeaveLadder = true;
taylorza 4:45ff7fc8a431 145 }
taylorza 4:45ff7fc8a431 146 }
taylorza 2:97d01ba6cd91 147 }
taylorza 2:97d01ba6cd91 148
taylorza 4:45ff7fc8a431 149 if (_state != Jumping && _state != OnLadder)
taylorza 4:45ff7fc8a431 150 {
taylorza 4:45ff7fc8a431 151 if (isLadderAbove() && !_forceLeaveLadder)
taylorza 2:97d01ba6cd91 152 {
taylorza 4:45ff7fc8a431 153 _state = OnLadder;
taylorza 4:45ff7fc8a431 154 }
taylorza 4:45ff7fc8a431 155 else if (fall())
taylorza 4:45ff7fc8a431 156 {
taylorza 4:45ff7fc8a431 157 _state = Falling;
taylorza 4:45ff7fc8a431 158 alignX();
taylorza 4:45ff7fc8a431 159 }
taylorza 4:45ff7fc8a431 160 else
taylorza 4:45ff7fc8a431 161 {
taylorza 4:45ff7fc8a431 162 _state = Stopped;
taylorza 4:45ff7fc8a431 163 }
taylorza 0:2ee0812e2615 164 }
taylorza 2:97d01ba6cd91 165
taylorza 4:45ff7fc8a431 166 if (_state == Jumping)
taylorza 4:45ff7fc8a431 167 {
taylorza 4:45ff7fc8a431 168 if (isLadderAbove() && !_forceLeaveLadder)
taylorza 4:45ff7fc8a431 169 {
taylorza 4:45ff7fc8a431 170 _state = Stopped;
taylorza 4:45ff7fc8a431 171 _jumpY = 0;
taylorza 4:45ff7fc8a431 172 }
taylorza 4:45ff7fc8a431 173 else if (_jumpY < 10)
taylorza 4:45ff7fc8a431 174 {
taylorza 4:45ff7fc8a431 175 if (moveUp())
taylorza 4:45ff7fc8a431 176 ++_jumpY;
taylorza 4:45ff7fc8a431 177 else
taylorza 4:45ff7fc8a431 178 _jumpY = 10;
taylorza 4:45ff7fc8a431 179 }
taylorza 4:45ff7fc8a431 180 else if (!moveDown())
taylorza 4:45ff7fc8a431 181 {
taylorza 4:45ff7fc8a431 182 _state = Stopped;
taylorza 4:45ff7fc8a431 183 _jumpY = 0;
taylorza 4:45ff7fc8a431 184 }
taylorza 4:45ff7fc8a431 185
taylorza 4:45ff7fc8a431 186 if (_state == Jumping)
taylorza 2:97d01ba6cd91 187 {
taylorza 4:45ff7fc8a431 188 if (_jumpX < 0)
taylorza 4:45ff7fc8a431 189 {
taylorza 11:9ae9a88a1da8 190 if (!moveLeft()) _jumpX = 0;
taylorza 11:9ae9a88a1da8 191 //moveLeft();
taylorza 4:45ff7fc8a431 192 }
taylorza 4:45ff7fc8a431 193 else if (_jumpX > 0)
taylorza 4:45ff7fc8a431 194 {
taylorza 11:9ae9a88a1da8 195 if (!moveRight()) _jumpX = 0;
taylorza 11:9ae9a88a1da8 196 //moveRight();
taylorza 4:45ff7fc8a431 197 }
taylorza 4:45ff7fc8a431 198 animate();
taylorza 4:45ff7fc8a431 199 }
taylorza 4:45ff7fc8a431 200 }
taylorza 4:45ff7fc8a431 201
taylorza 4:45ff7fc8a431 202 const Block *obj = detectBlock();
taylorza 4:45ff7fc8a431 203 if (obj != NULL && obj->getType() == Block::Pickup)
taylorza 4:45ff7fc8a431 204 {
taylorza 4:45ff7fc8a431 205 if (pickupObject())
taylorza 4:45ff7fc8a431 206 {
taylorza 4:45ff7fc8a431 207 if (obj->getData() == 1)
taylorza 2:97d01ba6cd91 208 {
taylorza 4:45ff7fc8a431 209 Game::Instance->addScore(25);
taylorza 4:45ff7fc8a431 210 PLAY_EFFECT(0, Sound_NewScreen);
taylorza 4:45ff7fc8a431 211 Game::Instance->completeScreen();
taylorza 2:97d01ba6cd91 212 }
taylorza 2:97d01ba6cd91 213 else
taylorza 2:97d01ba6cd91 214 {
taylorza 4:45ff7fc8a431 215 Game::Instance->addScore(10);
taylorza 4:45ff7fc8a431 216 PLAY_EFFECT(0, Sound_PickupItem);
taylorza 2:97d01ba6cd91 217 }
taylorza 2:97d01ba6cd91 218 }
taylorza 2:97d01ba6cd91 219 }
taylorza 4:45ff7fc8a431 220
taylorza 4:45ff7fc8a431 221 if (detectCollision() != NULL || detectBlock()->getType() == Block::Deadly)
taylorza 2:97d01ba6cd91 222 {
taylorza 4:45ff7fc8a431 223 _state = Dying;
taylorza 4:45ff7fc8a431 224 counter = 0;
taylorza 4:45ff7fc8a431 225 if (Game::Instance->getLives() > 1) PLAY_EFFECT(1, Sound_PlayerDying);
taylorza 0:2ee0812e2615 226 }
taylorza 0:2ee0812e2615 227 }
taylorza 2:97d01ba6cd91 228 }
taylorza 2:97d01ba6cd91 229
taylorza 2:97d01ba6cd91 230 virtual void draw()
taylorza 2:97d01ba6cd91 231 {
taylorza 4:45ff7fc8a431 232 GameObject::draw();
taylorza 0:2ee0812e2615 233 }
taylorza 0:2ee0812e2615 234
taylorza 0:2ee0812e2615 235 private:
taylorza 0:2ee0812e2615 236 State _state;
taylorza 2:97d01ba6cd91 237 int8_t _jumpY;
taylorza 2:97d01ba6cd91 238 int8_t _jumpX;
taylorza 4:45ff7fc8a431 239 bool _introMode;
taylorza 4:45ff7fc8a431 240 bool _forceLeaveLadder;
taylorza 4:45ff7fc8a431 241
taylorza 2:97d01ba6cd91 242 };