Some snow based on a C64 BASIC routine

Dependencies:   PokittoLib

Fork of HelloWorld by Pokitto Community Team

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?

UserRevisionLine numberNew 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 }