Some snow based on a C64 BASIC routine
Dependencies: PokittoLib
Fork of HelloWorld by
main.cpp@8:5a0d849087f5, 2017-12-06 (annotated)
- Committer:
- spinal
- Date:
- Wed Dec 06 11:17:25 2017 +0000
- Revision:
- 8:5a0d849087f5
- Parent:
- 5:c4a0391b43ac
A Simple snow animation, converted from C64 BASIC
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Pokitto | 0:2d2a3994d55d | 1 | #include "Pokitto.h" |
Pokitto | 0:2d2a3994d55d | 2 | |
Pokitto | 0:2d2a3994d55d | 3 | Pokitto::Core mygame; |
Pokitto | 0:2d2a3994d55d | 4 | |
spinal | 8:5a0d849087f5 | 5 | |
spinal | 8:5a0d849087f5 | 6 | // snow flake data |
spinal | 8:5a0d849087f5 | 7 | const byte PROGMEM frames[60]={ |
spinal | 8:5a0d849087f5 | 8 | 4,8,12,16,12,8,4,0, |
spinal | 8:5a0d849087f5 | 9 | 24,20,24,28,32,36,32,28, |
spinal | 8:5a0d849087f5 | 10 | 56,52,48,44,40,44,48,52, |
spinal | 8:5a0d849087f5 | 11 | 44,48,52,56,52,48,44,40, |
spinal | 8:5a0d849087f5 | 12 | 64,68,72,76,80,76,72,68, |
spinal | 8:5a0d849087f5 | 13 | 64,60,76,80,76,72,68,64, |
spinal | 8:5a0d849087f5 | 14 | 60,64,68,72,96,100,96,92, |
spinal | 8:5a0d849087f5 | 15 | 88,84,88,92}; |
spinal | 8:5a0d849087f5 | 16 | const byte PROGMEM flkimage[104] ={ |
spinal | 8:5a0d849087f5 | 17 | 192,224,96,0,0,96,112,48, |
spinal | 8:5a0d849087f5 | 18 | 0,0,60,24,0,6,14,12, |
spinal | 8:5a0d849087f5 | 19 | 3,7,6,0,128,192,64,0, |
spinal | 8:5a0d849087f5 | 20 | 0,64,96,32,0,0,24,24, |
spinal | 8:5a0d849087f5 | 21 | 0,2,6,4,1,3,2,0, |
spinal | 8:5a0d849087f5 | 22 | 192,128,0,0,0,192,64,0, |
spinal | 8:5a0d849087f5 | 23 | 0,0,48,0,0,12,8,0, |
spinal | 8:5a0d849087f5 | 24 | 12,4,0,0,128,128,0,0, |
spinal | 8:5a0d849087f5 | 25 | 0,128,64,0,0,0,96,0, |
spinal | 8:5a0d849087f5 | 26 | 0,0,48,0,0,16,32,0, |
spinal | 8:5a0d849087f5 | 27 | 16,16,0,0,128,0,0,0, |
spinal | 8:5a0d849087f5 | 28 | 0,128,0,0,0,0,64,0, |
spinal | 8:5a0d849087f5 | 29 | 0,32,0,0,32,0,0,0, |
spinal | 8:5a0d849087f5 | 30 | }; |
spinal | 8:5a0d849087f5 | 31 | int offset[18]={ |
spinal | 8:5a0d849087f5 | 32 | 1,0,8,3,3,6,6,6, |
spinal | 8:5a0d849087f5 | 33 | 6,6,5,5,5,4,0,0, |
spinal | 8:5a0d849087f5 | 34 | 1,3}; |
spinal | 8:5a0d849087f5 | 35 | unsigned char mx[18]={ |
spinal | 8:5a0d849087f5 | 36 | 7,7,9,7,7,9,7,7, |
spinal | 8:5a0d849087f5 | 37 | 9,7,7,9,7,9,7,7, |
spinal | 8:5a0d849087f5 | 38 | 7,7}; |
spinal | 8:5a0d849087f5 | 39 | unsigned char fptrs[18]={ |
spinal | 8:5a0d849087f5 | 40 | 8,16,32,52,24,42,16,8, |
spinal | 8:5a0d849087f5 | 41 | 42,24,52,32,16,32,8,8, |
spinal | 8:5a0d849087f5 | 42 | 0,0}; |
spinal | 8:5a0d849087f5 | 43 | unsigned char vert[18]={ |
spinal | 8:5a0d849087f5 | 44 | 168,24,144,160,16,88,128,120, |
spinal | 8:5a0d849087f5 | 45 | 40,8,56,176,104,56,80,152, |
spinal | 8:5a0d849087f5 | 46 | 152,96}; |
spinal | 8:5a0d849087f5 | 47 | unsigned char countdn[18]={ |
spinal | 8:5a0d849087f5 | 48 | 0,5,1,5,2,2,4,3, |
spinal | 8:5a0d849087f5 | 49 | 2,1,6,5,5,3,2,2, |
spinal | 8:5a0d849087f5 | 50 | 1,0}; |
spinal | 8:5a0d849087f5 | 51 | unsigned char spead[18]={ |
spinal | 8:5a0d849087f5 | 52 | 4,4,4,4,4,4,4,5, |
spinal | 8:5a0d849087f5 | 53 | 5,5,5,5,5,3,3,3, |
spinal | 8:5a0d849087f5 | 54 | 2,1}; |
spinal | 8:5a0d849087f5 | 55 | unsigned char tempimg[72]={ |
spinal | 8:5a0d849087f5 | 56 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 57 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 58 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 59 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 60 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 61 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 62 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 63 | 0,0,0,0,0,0,0,0, |
spinal | 8:5a0d849087f5 | 64 | 0,0,0,0,0,0,0,0}; |
spinal | 8:5a0d849087f5 | 65 | |
spinal | 8:5a0d849087f5 | 66 | int numCols = mygame.display.width/8; |
spinal | 8:5a0d849087f5 | 67 | int maxHeight = mygame.display.height; |
spinal | 8:5a0d849087f5 | 68 | |
spinal | 8:5a0d849087f5 | 69 | unsigned char rowStart[27]; // max width in 8x8 tiles |
spinal | 8:5a0d849087f5 | 70 | unsigned char snowRow[176]; // max height |
spinal | 8:5a0d849087f5 | 71 | |
spinal | 8:5a0d849087f5 | 72 | void updateSnow(){ |
spinal | 8:5a0d849087f5 | 73 | // Main snow-feild code |
spinal | 8:5a0d849087f5 | 74 | //unsigned char ctr=0; |
spinal | 8:5a0d849087f5 | 75 | unsigned char stp = 1; |
spinal | 8:5a0d849087f5 | 76 | for(int loop=17; loop>stp+7; loop-=stp){ // 17 |
spinal | 8:5a0d849087f5 | 77 | countdn[loop]--; |
spinal | 8:5a0d849087f5 | 78 | if(countdn[loop]==0){ |
spinal | 8:5a0d849087f5 | 79 | countdn[loop]=spead[loop]; |
spinal | 8:5a0d849087f5 | 80 | //remove old flake image |
spinal | 8:5a0d849087f5 | 81 | int y = vert[loop]; |
spinal | 8:5a0d849087f5 | 82 | int a=0; |
spinal | 8:5a0d849087f5 | 83 | for(a=0; a<4; a++){ |
spinal | 8:5a0d849087f5 | 84 | snowRow[y] &= (255-tempimg[loop*4+a]); |
spinal | 8:5a0d849087f5 | 85 | y++; if(y>=maxHeight){y=0;} // was 176 |
spinal | 8:5a0d849087f5 | 86 | }//a |
spinal | 8:5a0d849087f5 | 87 | |
spinal | 8:5a0d849087f5 | 88 | // rem calculate new vertical position |
spinal | 8:5a0d849087f5 | 89 | // rem (vert) & frame number (offset) |
spinal | 8:5a0d849087f5 | 90 | vert[loop]++; |
spinal | 8:5a0d849087f5 | 91 | if(vert[loop]>=maxHeight){vert[loop]=0;} |
spinal | 8:5a0d849087f5 | 92 | offset[loop]--; |
spinal | 8:5a0d849087f5 | 93 | if(offset[loop]<0){offset[loop]=mx[loop];} |
spinal | 8:5a0d849087f5 | 94 | // rem get next frame of animation |
spinal | 8:5a0d849087f5 | 95 | y=pgm_read_byte(&frames[fptrs[loop]+offset[loop]]); |
spinal | 8:5a0d849087f5 | 96 | for(a=0; a<4; a++){ |
spinal | 8:5a0d849087f5 | 97 | tempimg[loop*4+a]=pgm_read_byte(&flkimage[y+a]); |
spinal | 8:5a0d849087f5 | 98 | } |
spinal | 8:5a0d849087f5 | 99 | // rem add new frame at new position |
spinal | 8:5a0d849087f5 | 100 | y=vert[loop]; |
spinal | 8:5a0d849087f5 | 101 | for(a=0; a<4; a++){ |
spinal | 8:5a0d849087f5 | 102 | snowRow[y] |= tempimg[loop*4+a]; |
spinal | 8:5a0d849087f5 | 103 | y++; if(y>=maxHeight){y=0;} |
spinal | 8:5a0d849087f5 | 104 | } |
spinal | 8:5a0d849087f5 | 105 | |
spinal | 8:5a0d849087f5 | 106 | } // countdn |
spinal | 8:5a0d849087f5 | 107 | }// loop |
spinal | 8:5a0d849087f5 | 108 | for(char x=0; x<numCols; x++){ |
spinal | 8:5a0d849087f5 | 109 | for(char y=0; y<maxHeight; y++){ |
spinal | 8:5a0d849087f5 | 110 | char p = rowStart[x]+y; |
spinal | 8:5a0d849087f5 | 111 | if(p>=maxHeight){p-=maxHeight;} |
spinal | 8:5a0d849087f5 | 112 | for(char t=0; t<7; t++){ |
spinal | 8:5a0d849087f5 | 113 | char col = 0; |
spinal | 8:5a0d849087f5 | 114 | if(snowRow[p] & (1<<t)) col=1; |
spinal | 8:5a0d849087f5 | 115 | mygame.display.drawPixel(t+(x*8),y,col); |
spinal | 8:5a0d849087f5 | 116 | } |
spinal | 8:5a0d849087f5 | 117 | } |
spinal | 8:5a0d849087f5 | 118 | } |
spinal | 8:5a0d849087f5 | 119 | } |
spinal | 8:5a0d849087f5 | 120 | |
spinal | 8:5a0d849087f5 | 121 | |
Pokitto | 0:2d2a3994d55d | 122 | int main () { |
spinal | 8:5a0d849087f5 | 123 | |
spinal | 8:5a0d849087f5 | 124 | for(char t=0; t<18; t++){ |
spinal | 8:5a0d849087f5 | 125 | vert[t]=random(maxHeight>>1); |
spinal | 8:5a0d849087f5 | 126 | if(t%1==0){vert[t]<<=1;} |
spinal | 8:5a0d849087f5 | 127 | } |
spinal | 8:5a0d849087f5 | 128 | for(char t=0; t<numCols; t++){ |
spinal | 8:5a0d849087f5 | 129 | rowStart[t]=(random(maxHeight>>1)); |
spinal | 8:5a0d849087f5 | 130 | if(t%1==0){rowStart[t]<<=1;} |
spinal | 8:5a0d849087f5 | 131 | } |
spinal | 8:5a0d849087f5 | 132 | |
Pokitto | 0:2d2a3994d55d | 133 | mygame.begin(); |
Pokitto | 0:2d2a3994d55d | 134 | while (mygame.isRunning()) { |
spinal | 8:5a0d849087f5 | 135 | if (mygame.update()) { |
spinal | 8:5a0d849087f5 | 136 | updateSnow(); |
Pokitto | 0:2d2a3994d55d | 137 | } |
Pokitto | 0:2d2a3994d55d | 138 | } |
Pokitto | 0:2d2a3994d55d | 139 | |
Pokitto | 0:2d2a3994d55d | 140 | } |