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@0:2ee0812e2615, 2014-11-29 (annotated)
- 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?
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 | 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 | */ |