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 Nov 29 06:40:50 2014 +0000
Revision:
0:2ee0812e2615
Child:
1:ecf7bbccddc1
Working engine with patrolling enemies

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 0:2ee0812e2615 4 #include "font_IBM.h"
taylorza 0:2ee0812e2615 5
taylorza 0:2ee0812e2615 6 // Block images
taylorza 0:2ee0812e2615 7 static const ImageFrame emptyBlock(bmp, 0, 0, 8, 8);
taylorza 0:2ee0812e2615 8 static const ImageFrame brickBlock(bmp, 0, 32, 8, 8);
taylorza 0:2ee0812e2615 9 static const ImageFrame meshFenceTopBlock(bmp, 8, 32, 8, 8);
taylorza 0:2ee0812e2615 10 static const ImageFrame meshFenceBlock(bmp, 16, 32, 8, 8);
taylorza 0:2ee0812e2615 11 static const ImageFrame platformBlock(bmp, 24, 32, 8, 8);
taylorza 0:2ee0812e2615 12 static const ImageFrame brickTrimBlock(bmp, 32, 32, 8, 8);
taylorza 0:2ee0812e2615 13
taylorza 0:2ee0812e2615 14 // Sprite images
taylorza 0:2ee0812e2615 15 static const ImageFrame playerWalk1(bmp, 0, 0, 16, 16);
taylorza 0:2ee0812e2615 16 static const ImageFrame playerWalk2(bmp, 16, 0, 16, 16);
taylorza 0:2ee0812e2615 17 static const ImageFrame playerWalk3(bmp, 32, 0, 16, 16);
taylorza 0:2ee0812e2615 18 static const ImageFrame playerWalk4(bmp, 48, 0, 16, 16);
taylorza 0:2ee0812e2615 19
taylorza 0:2ee0812e2615 20 static const ImageFrame angryBird1(bmp, 0, 16, 16, 16);
taylorza 0:2ee0812e2615 21 static const ImageFrame angryBird2(bmp, 16, 16, 16, 16);
taylorza 0:2ee0812e2615 22 static const ImageFrame angryBird3(bmp, 32, 16, 16, 16);
taylorza 0:2ee0812e2615 23 static const ImageFrame angryBird4(bmp, 48, 16, 16, 16);
taylorza 0:2ee0812e2615 24
taylorza 0:2ee0812e2615 25 // Blocks
taylorza 0:2ee0812e2615 26 const Block blocks[] =
taylorza 0:2ee0812e2615 27 {
taylorza 0:2ee0812e2615 28 Block(&emptyBlock, Block::Background, 0, 0), // 0 - Empty block
taylorza 0:2ee0812e2615 29 Block(&brickBlock, Block::Solid, 2, 0), // 1 - Brick - Red on black
taylorza 0:2ee0812e2615 30 Block(&meshFenceTopBlock, Block::Background, 1, 0), // 2 - Mesh fence top - Blue on black
taylorza 0:2ee0812e2615 31 Block(&meshFenceBlock, Block::Background, 1, 0), // 3 - Mesh fence - Blue on black
taylorza 0:2ee0812e2615 32 Block(&platformBlock, Block::Platform, 5, 0), // 4 - Platform - Cyan on black
taylorza 0:2ee0812e2615 33 Block(&brickTrimBlock, Block::Background, 2, 0), // 5 - Brick trim - Red on black
taylorza 0:2ee0812e2615 34 };
taylorza 0:2ee0812e2615 35
taylorza 0:2ee0812e2615 36 // Sprite animation sequences
taylorza 0:2ee0812e2615 37 const ImageFrame *playerWalking[] = { &playerWalk1, &playerWalk2, &playerWalk3, &playerWalk4, NULL };
taylorza 0:2ee0812e2615 38 const ImageFrame *angryBird[] = { &angryBird1, &angryBird2, &angryBird3, &angryBird4, NULL };
taylorza 0:2ee0812e2615 39
taylorza 0:2ee0812e2615 40 // Sprites
taylorza 0:2ee0812e2615 41 Sprite sprites[] =
taylorza 0:2ee0812e2615 42 {
taylorza 0:2ee0812e2615 43 Sprite(playerWalking, 7), // 0 - Player walking
taylorza 0:2ee0812e2615 44 Sprite(angryBird, 6) // 1 - Angry bird
taylorza 0:2ee0812e2615 45 };
taylorza 0:2ee0812e2615 46
taylorza 0:2ee0812e2615 47 static const uint8_t map[] = {
taylorza 0:2ee0812e2615 48 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
taylorza 0:2ee0812e2615 49 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
taylorza 0:2ee0812e2615 50 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
taylorza 0:2ee0812e2615 51 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
taylorza 0:2ee0812e2615 52 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
taylorza 0:2ee0812e2615 53 1,4,4,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,
taylorza 0:2ee0812e2615 54 1,0,0,0,5,1,1,1,0,0,0,1,1,2,2,1,1,0,0,1,
taylorza 0:2ee0812e2615 55 1,4,4,0,0,0,5,1,0,0,0,1,1,3,3,1,1,0,0,1,
taylorza 0:2ee0812e2615 56 1,0,0,0,0,0,0,0,0,0,0,5,1,1,1,1,5,0,0,1,
taylorza 0:2ee0812e2615 57 1,4,4,0,0,0,0,0,0,0,0,0,5,5,5,5,0,0,0,1,
taylorza 0:2ee0812e2615 58 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
taylorza 0:2ee0812e2615 59 1,1,1,1,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
taylorza 0:2ee0812e2615 60 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,5,1,1,1,1,
taylorza 0:2ee0812e2615 61 1,1,1,1,4,4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
taylorza 0:2ee0812e2615 62 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
taylorza 0:2ee0812e2615 63 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
taylorza 0:2ee0812e2615 64 };
taylorza 0:2ee0812e2615 65
taylorza 0:2ee0812e2615 66 class PatrollingEnemy : public GameObject
taylorza 0:2ee0812e2615 67 {
taylorza 0:2ee0812e2615 68 public:
taylorza 0:2ee0812e2615 69 PatrollingEnemy(Game &game) :
taylorza 0:2ee0812e2615 70 GameObject(game),
taylorza 0:2ee0812e2615 71 _movingUp(false)
taylorza 0:2ee0812e2615 72 {
taylorza 0:2ee0812e2615 73 setSpriteId(1);
taylorza 0:2ee0812e2615 74 }
taylorza 0:2ee0812e2615 75
taylorza 0:2ee0812e2615 76 virtual void update()
taylorza 0:2ee0812e2615 77 {
taylorza 0:2ee0812e2615 78 if (_movingUp)
taylorza 0:2ee0812e2615 79 {
taylorza 0:2ee0812e2615 80 _movingUp = moveUp();
taylorza 0:2ee0812e2615 81 }
taylorza 0:2ee0812e2615 82 else
taylorza 0:2ee0812e2615 83 {
taylorza 0:2ee0812e2615 84 _movingUp = !moveDown();
taylorza 0:2ee0812e2615 85 }
taylorza 0:2ee0812e2615 86 animate();
taylorza 0:2ee0812e2615 87 }
taylorza 0:2ee0812e2615 88
taylorza 0:2ee0812e2615 89 private:
taylorza 0:2ee0812e2615 90 bool _movingUp;
taylorza 0:2ee0812e2615 91 };
taylorza 0:2ee0812e2615 92
taylorza 0:2ee0812e2615 93 class MyGame : public Game
taylorza 0:2ee0812e2615 94 {
taylorza 0:2ee0812e2615 95 public:
taylorza 0:2ee0812e2615 96 MyGame() :
taylorza 0:2ee0812e2615 97 _player(*this),
taylorza 0:2ee0812e2615 98 _enemy1(*this)
taylorza 0:2ee0812e2615 99 {
taylorza 0:2ee0812e2615 100 _player.setStartPosition(100, 96);
taylorza 0:2ee0812e2615 101 _enemy1.setStartPosition(104, 16);
taylorza 0:2ee0812e2615 102 setMap(map, 20, 16, blocks, sprites);
taylorza 0:2ee0812e2615 103 }
taylorza 0:2ee0812e2615 104
taylorza 0:2ee0812e2615 105 private:
taylorza 0:2ee0812e2615 106 Player _player;
taylorza 0:2ee0812e2615 107 PatrollingEnemy _enemy1;
taylorza 0:2ee0812e2615 108
taylorza 0:2ee0812e2615 109 protected:
taylorza 0:2ee0812e2615 110 virtual void update(float elapsedTime)
taylorza 0:2ee0812e2615 111 {
taylorza 0:2ee0812e2615 112 _player.update();
taylorza 0:2ee0812e2615 113 _enemy1.update();
taylorza 0:2ee0812e2615 114 wait_ms(32);
taylorza 0:2ee0812e2615 115 }
taylorza 0:2ee0812e2615 116
taylorza 0:2ee0812e2615 117 virtual void draw(float elapsedTime)
taylorza 0:2ee0812e2615 118 {
taylorza 0:2ee0812e2615 119 _player.draw();
taylorza 0:2ee0812e2615 120 _enemy1.draw();
taylorza 0:2ee0812e2615 121 }
taylorza 0:2ee0812e2615 122 };
taylorza 0:2ee0812e2615 123
taylorza 0:2ee0812e2615 124 int main()
taylorza 0:2ee0812e2615 125 {
taylorza 0:2ee0812e2615 126 DigitalOut led1(P0_9);
taylorza 0:2ee0812e2615 127 led1 = 1;
taylorza 0:2ee0812e2615 128
taylorza 0:2ee0812e2615 129 MyGame game;
taylorza 0:2ee0812e2615 130 game.run();
taylorza 0:2ee0812e2615 131 }
taylorza 0:2ee0812e2615 132 /*
taylorza 0:2ee0812e2615 133 void draw(Block &block, int x, int y)
taylorza 0:2ee0812e2615 134 {
taylorza 0:2ee0812e2615 135 uint8_t fc = block.getForegroundColor();
taylorza 0:2ee0812e2615 136 uint8_t fch = (fc << 4) & 0xf0;
taylorza 0:2ee0812e2615 137 uint8_t fcl = fc & 0x0f;
taylorza 0:2ee0812e2615 138
taylorza 0:2ee0812e2615 139 uint8_t bc = block.getBackgroundColor();
taylorza 0:2ee0812e2615 140 uint8_t bch = (bc << 4) & 0xf0;
taylorza 0:2ee0812e2615 141 uint8_t bcl = bc & 0x0f;
taylorza 0:2ee0812e2615 142
taylorza 0:2ee0812e2615 143 uint8_t *bitmap = _bmp8x8.getBitmapData();
taylorza 0:2ee0812e2615 144 int offset = 0;
taylorza 0:2ee0812e2615 145 for (int iy = 0; iy < 8; ++iy)
taylorza 0:2ee0812e2615 146 {
taylorza 0:2ee0812e2615 147 uint8_t b = *block.getBits(iy);
taylorza 0:2ee0812e2615 148 bitmap[offset] = b & 0x80 ? ((bitmap[offset] & 0x0f) | fch) : ((bitmap[offset] & 0x0f) | bch);
taylorza 0:2ee0812e2615 149 bitmap[offset] = b & 0x40 ? ((bitmap[offset] & 0xf0) | fcl) : ((bitmap[offset] & 0xf0) | bcl);
taylorza 0:2ee0812e2615 150 ++offset;
taylorza 0:2ee0812e2615 151
taylorza 0:2ee0812e2615 152 bitmap[offset] = b & 0x20 ? ((bitmap[offset] & 0x0f) | fch) : ((bitmap[offset] & 0x0f) | bch);
taylorza 0:2ee0812e2615 153 bitmap[offset] = b & 0x10 ? ((bitmap[offset] & 0xf0) | fcl) : ((bitmap[offset] & 0xf0) | bcl);
taylorza 0:2ee0812e2615 154 ++offset;
taylorza 0:2ee0812e2615 155
taylorza 0:2ee0812e2615 156 bitmap[offset] = b & 0x08 ? ((bitmap[offset] & 0x0f) | fch) : ((bitmap[offset] & 0x0f) | bch);
taylorza 0:2ee0812e2615 157 bitmap[offset] = b & 0x04 ? ((bitmap[offset] & 0xf0) | fcl) : ((bitmap[offset] & 0xf0) | bcl);
taylorza 0:2ee0812e2615 158 ++offset;
taylorza 0:2ee0812e2615 159
taylorza 0:2ee0812e2615 160 bitmap[offset] = b & 0x02 ? ((bitmap[offset] & 0x0f) | fch) : ((bitmap[offset] & 0x0f) | bch);
taylorza 0:2ee0812e2615 161 bitmap[offset] = b & 0x01 ? ((bitmap[offset] & 0xf0) | fcl) : ((bitmap[offset] & 0xf0) | bcl);
taylorza 0:2ee0812e2615 162 ++offset;
taylorza 0:2ee0812e2615 163 }
taylorza 0:2ee0812e2615 164 lcd.drawBitmap(x, y, _bmp8x8, 0, 0, 8, 8);
taylorza 0:2ee0812e2615 165 }
taylorza 0:2ee0812e2615 166
taylorza 0:2ee0812e2615 167 void compose(Block &block, int x, int y)
taylorza 0:2ee0812e2615 168 {
taylorza 0:2ee0812e2615 169 uint8_t *bitmap = _composedBitmap.getBitmapData();
taylorza 0:2ee0812e2615 170 int offsetRow = (y * _composedBitmap.getStride()) + (x >> 1);
taylorza 0:2ee0812e2615 171
taylorza 0:2ee0812e2615 172 uint8_t fc = block.getForegroundColor();
taylorza 0:2ee0812e2615 173 uint8_t fch = (fc << 4) & 0xf0;
taylorza 0:2ee0812e2615 174 uint8_t fcl = fc & 0x0f;
taylorza 0:2ee0812e2615 175
taylorza 0:2ee0812e2615 176 uint8_t bc = block.getBackgroundColor();
taylorza 0:2ee0812e2615 177 uint8_t bch = (bc << 4) & 0xf0;
taylorza 0:2ee0812e2615 178 uint8_t bcl = bc & 0x0f;
taylorza 0:2ee0812e2615 179
taylorza 0:2ee0812e2615 180 for (int iy = 0; iy < 8; ++iy, offsetRow += _composedBitmap.getStride())
taylorza 0:2ee0812e2615 181 {
taylorza 0:2ee0812e2615 182 int offset = offsetRow;
taylorza 0:2ee0812e2615 183 uint8_t b = *block.getBits(iy);
taylorza 0:2ee0812e2615 184 bool highNibble = ((x & 0x01) == 0);
taylorza 0:2ee0812e2615 185 for(int c = 0; c < 8; ++c, b <<= 1)
taylorza 0:2ee0812e2615 186 {
taylorza 0:2ee0812e2615 187 if (b & 0x80)
taylorza 0:2ee0812e2615 188 {
taylorza 0:2ee0812e2615 189 if (highNibble) bitmap[offset] = ((bitmap[offset] & 0x0f) | fch);
taylorza 0:2ee0812e2615 190 else
taylorza 0:2ee0812e2615 191 {
taylorza 0:2ee0812e2615 192 bitmap[offset] = ((bitmap[offset] & 0xf0) | fcl);
taylorza 0:2ee0812e2615 193 ++offset;
taylorza 0:2ee0812e2615 194 }
taylorza 0:2ee0812e2615 195 }
taylorza 0:2ee0812e2615 196 else
taylorza 0:2ee0812e2615 197 {
taylorza 0:2ee0812e2615 198 if (highNibble) bitmap[offset] = ((bitmap[offset] & 0x0f) | bch);
taylorza 0:2ee0812e2615 199 else
taylorza 0:2ee0812e2615 200 {
taylorza 0:2ee0812e2615 201 bitmap[offset] = ((bitmap[offset] & 0xf0) | bcl);
taylorza 0:2ee0812e2615 202 ++offset;
taylorza 0:2ee0812e2615 203 }
taylorza 0:2ee0812e2615 204 }
taylorza 0:2ee0812e2615 205 highNibble = !highNibble;
taylorza 0:2ee0812e2615 206 }
taylorza 0:2ee0812e2615 207 }
taylorza 0:2ee0812e2615 208 }
taylorza 0:2ee0812e2615 209
taylorza 0:2ee0812e2615 210
taylorza 0:2ee0812e2615 211 void compose(Sprite &sprite, int x, int y, bool flip)
taylorza 0:2ee0812e2615 212 {
taylorza 0:2ee0812e2615 213 uint8_t *bitmap = _composedBitmap.getBitmapData();
taylorza 0:2ee0812e2615 214
taylorza 0:2ee0812e2615 215 int offsetRow = (y * _composedBitmap.getStride()) + (x >> 1);
taylorza 0:2ee0812e2615 216
taylorza 0:2ee0812e2615 217 uint8_t fc = sprite.getForegroundColor();
taylorza 0:2ee0812e2615 218 uint8_t fch = (fc << 4) & 0xf0;
taylorza 0:2ee0812e2615 219 uint8_t fcl = fc & 0x0f;
taylorza 0:2ee0812e2615 220
taylorza 0:2ee0812e2615 221 if (!flip)
taylorza 0:2ee0812e2615 222 {
taylorza 0:2ee0812e2615 223 for (int iy = 0; iy < 16; ++iy, offsetRow += _composedBitmap.getStride())
taylorza 0:2ee0812e2615 224 {
taylorza 0:2ee0812e2615 225 int offset = offsetRow;
taylorza 0:2ee0812e2615 226 uint8_t *p = sprite.getBits(iy);
taylorza 0:2ee0812e2615 227 bool highNibble = ((x & 0x01) == 0);
taylorza 0:2ee0812e2615 228 for (int ix = 0; ix < 2; ++ix)
taylorza 0:2ee0812e2615 229 {
taylorza 0:2ee0812e2615 230 uint8_t b = *p++;
taylorza 0:2ee0812e2615 231 for(int c = 0; c < 8; ++c, b <<= 1)
taylorza 0:2ee0812e2615 232 {
taylorza 0:2ee0812e2615 233 if (b & 0x80)
taylorza 0:2ee0812e2615 234 {
taylorza 0:2ee0812e2615 235 if (highNibble) bitmap[offset] = ((bitmap[offset] & 0x0f) | fch);
taylorza 0:2ee0812e2615 236 else
taylorza 0:2ee0812e2615 237 {
taylorza 0:2ee0812e2615 238 bitmap[offset] = ((bitmap[offset] & 0xf0) | fcl);
taylorza 0:2ee0812e2615 239 offset++;
taylorza 0:2ee0812e2615 240 }
taylorza 0:2ee0812e2615 241 }
taylorza 0:2ee0812e2615 242 else if (!highNibble)
taylorza 0:2ee0812e2615 243 {
taylorza 0:2ee0812e2615 244 offset++;
taylorza 0:2ee0812e2615 245 }
taylorza 0:2ee0812e2615 246 highNibble = !highNibble;
taylorza 0:2ee0812e2615 247 }
taylorza 0:2ee0812e2615 248 }
taylorza 0:2ee0812e2615 249 }
taylorza 0:2ee0812e2615 250 }
taylorza 0:2ee0812e2615 251 else
taylorza 0:2ee0812e2615 252 {
taylorza 0:2ee0812e2615 253 for (int iy = 0; iy < 16; ++iy, offsetRow += _composedBitmap.getStride())
taylorza 0:2ee0812e2615 254 {
taylorza 0:2ee0812e2615 255 int offset = offsetRow;
taylorza 0:2ee0812e2615 256 uint8_t *p = sprite.getBits(iy) + 1;
taylorza 0:2ee0812e2615 257 bool highNibble = ((x & 0x01) == 0);
taylorza 0:2ee0812e2615 258 for (int ix = 0; ix < 2; ++ix)
taylorza 0:2ee0812e2615 259 {
taylorza 0:2ee0812e2615 260 uint8_t b = *p--;
taylorza 0:2ee0812e2615 261 for(int c = 0; c < 8; ++c, b >>= 1)
taylorza 0:2ee0812e2615 262 {
taylorza 0:2ee0812e2615 263 if (b & 0x01)
taylorza 0:2ee0812e2615 264 {
taylorza 0:2ee0812e2615 265 if (highNibble) bitmap[offset] = ((bitmap[offset] & 0x0f) | fch);
taylorza 0:2ee0812e2615 266 else
taylorza 0:2ee0812e2615 267 {
taylorza 0:2ee0812e2615 268 bitmap[offset] = ((bitmap[offset] & 0xf0) | fcl);
taylorza 0:2ee0812e2615 269 offset++;
taylorza 0:2ee0812e2615 270 }
taylorza 0:2ee0812e2615 271 }
taylorza 0:2ee0812e2615 272 else if (!highNibble)
taylorza 0:2ee0812e2615 273 {
taylorza 0:2ee0812e2615 274 offset++;
taylorza 0:2ee0812e2615 275 }
taylorza 0:2ee0812e2615 276 highNibble = !highNibble;
taylorza 0:2ee0812e2615 277 }
taylorza 0:2ee0812e2615 278 }
taylorza 0:2ee0812e2615 279 }
taylorza 0:2ee0812e2615 280 }
taylorza 0:2ee0812e2615 281 }
taylorza 0:2ee0812e2615 282
taylorza 0:2ee0812e2615 283 void drawScreen(uint8_t *screen)
taylorza 0:2ee0812e2615 284 {
taylorza 0:2ee0812e2615 285 int yOffset = 0;
taylorza 0:2ee0812e2615 286 for(int y = 0; y < 16; ++y, yOffset += 20)
taylorza 0:2ee0812e2615 287 {
taylorza 0:2ee0812e2615 288 for (int x = 0; x < 20; ++x)
taylorza 0:2ee0812e2615 289 {
taylorza 0:2ee0812e2615 290 uint8_t blockId = screen[yOffset + x];
taylorza 0:2ee0812e2615 291 if (blockId != 0)
taylorza 0:2ee0812e2615 292 {
taylorza 0:2ee0812e2615 293 Block &block = blocks[blockId];
taylorza 0:2ee0812e2615 294 draw(block, x * 8, y * 8);
taylorza 0:2ee0812e2615 295 }
taylorza 0:2ee0812e2615 296 }
taylorza 0:2ee0812e2615 297 }
taylorza 0:2ee0812e2615 298 }
taylorza 0:2ee0812e2615 299
taylorza 0:2ee0812e2615 300 void drawSprite(uint8_t *screen, Sprite &sprite, int x, int y, int dx, int dy, bool flip)
taylorza 0:2ee0812e2615 301 {
taylorza 0:2ee0812e2615 302 int cellX = x / 8;
taylorza 0:2ee0812e2615 303 int cellY = y / 8;
taylorza 0:2ee0812e2615 304 int rx = x % 8;
taylorza 0:2ee0812e2615 305 int ry = y % 8;
taylorza 0:2ee0812e2615 306
taylorza 0:2ee0812e2615 307 if (rx == 0 && dx == 1 && cellX > 0) { --cellX; rx += 8; }
taylorza 0:2ee0812e2615 308 if (ry == 0 && dy == 1 && cellY > 0) { --cellY; ry += 8; }
taylorza 0:2ee0812e2615 309
taylorza 0:2ee0812e2615 310 _composedBitmap.clear();
taylorza 0:2ee0812e2615 311 // Compose blocks
taylorza 0:2ee0812e2615 312 for (int cy = 0; cy < 3; ++cy)
taylorza 0:2ee0812e2615 313 {
taylorza 0:2ee0812e2615 314 int yOffset = (cellY + cy) * 20;
taylorza 0:2ee0812e2615 315 for (int cx = 0; cx < 3; ++cx)
taylorza 0:2ee0812e2615 316 {
taylorza 0:2ee0812e2615 317 uint8_t blockId = screen[yOffset + cellX + cx];
taylorza 0:2ee0812e2615 318 if (blockId != 0)
taylorza 0:2ee0812e2615 319 {
taylorza 0:2ee0812e2615 320 Block &block = blocks[blockId];
taylorza 0:2ee0812e2615 321 compose(block, cx * 8, cy * 8);
taylorza 0:2ee0812e2615 322 }
taylorza 0:2ee0812e2615 323 }
taylorza 0:2ee0812e2615 324 }
taylorza 0:2ee0812e2615 325
taylorza 0:2ee0812e2615 326 // Compose sprite
taylorza 0:2ee0812e2615 327 compose(sprite, rx, ry, flip);
taylorza 0:2ee0812e2615 328
taylorza 0:2ee0812e2615 329 // Render the composed image
taylorza 0:2ee0812e2615 330 lcd.drawBitmap(cellX * 8, cellY * 8, _composedBitmap, 0, 0, 24, 24);
taylorza 0:2ee0812e2615 331 }
taylorza 0:2ee0812e2615 332
taylorza 0:2ee0812e2615 333 int main()
taylorza 0:2ee0812e2615 334 {
taylorza 0:2ee0812e2615 335 DigitalOut led1(P0_9);
taylorza 0:2ee0812e2615 336 led1 = 1;
taylorza 0:2ee0812e2615 337
taylorza 0:2ee0812e2615 338 lcd.setOrientation(LCD_ST7735::Rotate270, false);
taylorza 0:2ee0812e2615 339
taylorza 0:2ee0812e2615 340 drawScreen(screen0);
taylorza 0:2ee0812e2615 341
taylorza 0:2ee0812e2615 342 int px = 80;
taylorza 0:2ee0812e2615 343 int py = 15;
taylorza 0:2ee0812e2615 344 int dx = 0;
taylorza 0:2ee0812e2615 345 int dy = 0;
taylorza 0:2ee0812e2615 346 bool flip = false;
taylorza 0:2ee0812e2615 347 char buffer[50];
taylorza 0:2ee0812e2615 348 while (true)
taylorza 0:2ee0812e2615 349 {
taylorza 0:2ee0812e2615 350 if (GameInput::isLeftPressed() && px > 8) { dx = -1; px--; flip = false; wait_ms(16); sprites[0].animate(); }
taylorza 0:2ee0812e2615 351 if (GameInput::isRightPressed() && px < 136) { dx = 1; px++; flip = true; wait_ms(16); sprites[0].animate();}
taylorza 0:2ee0812e2615 352 if (GameInput::isUpPressed() && py > 8) { dy = -1; py--; wait_ms(16); sprites[0].animate();}
taylorza 0:2ee0812e2615 353 if (GameInput::isDownPressed() && py < 104) { dy = 1; py++; wait_ms(16); sprites[0].animate();}
taylorza 0:2ee0812e2615 354
taylorza 0:2ee0812e2615 355 drawSprite(screen0, sprites[0], px, py, dx, dy, flip);
taylorza 0:2ee0812e2615 356 drawSprite(screen0, sprites[0], 50, 50, 0, 0, flip);
taylorza 0:2ee0812e2615 357
taylorza 0:2ee0812e2615 358 sprintf(buffer, "%d, %d ", px, py);
taylorza 0:2ee0812e2615 359 lcd.drawString(font_ibm, 0, 0, buffer);
taylorza 0:2ee0812e2615 360 }
taylorza 0:2ee0812e2615 361 */
taylorza 0:2ee0812e2615 362 /*
taylorza 0:2ee0812e2615 363 lcd.drawCircle(50, 50, 35, Color565::Red);
taylorza 0:2ee0812e2615 364 char buffer[100];
taylorza 0:2ee0812e2615 365 Timer timer;
taylorza 0:2ee0812e2615 366 timer.start();
taylorza 0:2ee0812e2615 367 while(true)
taylorza 0:2ee0812e2615 368 {
taylorza 0:2ee0812e2615 369 timer.reset();
taylorza 0:2ee0812e2615 370 for (int sy = 0; sy < 5; sy++)
taylorza 0:2ee0812e2615 371 {
taylorza 0:2ee0812e2615 372 for (int sx = 0; sx < 6; sx++)
taylorza 0:2ee0812e2615 373 {
taylorza 0:2ee0812e2615 374 for (int y = 0; y < 3; y++)
taylorza 0:2ee0812e2615 375 {
taylorza 0:2ee0812e2615 376 for (int x = 0; x < 3; x++)
taylorza 0:2ee0812e2615 377 {
taylorza 0:2ee0812e2615 378 draw(blocks[0], x * 8, y * 8);
taylorza 0:2ee0812e2615 379 }
taylorza 0:2ee0812e2615 380 }
taylorza 0:2ee0812e2615 381
taylorza 0:2ee0812e2615 382 draw(sprite, 5, 5, false);
taylorza 0:2ee0812e2615 383 lcd.drawBitmap(8 + (sx * 24), (sy * 24), _composedBitmap, 0, 0, 24, 24);
taylorza 0:2ee0812e2615 384 }
taylorza 0:2ee0812e2615 385 }
taylorza 0:2ee0812e2615 386 sprite.animate();
taylorza 0:2ee0812e2615 387 float seconds = timer.read_ms();
taylorza 0:2ee0812e2615 388 sprintf(buffer, "%f", seconds);
taylorza 0:2ee0812e2615 389 lcd.drawString(font_ibm, 0, 120, buffer);
taylorza 0:2ee0812e2615 390 //wait_ms(250);
taylorza 0:2ee0812e2615 391 }
taylorza 0:2ee0812e2615 392
taylorza 0:2ee0812e2615 393 */
taylorza 0:2ee0812e2615 394
taylorza 0:2ee0812e2615 395 /*
taylorza 0:2ee0812e2615 396 Bitmap4bpp image(8, 8);
taylorza 0:2ee0812e2615 397
taylorza 0:2ee0812e2615 398 int x = 5;
taylorza 0:2ee0812e2615 399 int y = 5;
taylorza 0:2ee0812e2615 400 int dx = 1;
taylorza 0:2ee0812e2615 401 int dy = 1;
taylorza 0:2ee0812e2615 402 while (true)
taylorza 0:2ee0812e2615 403 {
taylorza 0:2ee0812e2615 404 lcd.drawBitmap(x, y, image, 0, 0, 8, 8);
taylorza 0:2ee0812e2615 405 lcd.drawBitmap(x, y + 12, image, 1, 0, 7, 8);
taylorza 0:2ee0812e2615 406 lcd.drawBitmap(x, y + 24, image, 0, 0, 7, 8);
taylorza 0:2ee0812e2615 407 lcd.drawBitmap(x, y + 36, image, 1, 0, 6, 8);
taylorza 0:2ee0812e2615 408
taylorza 0:2ee0812e2615 409 if (x > 151) dx = -1; else if (x < 1) dx = 1;
taylorza 0:2ee0812e2615 410 if (y > 83) dy = -1; else if (y < 1) dy = 1;
taylorza 0:2ee0812e2615 411 x += dx;
taylorza 0:2ee0812e2615 412 y += dy;
taylorza 0:2ee0812e2615 413 }
taylorza 0:2ee0812e2615 414 */
taylorza 0:2ee0812e2615 415
taylorza 0:2ee0812e2615 416 /*
taylorza 0:2ee0812e2615 417 _composedBitmap[0] = 24;
taylorza 0:2ee0812e2615 418 _composedBitmap[1] = 24;
taylorza 0:2ee0812e2615 419 for (int i = 0; i < 24*24; ++i)
taylorza 0:2ee0812e2615 420 {
taylorza 0:2ee0812e2615 421 _composedBitmap[2+i] = Color565::Green;
taylorza 0:2ee0812e2615 422 }
taylorza 0:2ee0812e2615 423
taylorza 0:2ee0812e2615 424 SpaceGame game;
taylorza 0:2ee0812e2615 425
taylorza 0:2ee0812e2615 426 draw(blocks[0], 0, 0);
taylorza 0:2ee0812e2615 427 draw(blocks[0], 8, 0);
taylorza 0:2ee0812e2615 428 draw(blocks[0], 16, 0);
taylorza 0:2ee0812e2615 429
taylorza 0:2ee0812e2615 430 draw(blocks[0], 0, 8);
taylorza 0:2ee0812e2615 431 draw(blocks[0], 8, 8);
taylorza 0:2ee0812e2615 432 draw(blocks[0], 16, 8);
taylorza 0:2ee0812e2615 433
taylorza 0:2ee0812e2615 434 draw(blocks[0], 0, 16);
taylorza 0:2ee0812e2615 435 draw(blocks[0], 8, 16);
taylorza 0:2ee0812e2615 436 draw(blocks[0], 16, 16);
taylorza 0:2ee0812e2615 437
taylorza 0:2ee0812e2615 438 draw(sprite, 0, 0);
taylorza 0:2ee0812e2615 439
taylorza 0:2ee0812e2615 440 Game::Screen.drawCircle(50, 50, 25, Color565::Blue);
taylorza 0:2ee0812e2615 441 Game::Screen.drawBitmap(50, 50, (const uint16_t*)_composedBitmap);
taylorza 0:2ee0812e2615 442
taylorza 0:2ee0812e2615 443 game.run();
taylorza 0:2ee0812e2615 444
taylorza 0:2ee0812e2615 445 while(true){}
taylorza 0:2ee0812e2615 446 }
taylorza 0:2ee0812e2615 447 */
taylorza 0:2ee0812e2615 448
taylorza 0:2ee0812e2615 449 /*
taylorza 0:2ee0812e2615 450 #include "Color565.h"
taylorza 0:2ee0812e2615 451 #include "font_IBM.h"
taylorza 0:2ee0812e2615 452 #include "SpriteSheet.h"
taylorza 0:2ee0812e2615 453
taylorza 0:2ee0812e2615 454 enum PlayerState
taylorza 0:2ee0812e2615 455 {
taylorza 0:2ee0812e2615 456 Stopped,
taylorza 0:2ee0812e2615 457 Walking,
taylorza 0:2ee0812e2615 458 Falling,
taylorza 0:2ee0812e2615 459 Flying,
taylorza 0:2ee0812e2615 460 };
taylorza 0:2ee0812e2615 461
taylorza 0:2ee0812e2615 462 void drawEnvironment(LCD_ST7735 lcd);
taylorza 0:2ee0812e2615 463 void drawPlatform(LCD_ST7735 lcd, int x, int y, int width, uint16_t color);
taylorza 0:2ee0812e2615 464
taylorza 0:2ee0812e2615 465 int main()
taylorza 0:2ee0812e2615 466 {
taylorza 0:2ee0812e2615 467 LCD_ST7735 lcd(
taylorza 0:2ee0812e2615 468 P0_19,
taylorza 0:2ee0812e2615 469 P0_4, // Reset
taylorza 0:2ee0812e2615 470 P0_5, // DS
taylorza 0:2ee0812e2615 471 P0_21,
taylorza 0:2ee0812e2615 472 P0_22,
taylorza 0:2ee0812e2615 473 P1_15,
taylorza 0:2ee0812e2615 474 P0_2, // CS
taylorza 0:2ee0812e2615 475 LCD_ST7735::RGB);
taylorza 0:2ee0812e2615 476
taylorza 0:2ee0812e2615 477 lcd.setOrientation(LCD_ST7735::Rotate270, false);
taylorza 0:2ee0812e2615 478 lcd.clearScreen();
taylorza 0:2ee0812e2615 479
taylorza 0:2ee0812e2615 480 DigitalOut led1(P0_9);
taylorza 0:2ee0812e2615 481 DigitalOut led2(P0_8);
taylorza 0:2ee0812e2615 482
taylorza 0:2ee0812e2615 483 DigitalIn up(P0_13, PullUp);
taylorza 0:2ee0812e2615 484 DigitalIn down(P0_12, PullUp);
taylorza 0:2ee0812e2615 485 DigitalIn left(P0_14, PullUp);
taylorza 0:2ee0812e2615 486 DigitalIn right(P0_11, PullUp);
taylorza 0:2ee0812e2615 487 DigitalIn square(P0_16, PullUp);
taylorza 0:2ee0812e2615 488 DigitalIn circle(P0_1, PullUp);
taylorza 0:2ee0812e2615 489
taylorza 0:2ee0812e2615 490 PwmOut sound(P0_18);
taylorza 0:2ee0812e2615 491 sound = 0;
taylorza 0:2ee0812e2615 492 sound.period(0.0);
taylorza 0:2ee0812e2615 493
taylorza 0:2ee0812e2615 494 int x = 100;
taylorza 0:2ee0812e2615 495 int y = 5;
taylorza 0:2ee0812e2615 496 bool flip = false;
taylorza 0:2ee0812e2615 497
taylorza 0:2ee0812e2615 498 int frame = 0;
taylorza 0:2ee0812e2615 499
taylorza 0:2ee0812e2615 500 PlayerState state = Walking;
taylorza 0:2ee0812e2615 501 int walkSpeed = 24;
taylorza 0:2ee0812e2615 502 int flySpeed = 6;
taylorza 0:2ee0812e2615 503 int fallSpeed = 10;
taylorza 0:2ee0812e2615 504 int speed = 0;
taylorza 0:2ee0812e2615 505 int speedCounter = 0;
taylorza 0:2ee0812e2615 506
taylorza 0:2ee0812e2615 507 while (true)
taylorza 0:2ee0812e2615 508 {
taylorza 0:2ee0812e2615 509 wait_ms(1);
taylorza 0:2ee0812e2615 510
taylorza 0:2ee0812e2615 511 if (--speedCounter <= 0)
taylorza 0:2ee0812e2615 512 {
taylorza 0:2ee0812e2615 513 if (x < 0) x = 0;
taylorza 0:2ee0812e2615 514 if (x > 160 - 16) x = 160 - 16;
taylorza 0:2ee0812e2615 515 if (y < 0) y = 0;
taylorza 0:2ee0812e2615 516 if (y > 128 - 24) y = 128 - 24;
taylorza 0:2ee0812e2615 517
taylorza 0:2ee0812e2615 518 if (state == Stopped)
taylorza 0:2ee0812e2615 519 {
taylorza 0:2ee0812e2615 520 lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 0, 0, 16, 16, flip);
taylorza 0:2ee0812e2615 521 }
taylorza 0:2ee0812e2615 522 else if (state == Flying || state == Falling)
taylorza 0:2ee0812e2615 523 {
taylorza 0:2ee0812e2615 524 switch(frame)
taylorza 0:2ee0812e2615 525 {
taylorza 0:2ee0812e2615 526 case 0 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 0, 16, 16, 16, flip); break;
taylorza 0:2ee0812e2615 527 case 1 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 16, 16, 16, 16, flip); break;
taylorza 0:2ee0812e2615 528 case 2 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 32, 16, 16, 16, flip); break;
taylorza 0:2ee0812e2615 529 case 3 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 48, 16, 16, 16, flip); break;
taylorza 0:2ee0812e2615 530 }
taylorza 0:2ee0812e2615 531 frame = (frame + 1) % 4;
taylorza 0:2ee0812e2615 532 }
taylorza 0:2ee0812e2615 533 else if (state == Walking)
taylorza 0:2ee0812e2615 534 {
taylorza 0:2ee0812e2615 535 switch(frame)
taylorza 0:2ee0812e2615 536 {
taylorza 0:2ee0812e2615 537 case 0 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 0, 0, 16, 16, flip); break;
taylorza 0:2ee0812e2615 538 case 1 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 16, 0, 16, 16, flip); break;
taylorza 0:2ee0812e2615 539 case 2 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 32, 0, 16, 16, flip); break;
taylorza 0:2ee0812e2615 540 case 3 : lcd.drawGlyph(x, y, Color565::White, Color565::Black, bmp, 48, 0, 16, 16, flip); break;
taylorza 0:2ee0812e2615 541 }
taylorza 0:2ee0812e2615 542 frame = (frame + 1) % 4;
taylorza 0:2ee0812e2615 543 }
taylorza 0:2ee0812e2615 544
taylorza 0:2ee0812e2615 545 if (!up)
taylorza 0:2ee0812e2615 546 {
taylorza 0:2ee0812e2615 547 if (state != Flying)
taylorza 0:2ee0812e2615 548 {
taylorza 0:2ee0812e2615 549 state = Flying;
taylorza 0:2ee0812e2615 550 speed = flySpeed;
taylorza 0:2ee0812e2615 551 frame = 0;
taylorza 0:2ee0812e2615 552 }
taylorza 0:2ee0812e2615 553 else if (y > 2)
taylorza 0:2ee0812e2615 554 {
taylorza 0:2ee0812e2615 555 y--;
taylorza 0:2ee0812e2615 556 }
taylorza 0:2ee0812e2615 557 }
taylorza 0:2ee0812e2615 558 else if (y < 128 - 24)
taylorza 0:2ee0812e2615 559 {
taylorza 0:2ee0812e2615 560 if (state != Falling)
taylorza 0:2ee0812e2615 561 {
taylorza 0:2ee0812e2615 562 state = Falling;
taylorza 0:2ee0812e2615 563 speed = fallSpeed;
taylorza 0:2ee0812e2615 564 frame = 0;
taylorza 0:2ee0812e2615 565 }
taylorza 0:2ee0812e2615 566 y++;
taylorza 0:2ee0812e2615 567 }
taylorza 0:2ee0812e2615 568 else
taylorza 0:2ee0812e2615 569 {
taylorza 0:2ee0812e2615 570 if (state != Stopped && state != Walking)
taylorza 0:2ee0812e2615 571 {
taylorza 0:2ee0812e2615 572 state = Stopped;
taylorza 0:2ee0812e2615 573 frame = 0;
taylorza 0:2ee0812e2615 574 }
taylorza 0:2ee0812e2615 575 }
taylorza 0:2ee0812e2615 576
taylorza 0:2ee0812e2615 577 if (!left || (!flip && state == Walking))
taylorza 0:2ee0812e2615 578 {
taylorza 0:2ee0812e2615 579 if (flip)
taylorza 0:2ee0812e2615 580 {
taylorza 0:2ee0812e2615 581 flip = false;
taylorza 0:2ee0812e2615 582 frame = 0;
taylorza 0:2ee0812e2615 583 }
taylorza 0:2ee0812e2615 584 else
taylorza 0:2ee0812e2615 585 {
taylorza 0:2ee0812e2615 586 if (state == Stopped)
taylorza 0:2ee0812e2615 587 {
taylorza 0:2ee0812e2615 588 state = Walking;
taylorza 0:2ee0812e2615 589 speed = walkSpeed;
taylorza 0:2ee0812e2615 590 frame = 1;
taylorza 0:2ee0812e2615 591 }
taylorza 0:2ee0812e2615 592 else if (state == Walking)
taylorza 0:2ee0812e2615 593 {
taylorza 0:2ee0812e2615 594 if (frame == 0) state = Stopped;
taylorza 0:2ee0812e2615 595 x -= 1;
taylorza 0:2ee0812e2615 596 }
taylorza 0:2ee0812e2615 597 else if (state == Flying || state == Falling)
taylorza 0:2ee0812e2615 598 {
taylorza 0:2ee0812e2615 599 x -= 1;
taylorza 0:2ee0812e2615 600 }
taylorza 0:2ee0812e2615 601 }
taylorza 0:2ee0812e2615 602 }
taylorza 0:2ee0812e2615 603
taylorza 0:2ee0812e2615 604 if (!right || (flip && state == Walking))
taylorza 0:2ee0812e2615 605 {
taylorza 0:2ee0812e2615 606 if (!flip)
taylorza 0:2ee0812e2615 607 {
taylorza 0:2ee0812e2615 608 flip = true;
taylorza 0:2ee0812e2615 609 frame = 0;
taylorza 0:2ee0812e2615 610 }
taylorza 0:2ee0812e2615 611 else
taylorza 0:2ee0812e2615 612 {
taylorza 0:2ee0812e2615 613 if (state == Stopped)
taylorza 0:2ee0812e2615 614 {
taylorza 0:2ee0812e2615 615 state = Walking;
taylorza 0:2ee0812e2615 616 speed = walkSpeed;
taylorza 0:2ee0812e2615 617 frame = 1;
taylorza 0:2ee0812e2615 618 }
taylorza 0:2ee0812e2615 619 else if (state == Walking)
taylorza 0:2ee0812e2615 620 {
taylorza 0:2ee0812e2615 621 if (frame == 0) state = Stopped;
taylorza 0:2ee0812e2615 622 x += 1;
taylorza 0:2ee0812e2615 623 }
taylorza 0:2ee0812e2615 624 else if (state == Flying || state == Falling)
taylorza 0:2ee0812e2615 625 {
taylorza 0:2ee0812e2615 626 x += 1;
taylorza 0:2ee0812e2615 627 }
taylorza 0:2ee0812e2615 628 }
taylorza 0:2ee0812e2615 629 }
taylorza 0:2ee0812e2615 630 speedCounter = speed;
taylorza 0:2ee0812e2615 631 }
taylorza 0:2ee0812e2615 632 }
taylorza 0:2ee0812e2615 633 }
taylorza 0:2ee0812e2615 634
taylorza 0:2ee0812e2615 635 void drawEnvironment(LCD_ST7735 lcd)
taylorza 0:2ee0812e2615 636 {
taylorza 0:2ee0812e2615 637 for (int y = 0; y < 16; ++y)
taylorza 0:2ee0812e2615 638 {
taylorza 0:2ee0812e2615 639 for (int x = 0; x < 20; ++x)
taylorza 0:2ee0812e2615 640 {
taylorza 0:2ee0812e2615 641 int i= y * 20 + x;
taylorza 0:2ee0812e2615 642 switch(environment[i])
taylorza 0:2ee0812e2615 643 {
taylorza 0:2ee0812e2615 644 case 1: lcd.drawGlyph(x * 8, y * 8, Color565::Green, Color565::Black, bmp, 0, 81, 8, 8, false); break;
taylorza 0:2ee0812e2615 645 case 2: lcd.drawGlyph(x * 8, y * 8, Color565::Green, Color565::Black, bmp, 8, 81, 8, 8, false); break;
taylorza 0:2ee0812e2615 646 case 3: lcd.drawGlyph(x * 8, y * 8, Color565::Green, Color565::Black, bmp, 16, 81, 8, 8, false); break;
taylorza 0:2ee0812e2615 647 }
taylorza 0:2ee0812e2615 648 }
taylorza 0:2ee0812e2615 649 }
taylorza 0:2ee0812e2615 650 }
taylorza 0:2ee0812e2615 651
taylorza 0:2ee0812e2615 652 void drawPlatform(LCD_ST7735 lcd, int x, int y, int width, uint16_t color)
taylorza 0:2ee0812e2615 653 {
taylorza 0:2ee0812e2615 654 lcd.drawGlyph(x, y, color, Color565::Black, bmp, 0, 81, 8, 8, false);
taylorza 0:2ee0812e2615 655 lcd.drawGlyph(x + (width - 1) * 8, y, color, Color565::Black, bmp, 16, 81, 8, 8, false);
taylorza 0:2ee0812e2615 656
taylorza 0:2ee0812e2615 657 for(int i = 1; i < width - 1; ++i)
taylorza 0:2ee0812e2615 658 {
taylorza 0:2ee0812e2615 659 lcd.drawGlyph(x + (i * 8), y, color, Color565::Black, bmp, 8, 81, 8, 8, false);
taylorza 0:2ee0812e2615 660 }
taylorza 0:2ee0812e2615 661
taylorza 0:2ee0812e2615 662 }
taylorza 0:2ee0812e2615 663 */