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@3:a93fe5f207f5, 2014-12-27 (annotated)
- Committer:
- taylorza
- Date:
- Sat Dec 27 23:24:30 2014 +0000
- Revision:
- 3:a93fe5f207f5
- Parent:
- 2:97d01ba6cd91
- Child:
- 4:45ff7fc8a431
Working before fixed point audio
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
taylorza | 3:a93fe5f207f5 | 1 | CREATE_EFFECT(effect1) |
taylorza | 3:a93fe5f207f5 | 2 | TONE(40, 1400, 16384, -20077, 128, 0), |
taylorza | 3:a93fe5f207f5 | 3 | END_EFFECT |
taylorza | 3:a93fe5f207f5 | 4 | |
taylorza | 0:2ee0812e2615 | 5 | class Player : public GameObject |
taylorza | 0:2ee0812e2615 | 6 | { |
taylorza | 0:2ee0812e2615 | 7 | public: |
taylorza | 2:97d01ba6cd91 | 8 | enum State { Stopped, Walking, Jumping, Falling, OnLadder }; |
taylorza | 0:2ee0812e2615 | 9 | |
taylorza | 0:2ee0812e2615 | 10 | Player(Game &game) : |
taylorza | 0:2ee0812e2615 | 11 | GameObject(game), |
taylorza | 0:2ee0812e2615 | 12 | _state(Stopped), |
taylorza | 0:2ee0812e2615 | 13 | _jumpY(0), |
taylorza | 0:2ee0812e2615 | 14 | _jumpX(0) |
taylorza | 0:2ee0812e2615 | 15 | { |
taylorza | 3:a93fe5f207f5 | 16 | setCollisionRect(2, 0, 11, 16); |
taylorza | 0:2ee0812e2615 | 17 | } |
taylorza | 0:2ee0812e2615 | 18 | |
taylorza | 2:97d01ba6cd91 | 19 | void alignX() |
taylorza | 0:2ee0812e2615 | 20 | { |
taylorza | 2:97d01ba6cd91 | 21 | if (getX() % 8 != 0) |
taylorza | 2:97d01ba6cd91 | 22 | { |
taylorza | 2:97d01ba6cd91 | 23 | int8_t dx = getLastXDirection(); |
taylorza | 3:a93fe5f207f5 | 24 | if (dx < 0) moveLeft(); |
taylorza | 3:a93fe5f207f5 | 25 | else if (dx > 0) moveRight(); |
taylorza | 2:97d01ba6cd91 | 26 | } |
taylorza | 2:97d01ba6cd91 | 27 | } |
taylorza | 2:97d01ba6cd91 | 28 | |
taylorza | 2:97d01ba6cd91 | 29 | virtual void update() |
taylorza | 2:97d01ba6cd91 | 30 | { |
taylorza | 2:97d01ba6cd91 | 31 | if (_state == OnLadder && !isLadderBelow() ) _state = Stopped; |
taylorza | 2:97d01ba6cd91 | 32 | if (_state == OnLadder) setSpriteId(1); |
taylorza | 2:97d01ba6cd91 | 33 | else setSpriteId(0); |
taylorza | 0:2ee0812e2615 | 34 | |
taylorza | 0:2ee0812e2615 | 35 | if (_state != Jumping && _state != Falling) |
taylorza | 0:2ee0812e2615 | 36 | { |
taylorza | 2:97d01ba6cd91 | 37 | if (_state != OnLadder) |
taylorza | 2:97d01ba6cd91 | 38 | { |
taylorza | 2:97d01ba6cd91 | 39 | if (GameInput::isLeftPressed()) |
taylorza | 2:97d01ba6cd91 | 40 | { |
taylorza | 2:97d01ba6cd91 | 41 | _state = moveLeft() ? Walking : Stopped; |
taylorza | 2:97d01ba6cd91 | 42 | animate(); |
taylorza | 2:97d01ba6cd91 | 43 | } |
taylorza | 2:97d01ba6cd91 | 44 | else if (GameInput::isRightPressed()) |
taylorza | 2:97d01ba6cd91 | 45 | { |
taylorza | 2:97d01ba6cd91 | 46 | _state = moveRight() ? Walking : Stopped; |
taylorza | 2:97d01ba6cd91 | 47 | animate(); |
taylorza | 2:97d01ba6cd91 | 48 | } |
taylorza | 2:97d01ba6cd91 | 49 | } |
taylorza | 2:97d01ba6cd91 | 50 | |
taylorza | 2:97d01ba6cd91 | 51 | if (GameInput::isCirclePressed()) |
taylorza | 2:97d01ba6cd91 | 52 | { |
taylorza | 2:97d01ba6cd91 | 53 | if (GameInput::isLeftPressed()) _jumpX = -1; |
taylorza | 2:97d01ba6cd91 | 54 | else if (GameInput::isRightPressed()) _jumpX = 1; |
taylorza | 2:97d01ba6cd91 | 55 | else _jumpX = 0; |
taylorza | 2:97d01ba6cd91 | 56 | |
taylorza | 2:97d01ba6cd91 | 57 | if (_state != OnLadder || _jumpX != 0) |
taylorza | 2:97d01ba6cd91 | 58 | { |
taylorza | 2:97d01ba6cd91 | 59 | _state = Jumping; |
taylorza | 3:a93fe5f207f5 | 60 | _jumpY = 0; |
taylorza | 3:a93fe5f207f5 | 61 | PLAY_EFFECT(effect1); |
taylorza | 2:97d01ba6cd91 | 62 | } |
taylorza | 0:2ee0812e2615 | 63 | } |
taylorza | 2:97d01ba6cd91 | 64 | |
taylorza | 2:97d01ba6cd91 | 65 | if (GameInput::isUpPressed()) |
taylorza | 2:97d01ba6cd91 | 66 | { |
taylorza | 2:97d01ba6cd91 | 67 | if (isLadderAbove() || _state == OnLadder) |
taylorza | 2:97d01ba6cd91 | 68 | { |
taylorza | 2:97d01ba6cd91 | 69 | if(moveUp()) |
taylorza | 2:97d01ba6cd91 | 70 | { |
taylorza | 2:97d01ba6cd91 | 71 | _state = OnLadder; |
taylorza | 2:97d01ba6cd91 | 72 | animate(); |
taylorza | 2:97d01ba6cd91 | 73 | } |
taylorza | 2:97d01ba6cd91 | 74 | else |
taylorza | 2:97d01ba6cd91 | 75 | { |
taylorza | 2:97d01ba6cd91 | 76 | _state = Stopped; |
taylorza | 2:97d01ba6cd91 | 77 | } |
taylorza | 2:97d01ba6cd91 | 78 | } |
taylorza | 2:97d01ba6cd91 | 79 | } |
taylorza | 2:97d01ba6cd91 | 80 | else if (GameInput::isDownPressed()) |
taylorza | 2:97d01ba6cd91 | 81 | { |
taylorza | 2:97d01ba6cd91 | 82 | if (isLadderBelow() || _state == OnLadder) |
taylorza | 2:97d01ba6cd91 | 83 | { |
taylorza | 2:97d01ba6cd91 | 84 | if(moveDown()) |
taylorza | 2:97d01ba6cd91 | 85 | { |
taylorza | 2:97d01ba6cd91 | 86 | _state = OnLadder; |
taylorza | 2:97d01ba6cd91 | 87 | animate(); |
taylorza | 2:97d01ba6cd91 | 88 | } |
taylorza | 2:97d01ba6cd91 | 89 | else |
taylorza | 2:97d01ba6cd91 | 90 | { |
taylorza | 2:97d01ba6cd91 | 91 | _state = Stopped; |
taylorza | 2:97d01ba6cd91 | 92 | } |
taylorza | 2:97d01ba6cd91 | 93 | } |
taylorza | 2:97d01ba6cd91 | 94 | } |
taylorza | 0:2ee0812e2615 | 95 | } |
taylorza | 0:2ee0812e2615 | 96 | |
taylorza | 2:97d01ba6cd91 | 97 | if (_state != Jumping && _state != OnLadder) |
taylorza | 2:97d01ba6cd91 | 98 | { |
taylorza | 2:97d01ba6cd91 | 99 | if (fall()) |
taylorza | 2:97d01ba6cd91 | 100 | { |
taylorza | 2:97d01ba6cd91 | 101 | _state = Falling; |
taylorza | 2:97d01ba6cd91 | 102 | alignX(); |
taylorza | 0:2ee0812e2615 | 103 | } |
taylorza | 0:2ee0812e2615 | 104 | else |
taylorza | 0:2ee0812e2615 | 105 | { |
taylorza | 2:97d01ba6cd91 | 106 | _state = Stopped; |
taylorza | 0:2ee0812e2615 | 107 | } |
taylorza | 0:2ee0812e2615 | 108 | } |
taylorza | 0:2ee0812e2615 | 109 | |
taylorza | 0:2ee0812e2615 | 110 | if (_state == Jumping) |
taylorza | 0:2ee0812e2615 | 111 | { |
taylorza | 3:a93fe5f207f5 | 112 | if (_jumpY < 10 && moveUp()) |
taylorza | 2:97d01ba6cd91 | 113 | { |
taylorza | 2:97d01ba6cd91 | 114 | ++_jumpY; |
taylorza | 3:a93fe5f207f5 | 115 | } |
taylorza | 2:97d01ba6cd91 | 116 | else if (!moveDown()) |
taylorza | 0:2ee0812e2615 | 117 | { |
taylorza | 2:97d01ba6cd91 | 118 | _state = Stopped; |
taylorza | 2:97d01ba6cd91 | 119 | _jumpY = 0; |
taylorza | 0:2ee0812e2615 | 120 | } |
taylorza | 2:97d01ba6cd91 | 121 | |
taylorza | 2:97d01ba6cd91 | 122 | if (_state != Stopped) |
taylorza | 0:2ee0812e2615 | 123 | { |
taylorza | 2:97d01ba6cd91 | 124 | if (_jumpX < 0) { moveLeft(); } |
taylorza | 2:97d01ba6cd91 | 125 | else if (_jumpX > 0) { moveRight(); } |
taylorza | 2:97d01ba6cd91 | 126 | animate(); |
taylorza | 2:97d01ba6cd91 | 127 | } |
taylorza | 2:97d01ba6cd91 | 128 | } |
taylorza | 2:97d01ba6cd91 | 129 | } |
taylorza | 2:97d01ba6cd91 | 130 | |
taylorza | 2:97d01ba6cd91 | 131 | virtual void draw() |
taylorza | 2:97d01ba6cd91 | 132 | { |
taylorza | 2:97d01ba6cd91 | 133 | GameObject::draw(); |
taylorza | 2:97d01ba6cd91 | 134 | |
taylorza | 3:a93fe5f207f5 | 135 | if (detectCollision() != NULL || detectBlock()->getType() == Block::Deadly) |
taylorza | 2:97d01ba6cd91 | 136 | { |
taylorza | 3:a93fe5f207f5 | 137 | Game::Surface.drawRect(getX(), getY(), getX() + 15, getY() + 15, Color565::Green); |
taylorza | 3:a93fe5f207f5 | 138 | } |
taylorza | 0:2ee0812e2615 | 139 | } |
taylorza | 0:2ee0812e2615 | 140 | |
taylorza | 0:2ee0812e2615 | 141 | private: |
taylorza | 0:2ee0812e2615 | 142 | State _state; |
taylorza | 2:97d01ba6cd91 | 143 | int8_t _jumpY; |
taylorza | 2:97d01ba6cd91 | 144 | int8_t _jumpX; |
taylorza | 2:97d01ba6cd91 | 145 | }; |