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:
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?

UserRevisionLine numberNew 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 };