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.
main.cpp@2:97d01ba6cd91, 2014-12-04 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
taylorza | 0:2ee0812e2615 | 1 | #include "GameEngine.h" |
taylorza | 0:2ee0812e2615 | 2 | #include "SpriteSheet.h" |
taylorza | 0:2ee0812e2615 | 3 | #include "Player.h" |
taylorza | 1:ecf7bbccddc1 | 4 | #include "PatrollingEnemy.h" |
taylorza | 2:97d01ba6cd91 | 5 | #include "BouncingEnemy.h" |
taylorza | 0:2ee0812e2615 | 6 | #include "font_IBM.h" |
taylorza | 0:2ee0812e2615 | 7 | |
taylorza | 0:2ee0812e2615 | 8 | // Block images |
taylorza | 0:2ee0812e2615 | 9 | static const ImageFrame emptyBlock(bmp, 0, 0, 8, 8); |
taylorza | 2:97d01ba6cd91 | 10 | static const ImageFrame brickBlock(bmp, 16, 48, 8, 8); |
taylorza | 2:97d01ba6cd91 | 11 | static const ImageFrame meshFenceTopBlock(bmp, 24, 48, 8, 8); |
taylorza | 2:97d01ba6cd91 | 12 | static const ImageFrame meshFenceBlock(bmp, 32, 48, 8, 8); |
taylorza | 2:97d01ba6cd91 | 13 | static const ImageFrame platformBlock(bmp, 40, 48, 8, 8); |
taylorza | 2:97d01ba6cd91 | 14 | static const ImageFrame brickTrimBlock(bmp, 48, 48, 8, 8); |
taylorza | 2:97d01ba6cd91 | 15 | static const ImageFrame leftLadderBlock(bmp, 16, 56, 8, 8); |
taylorza | 2:97d01ba6cd91 | 16 | static const ImageFrame rightLadderBlock(bmp, 24, 56, 8, 8); |
taylorza | 2:97d01ba6cd91 | 17 | static const ImageFrame wallBlock(bmp, 56, 48, 8, 8); |
taylorza | 0:2ee0812e2615 | 18 | |
taylorza | 0:2ee0812e2615 | 19 | // Sprite images |
taylorza | 0:2ee0812e2615 | 20 | static const ImageFrame playerWalk1(bmp, 0, 0, 16, 16); |
taylorza | 0:2ee0812e2615 | 21 | static const ImageFrame playerWalk2(bmp, 16, 0, 16, 16); |
taylorza | 0:2ee0812e2615 | 22 | static const ImageFrame playerWalk3(bmp, 32, 0, 16, 16); |
taylorza | 0:2ee0812e2615 | 23 | static const ImageFrame playerWalk4(bmp, 48, 0, 16, 16); |
taylorza | 0:2ee0812e2615 | 24 | |
taylorza | 2:97d01ba6cd91 | 25 | static const ImageFrame playerClimb1(bmp, 0, 64, 16, 16); |
taylorza | 2:97d01ba6cd91 | 26 | static const ImageFrame playerClimb2(bmp, 16, 64, 16, 16); |
taylorza | 2:97d01ba6cd91 | 27 | static const ImageFrame playerClimb3(bmp, 32, 64, 16, 16); |
taylorza | 2:97d01ba6cd91 | 28 | static const ImageFrame playerClimb4(bmp, 48, 64, 16, 16); |
taylorza | 2:97d01ba6cd91 | 29 | |
taylorza | 0:2ee0812e2615 | 30 | static const ImageFrame angryBird1(bmp, 0, 16, 16, 16); |
taylorza | 0:2ee0812e2615 | 31 | static const ImageFrame angryBird2(bmp, 16, 16, 16, 16); |
taylorza | 0:2ee0812e2615 | 32 | static const ImageFrame angryBird3(bmp, 32, 16, 16, 16); |
taylorza | 0:2ee0812e2615 | 33 | static const ImageFrame angryBird4(bmp, 48, 16, 16, 16); |
taylorza | 0:2ee0812e2615 | 34 | |
taylorza | 1:ecf7bbccddc1 | 35 | static const ImageFrame mineCart1(bmp, 0, 32, 16, 16); |
taylorza | 1:ecf7bbccddc1 | 36 | static const ImageFrame mineCart2(bmp, 16, 32, 16, 16); |
taylorza | 1:ecf7bbccddc1 | 37 | static const ImageFrame mineCart3(bmp, 32, 32, 16, 16); |
taylorza | 1:ecf7bbccddc1 | 38 | static const ImageFrame mineCart4(bmp, 48, 32, 16, 16); |
taylorza | 1:ecf7bbccddc1 | 39 | |
taylorza | 1:ecf7bbccddc1 | 40 | static const ImageFrame bubble1(bmp, 0, 48, 16, 16); |
taylorza | 1:ecf7bbccddc1 | 41 | |
taylorza | 0:2ee0812e2615 | 42 | // Blocks |
taylorza | 0:2ee0812e2615 | 43 | const Block blocks[] = |
taylorza | 0:2ee0812e2615 | 44 | { |
taylorza | 0:2ee0812e2615 | 45 | Block(&emptyBlock, Block::Background, 0, 0), // 0 - Empty block |
taylorza | 0:2ee0812e2615 | 46 | Block(&brickBlock, Block::Solid, 2, 0), // 1 - Brick - Red on black |
taylorza | 0:2ee0812e2615 | 47 | Block(&meshFenceTopBlock, Block::Background, 1, 0), // 2 - Mesh fence top - Blue on black |
taylorza | 0:2ee0812e2615 | 48 | Block(&meshFenceBlock, Block::Background, 1, 0), // 3 - Mesh fence - Blue on black |
taylorza | 0:2ee0812e2615 | 49 | Block(&platformBlock, Block::Platform, 5, 0), // 4 - Platform - Cyan on black |
taylorza | 0:2ee0812e2615 | 50 | Block(&brickTrimBlock, Block::Background, 2, 0), // 5 - Brick trim - Red on black |
taylorza | 2:97d01ba6cd91 | 51 | Block(&leftLadderBlock, Block::Ladder, 6, 0), // 6 - Left ladder half - Yellow on black |
taylorza | 2:97d01ba6cd91 | 52 | Block(&rightLadderBlock, Block::Ladder, 6, 0), // 7 - Right ladder half - Yellow on black |
taylorza | 2:97d01ba6cd91 | 53 | Block(&wallBlock, Block::Ladder, 5, 0), // 8 - Wall - Cyan on black |
taylorza | 0:2ee0812e2615 | 54 | }; |
taylorza | 0:2ee0812e2615 | 55 | |
taylorza | 0:2ee0812e2615 | 56 | // Sprite animation sequences |
taylorza | 0:2ee0812e2615 | 57 | const ImageFrame *playerWalking[] = { &playerWalk1, &playerWalk2, &playerWalk3, &playerWalk4, NULL }; |
taylorza | 2:97d01ba6cd91 | 58 | const ImageFrame *playerClimbing[] = { &playerClimb1, &playerClimb2, &playerClimb3, &playerClimb4, NULL }; |
taylorza | 0:2ee0812e2615 | 59 | const ImageFrame *angryBird[] = { &angryBird1, &angryBird2, &angryBird3, &angryBird4, NULL }; |
taylorza | 1:ecf7bbccddc1 | 60 | const ImageFrame *mineCart[] = { &mineCart1, &mineCart2, &mineCart3, &mineCart4, NULL }; |
taylorza | 1:ecf7bbccddc1 | 61 | const ImageFrame *bubble[] = { &bubble1, NULL }; |
taylorza | 0:2ee0812e2615 | 62 | |
taylorza | 0:2ee0812e2615 | 63 | // Sprites |
taylorza | 0:2ee0812e2615 | 64 | Sprite sprites[] = |
taylorza | 0:2ee0812e2615 | 65 | { |
taylorza | 0:2ee0812e2615 | 66 | Sprite(playerWalking, 7), // 0 - Player walking |
taylorza | 2:97d01ba6cd91 | 67 | Sprite(playerClimbing, 7), // 1 - Player climbing |
taylorza | 2:97d01ba6cd91 | 68 | Sprite(angryBird, 6), // 2 - Angry bird |
taylorza | 2:97d01ba6cd91 | 69 | Sprite(mineCart, 6), // 3 - Mine cart |
taylorza | 2:97d01ba6cd91 | 70 | Sprite(bubble, 1) // 4 - Bubble |
taylorza | 0:2ee0812e2615 | 71 | }; |
taylorza | 0:2ee0812e2615 | 72 | |
taylorza | 0:2ee0812e2615 | 73 | static const uint8_t map[] = { |
taylorza | 0:2ee0812e2615 | 74 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
taylorza | 2:97d01ba6cd91 | 75 | 1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1, |
taylorza | 0:2ee0812e2615 | 76 | 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, |
taylorza | 0:2ee0812e2615 | 77 | 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, |
taylorza | 0:2ee0812e2615 | 78 | 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, |
taylorza | 0:2ee0812e2615 | 79 | 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, |
taylorza | 2:97d01ba6cd91 | 80 | 1,4,6,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1, |
taylorza | 2:97d01ba6cd91 | 81 | 1,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, |
taylorza | 2:97d01ba6cd91 | 82 | 1,0,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, |
taylorza | 2:97d01ba6cd91 | 83 | 1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,7,4,1, |
taylorza | 2:97d01ba6cd91 | 84 | 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,7,2,1, |
taylorza | 2:97d01ba6cd91 | 85 | 1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,7,3,1, |
taylorza | 2:97d01ba6cd91 | 86 | 1,4,6,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1, |
taylorza | 2:97d01ba6cd91 | 87 | 1,2,6,7,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1, |
taylorza | 2:97d01ba6cd91 | 88 | 1,3,6,7,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,1, |
taylorza | 0:2ee0812e2615 | 89 | 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
taylorza | 0:2ee0812e2615 | 90 | }; |
taylorza | 0:2ee0812e2615 | 91 | |
taylorza | 0:2ee0812e2615 | 92 | class MyGame : public Game |
taylorza | 0:2ee0812e2615 | 93 | { |
taylorza | 0:2ee0812e2615 | 94 | public: |
taylorza | 0:2ee0812e2615 | 95 | MyGame() : |
taylorza | 0:2ee0812e2615 | 96 | _player(*this), |
taylorza | 2:97d01ba6cd91 | 97 | _enemy1(*this, 3, PatrollingEnemy::LeftRight), |
taylorza | 2:97d01ba6cd91 | 98 | _enemy2(*this, 4) |
taylorza | 0:2ee0812e2615 | 99 | { |
taylorza | 2:97d01ba6cd91 | 100 | _player.setStartPosition(130, 96); |
taylorza | 2:97d01ba6cd91 | 101 | _enemy1.setStartPosition(80, 80); |
taylorza | 2:97d01ba6cd91 | 102 | _enemy2.setStartPosition(8, 8); |
taylorza | 0:2ee0812e2615 | 103 | setMap(map, 20, 16, blocks, sprites); |
taylorza | 2:97d01ba6cd91 | 104 | |
taylorza | 2:97d01ba6cd91 | 105 | addGameObject(&_player); |
taylorza | 2:97d01ba6cd91 | 106 | addGameObject(&_enemy1); |
taylorza | 2:97d01ba6cd91 | 107 | addGameObject(&_enemy2); |
taylorza | 0:2ee0812e2615 | 108 | } |
taylorza | 0:2ee0812e2615 | 109 | |
taylorza | 0:2ee0812e2615 | 110 | private: |
taylorza | 0:2ee0812e2615 | 111 | Player _player; |
taylorza | 0:2ee0812e2615 | 112 | PatrollingEnemy _enemy1; |
taylorza | 2:97d01ba6cd91 | 113 | BouncingEnemy _enemy2; |
taylorza | 0:2ee0812e2615 | 114 | |
taylorza | 0:2ee0812e2615 | 115 | protected: |
taylorza | 0:2ee0812e2615 | 116 | virtual void update(float elapsedTime) |
taylorza | 0:2ee0812e2615 | 117 | { |
taylorza | 2:97d01ba6cd91 | 118 | Game::update(elapsedTime); |
taylorza | 0:2ee0812e2615 | 119 | wait_ms(32); |
taylorza | 0:2ee0812e2615 | 120 | } |
taylorza | 0:2ee0812e2615 | 121 | }; |
taylorza | 0:2ee0812e2615 | 122 | |
taylorza | 0:2ee0812e2615 | 123 | int main() |
taylorza | 0:2ee0812e2615 | 124 | { |
taylorza | 0:2ee0812e2615 | 125 | DigitalOut led1(P0_9); |
taylorza | 0:2ee0812e2615 | 126 | led1 = 1; |
taylorza | 0:2ee0812e2615 | 127 | |
taylorza | 0:2ee0812e2615 | 128 | MyGame game; |
taylorza | 0:2ee0812e2615 | 129 | game.run(); |
taylorza | 0:2ee0812e2615 | 130 | } |
taylorza | 2:97d01ba6cd91 | 131 |