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.
Player.h@16:f9227904afc4, 2015-02-16 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |