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:
Thu Dec 04 03:13:14 2014 +0000
Revision:
2:97d01ba6cd91
Parent:
1:ecf7bbccddc1
Child:
3:a93fe5f207f5
Improved ladder and jump handling.
; Minimized sprite overlap when composing background and foreground with sprites

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 2:97d01ba6cd91 4 enum State { Stopped, Walking, Jumping, Falling, OnLadder };
taylorza 0:2ee0812e2615 5
taylorza 0:2ee0812e2615 6 Player(Game &game) :
taylorza 0:2ee0812e2615 7 GameObject(game),
taylorza 0:2ee0812e2615 8 _state(Stopped),
taylorza 0:2ee0812e2615 9 _jumpY(0),
taylorza 0:2ee0812e2615 10 _jumpX(0)
taylorza 0:2ee0812e2615 11 {
taylorza 0:2ee0812e2615 12 }
taylorza 0:2ee0812e2615 13
taylorza 2:97d01ba6cd91 14 void alignX()
taylorza 0:2ee0812e2615 15 {
taylorza 2:97d01ba6cd91 16 if (getX() % 8 != 0)
taylorza 2:97d01ba6cd91 17 {
taylorza 2:97d01ba6cd91 18 int8_t dx = getLastXDirection();
taylorza 2:97d01ba6cd91 19 if (dx == -1) moveLeft();
taylorza 2:97d01ba6cd91 20 else if (dx == 1) moveRight();
taylorza 2:97d01ba6cd91 21 }
taylorza 2:97d01ba6cd91 22 }
taylorza 2:97d01ba6cd91 23
taylorza 2:97d01ba6cd91 24 virtual void update()
taylorza 2:97d01ba6cd91 25 {
taylorza 2:97d01ba6cd91 26 if (_state == OnLadder && !isLadderBelow() ) _state = Stopped;
taylorza 2:97d01ba6cd91 27 if (_state == OnLadder) setSpriteId(1);
taylorza 2:97d01ba6cd91 28 else setSpriteId(0);
taylorza 0:2ee0812e2615 29
taylorza 0:2ee0812e2615 30 if (_state != Jumping && _state != Falling)
taylorza 0:2ee0812e2615 31 {
taylorza 2:97d01ba6cd91 32 if (_state != OnLadder)
taylorza 2:97d01ba6cd91 33 {
taylorza 2:97d01ba6cd91 34 if (GameInput::isLeftPressed())
taylorza 2:97d01ba6cd91 35 {
taylorza 2:97d01ba6cd91 36 _state = moveLeft() ? Walking : Stopped;
taylorza 2:97d01ba6cd91 37 animate();
taylorza 2:97d01ba6cd91 38 }
taylorza 2:97d01ba6cd91 39 else if (GameInput::isRightPressed())
taylorza 2:97d01ba6cd91 40 {
taylorza 2:97d01ba6cd91 41 _state = moveRight() ? Walking : Stopped;
taylorza 2:97d01ba6cd91 42 animate();
taylorza 2:97d01ba6cd91 43 }
taylorza 2:97d01ba6cd91 44 }
taylorza 2:97d01ba6cd91 45
taylorza 2:97d01ba6cd91 46 if (GameInput::isCirclePressed())
taylorza 2:97d01ba6cd91 47 {
taylorza 2:97d01ba6cd91 48 if (GameInput::isLeftPressed()) _jumpX = -1;
taylorza 2:97d01ba6cd91 49 else if (GameInput::isRightPressed()) _jumpX = 1;
taylorza 2:97d01ba6cd91 50 else _jumpX = 0;
taylorza 2:97d01ba6cd91 51
taylorza 2:97d01ba6cd91 52 if (_state != OnLadder || _jumpX != 0)
taylorza 2:97d01ba6cd91 53 {
taylorza 2:97d01ba6cd91 54 _state = Jumping;
taylorza 2:97d01ba6cd91 55 _jumpY = 0;
taylorza 2:97d01ba6cd91 56 }
taylorza 0:2ee0812e2615 57 }
taylorza 2:97d01ba6cd91 58
taylorza 2:97d01ba6cd91 59 if (GameInput::isUpPressed())
taylorza 2:97d01ba6cd91 60 {
taylorza 2:97d01ba6cd91 61 if (isLadderAbove() || _state == OnLadder)
taylorza 2:97d01ba6cd91 62 {
taylorza 2:97d01ba6cd91 63 if(moveUp())
taylorza 2:97d01ba6cd91 64 {
taylorza 2:97d01ba6cd91 65 _state = OnLadder;
taylorza 2:97d01ba6cd91 66 animate();
taylorza 2:97d01ba6cd91 67 }
taylorza 2:97d01ba6cd91 68 else
taylorza 2:97d01ba6cd91 69 {
taylorza 2:97d01ba6cd91 70 _state = Stopped;
taylorza 2:97d01ba6cd91 71 }
taylorza 2:97d01ba6cd91 72 }
taylorza 2:97d01ba6cd91 73 }
taylorza 2:97d01ba6cd91 74 else if (GameInput::isDownPressed())
taylorza 2:97d01ba6cd91 75 {
taylorza 2:97d01ba6cd91 76 if (isLadderBelow() || _state == OnLadder)
taylorza 2:97d01ba6cd91 77 {
taylorza 2:97d01ba6cd91 78 if(moveDown())
taylorza 2:97d01ba6cd91 79 {
taylorza 2:97d01ba6cd91 80 _state = OnLadder;
taylorza 2:97d01ba6cd91 81 animate();
taylorza 2:97d01ba6cd91 82 }
taylorza 2:97d01ba6cd91 83 else
taylorza 2:97d01ba6cd91 84 {
taylorza 2:97d01ba6cd91 85 _state = Stopped;
taylorza 2:97d01ba6cd91 86 }
taylorza 2:97d01ba6cd91 87 }
taylorza 2:97d01ba6cd91 88 }
taylorza 0:2ee0812e2615 89 }
taylorza 0:2ee0812e2615 90
taylorza 2:97d01ba6cd91 91 if (_state != Jumping && _state != OnLadder)
taylorza 2:97d01ba6cd91 92 {
taylorza 2:97d01ba6cd91 93 if (fall())
taylorza 2:97d01ba6cd91 94 {
taylorza 2:97d01ba6cd91 95 _state = Falling;
taylorza 2:97d01ba6cd91 96 alignX();
taylorza 0:2ee0812e2615 97 }
taylorza 0:2ee0812e2615 98 else
taylorza 0:2ee0812e2615 99 {
taylorza 2:97d01ba6cd91 100 _state = Stopped;
taylorza 0:2ee0812e2615 101 }
taylorza 0:2ee0812e2615 102 }
taylorza 0:2ee0812e2615 103
taylorza 0:2ee0812e2615 104 if (_state == Jumping)
taylorza 0:2ee0812e2615 105 {
taylorza 2:97d01ba6cd91 106 if (_jumpY < 11 && moveUp())
taylorza 2:97d01ba6cd91 107 {
taylorza 2:97d01ba6cd91 108 ++_jumpY;
taylorza 2:97d01ba6cd91 109 }
taylorza 2:97d01ba6cd91 110 else if (!moveDown())
taylorza 0:2ee0812e2615 111 {
taylorza 2:97d01ba6cd91 112 _state = Stopped;
taylorza 2:97d01ba6cd91 113 _jumpY = 0;
taylorza 0:2ee0812e2615 114 }
taylorza 2:97d01ba6cd91 115
taylorza 2:97d01ba6cd91 116 if (_state != Stopped)
taylorza 0:2ee0812e2615 117 {
taylorza 2:97d01ba6cd91 118 if (_jumpX < 0) { moveLeft(); }
taylorza 2:97d01ba6cd91 119 else if (_jumpX > 0) { moveRight(); }
taylorza 2:97d01ba6cd91 120 animate();
taylorza 2:97d01ba6cd91 121 }
taylorza 2:97d01ba6cd91 122 }
taylorza 2:97d01ba6cd91 123 }
taylorza 2:97d01ba6cd91 124
taylorza 2:97d01ba6cd91 125 virtual void draw()
taylorza 2:97d01ba6cd91 126 {
taylorza 2:97d01ba6cd91 127 GameObject::draw();
taylorza 2:97d01ba6cd91 128
taylorza 2:97d01ba6cd91 129 if (detectCollision() != NULL)
taylorza 2:97d01ba6cd91 130 {
taylorza 2:97d01ba6cd91 131 Game::Screen.drawRect(getX(), getY(), getX() + 15, getY() + 15, Color565::Green);
taylorza 2:97d01ba6cd91 132 }
taylorza 0:2ee0812e2615 133 }
taylorza 0:2ee0812e2615 134
taylorza 0:2ee0812e2615 135 private:
taylorza 0:2ee0812e2615 136 State _state;
taylorza 2:97d01ba6cd91 137 int8_t _jumpY;
taylorza 2:97d01ba6cd91 138 int8_t _jumpX;
taylorza 2:97d01ba6cd91 139 };