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