Alvaro Cassinelli / Mbed 2 deprecated skinGames_forktest

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Mon Mar 31 10:57:35 2014 +0000
Revision:
44:46e25fa1669b
Parent:
35:35af5086ab4f
Child:
46:90516893793a
This new version works pretty well, even if the following blob is not as nice as in elasticLoop_OSC. New: fraction rendering / first point wait solved (more regular rendering) / better delay calibration.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:345b3bc7a0ea 1
mbedalvaro 0:345b3bc7a0ea 2 #include "blobConfig.h"
mbedalvaro 0:345b3bc7a0ea 3
mbedalvaro 0:345b3bc7a0ea 4 blobConfig::blobConfig(): numBlobs(0) {
mbedalvaro 1:a4050fee11f7 5 //blobArray.clear();// there is no need to do this, the vector does not contains anything here.
mbedalvaro 0:345b3bc7a0ea 6 }
mbedalvaro 0:345b3bc7a0ea 7
mbedalvaro 0:345b3bc7a0ea 8 blobConfig::~blobConfig() {
mbedalvaro 1:a4050fee11f7 9 clearConfig();
mbedalvaro 0:345b3bc7a0ea 10 }
mbedalvaro 0:345b3bc7a0ea 11
mbedalvaro 0:345b3bc7a0ea 12 // =========================================== STANDARD CONFIGURATIONS =============================================================================
mbedalvaro 0:345b3bc7a0ea 13
mbedalvaro 30:d8af03f01cd4 14
mbedalvaro 0:345b3bc7a0ea 15
mbedalvaro 0:345b3bc7a0ea 16 void blobConfig::clearConfig() {
mbedalvaro 1:a4050fee11f7 17 for (int i=0; i<blobArray.size(); i++) delete blobArray[i]; // we must delete the pointer created with new, so the memory for the object is liberated (calls its destructor)
mbedalvaro 1:a4050fee11f7 18 blobArray.clear();
mbedalvaro 1:a4050fee11f7 19 numBlobs=0;// this is just equal to blobArray.size()
mbedalvaro 0:345b3bc7a0ea 20 }
mbedalvaro 0:345b3bc7a0ea 21
mbedalvaro 31:5f039cbddee8 22 void blobConfig::initConfig(configType cfType, int numblobs) {
mbedalvaro 30:d8af03f01cd4 23 myConfigType=cfType;
mbedalvaro 31:5f039cbddee8 24 int i;
mbedalvaro 30:d8af03f01cd4 25 switch(myConfigType) {
mbedalvaro 30:d8af03f01cd4 26 case ONE_ELASTIC_FOLLOWING:
mbedalvaro 30:d8af03f01cd4 27 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 28 clearConfig();
mbedalvaro 30:d8af03f01cd4 29 addOneElasticContourFollowing();
mbedalvaro 30:d8af03f01cd4 30 break;
mbedalvaro 30:d8af03f01cd4 31 case ONE_ELASTIC_MOUTH:
mbedalvaro 30:d8af03f01cd4 32 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 33 clearConfig();
mbedalvaro 30:d8af03f01cd4 34 addOneElasticLoopContractCentral();
mbedalvaro 30:d8af03f01cd4 35 break;
mbedalvaro 30:d8af03f01cd4 36 case ONE_ELASTIC_MOUTH_SMALL:
mbedalvaro 30:d8af03f01cd4 37 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 38 clearConfig();
mbedalvaro 30:d8af03f01cd4 39 addOneElasticLoopContractCentralFast();
mbedalvaro 30:d8af03f01cd4 40 break;
mbedalvaro 30:d8af03f01cd4 41 case BOUNCING_SPOTS:
mbedalvaro 30:d8af03f01cd4 42 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 43 clearConfig();
mbedalvaro 31:5f039cbddee8 44 for (i=0; i<numblobs ; i++) addOneRigidLoopBouncing();
mbedalvaro 35:35af5086ab4f 45 randomizeAllColors();
mbedalvaro 30:d8af03f01cd4 46 break;
mbedalvaro 30:d8af03f01cd4 47 case LORENTZ_SPOTS:
mbedalvaro 30:d8af03f01cd4 48 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 49 clearConfig();
mbedalvaro 31:5f039cbddee8 50 for (i=0; i<numblobs ; i++) addOneRigidLoopLorentz();
mbedalvaro 35:35af5086ab4f 51 randomizeAllColors();
mbedalvaro 30:d8af03f01cd4 52 break;
mbedalvaro 30:d8af03f01cd4 53 case FOLLOWING_SPOTS:
mbedalvaro 30:d8af03f01cd4 54 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 55 clearConfig();
mbedalvaro 33:43e8bc451ef0 56 for (i=0; i<numblobs ; i++) {
mbedalvaro 33:43e8bc451ef0 57 addOneRigidLoopFollowing(vector2Df(CENTER_AD_MIRROR_X+i*200, CENTER_AD_MIRROR_Y+i*200), vector2Df(11,0));
mbedalvaro 33:43e8bc451ef0 58 }
mbedalvaro 35:35af5086ab4f 59 // randomize colors:
mbedalvaro 35:35af5086ab4f 60 randomizeAllColors();
mbedalvaro 31:5f039cbddee8 61 break;
mbedalvaro 31:5f039cbddee8 62 case ONE_TRACKING_SPOT:
mbedalvaro 31:5f039cbddee8 63 clearConfig();
mbedalvaro 31:5f039cbddee8 64 addOneRigidTrackingSpot();
mbedalvaro 31:5f039cbddee8 65 break;
mbedalvaro 31:5f039cbddee8 66 case ONE_TRACKING_SPOT_DOT:
mbedalvaro 31:5f039cbddee8 67 clearConfig();
mbedalvaro 31:5f039cbddee8 68 addOneRigidTrackingSpotDot();
mbedalvaro 30:d8af03f01cd4 69 break;
mbedalvaro 30:d8af03f01cd4 70 case AIR_HOCKEY_GAME:
mbedalvaro 30:d8af03f01cd4 71 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 72 clearConfig();
mbedalvaro 31:5f039cbddee8 73 for (i=0; i<numblobs ; i++) addOneRigidLoopAirHockey();
mbedalvaro 30:d8af03f01cd4 74 break;
mbedalvaro 30:d8af03f01cd4 75 case CIRCULAR_PONG_GAME:
mbedalvaro 30:d8af03f01cd4 76 // computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 77 clearConfig();
mbedalvaro 30:d8af03f01cd4 78 // (1) One SPOT_TRACK to track the background. It will be the number 0 in the config.
mbedalvaro 31:5f039cbddee8 79 addOneRigidTrackingSpotDot();
mbedalvaro 30:d8af03f01cd4 80 // (2) Add bouncing spots:
mbedalvaro 31:5f039cbddee8 81 for (i=0; i<numblobs ; i++) {
mbedalvaro 31:5f039cbddee8 82 float anglaux=1.0*i/numblobs*2*PI;
mbedalvaro 31:5f039cbddee8 83 addOneRigidLoopBouncing(vector2Df(CENTER_AD_MIRROR_X+200*cos(anglaux), CENTER_AD_MIRROR_Y+200*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 84 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 85 }
mbedalvaro 30:d8af03f01cd4 86 break;
mbedalvaro 30:d8af03f01cd4 87 case VERTICAL_PINBALL_GAME:
mbedalvaro 30:d8af03f01cd4 88 clearConfig();
mbedalvaro 32:52273c3291fe 89 // (1) one (or two) SPOT_TRACK or SPOT_TRACK_DOT to track the background - It will be the number 0 (and 1) in the config.
mbedalvaro 31:5f039cbddee8 90 addOneRigidTrackingSpotDot(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y+600),
mbedalvaro 31:5f039cbddee8 91 vector2Df(0,0));
mbedalvaro 32:52273c3291fe 92 // addOneRigidTrackingSpot(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y+600),
mbedalvaro 32:52273c3291fe 93 // vector2Df(0,0));
mbedalvaro 35:35af5086ab4f 94 // (2) one or more bouncing spots with gravity:
mbedalvaro 35:35af5086ab4f 95 for (i=0; i<numblobs ; i++) {
mbedalvaro 35:35af5086ab4f 96 addOneRigidLoopBouncingGravity(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y-600),
mbedalvaro 35:35af5086ab4f 97 vector2Df(i*10-5,0));
mbedalvaro 35:35af5086ab4f 98 }
mbedalvaro 30:d8af03f01cd4 99
mbedalvaro 30:d8af03f01cd4 100 break;
mbedalvaro 32:52273c3291fe 101 case RAIN_MODE:
mbedalvaro 32:52273c3291fe 102 clearConfig();
mbedalvaro 32:52273c3291fe 103 // Add bouncing spot with gravity:
mbedalvaro 32:52273c3291fe 104 for (i=0; i<numblobs ; i++) {
mbedalvaro 32:52273c3291fe 105 addOneRigidLoopBouncingGravity(vector2Df(CENTER_AD_MIRROR_X, 10), vector2Df(0,0));
mbedalvaro 32:52273c3291fe 106 }
mbedalvaro 35:35af5086ab4f 107 randomizeAllColors();
mbedalvaro 32:52273c3291fe 108 break;
mbedalvaro 31:5f039cbddee8 109 case FISH_NET_GAME:
mbedalvaro 31:5f039cbddee8 110 clearConfig();
mbedalvaro 31:5f039cbddee8 111 // (1) one SPOT_TRACK_DOT to track the background - It will be the number 0
mbedalvaro 31:5f039cbddee8 112 addOneRigidTrackingSpotDot(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y), // CENTERED
mbedalvaro 31:5f039cbddee8 113 vector2Df(0,0));
mbedalvaro 31:5f039cbddee8 114 // (2) Add bouncing spots without gravity:
mbedalvaro 31:5f039cbddee8 115 for (i=0; i<numblobs ; i++) {
mbedalvaro 31:5f039cbddee8 116 float anglaux=1.0*i/numblobs*2*PI;
mbedalvaro 31:5f039cbddee8 117 addOneRigidLoopBouncing(vector2Df(CENTER_AD_MIRROR_X+400*cos(anglaux), CENTER_AD_MIRROR_Y+400*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 118 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 119 }
mbedalvaro 31:5f039cbddee8 120 break;
mbedalvaro 30:d8af03f01cd4 121 case PAC_MAN_GAME:
mbedalvaro 30:d8af03f01cd4 122 clearConfig();
mbedalvaro 35:35af5086ab4f 123 //(1) add one very slowly slidind-bouncing spot, the PACMAN (number 0 in the config):
mbedalvaro 31:5f039cbddee8 124 // addOneRigidLoopPacman(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y), vector2Df(20,0));
mbedalvaro 35:35af5086ab4f 125
mbedalvaro 35:35af5086ab4f 126 // note: the pacman behaviour is not so good... for the time being, let's just use a following spot:
mbedalvaro 31:5f039cbddee8 127 addOneRigidLoopFollowing(vector2Df(CENTER_AD_MIRROR_X, CENTER_AD_MIRROR_Y), vector2Df(10,0));
mbedalvaro 35:35af5086ab4f 128 // set the color to red+green:
mbedalvaro 35:35af5086ab4f 129 blobArray.back()->setColor(0x06);
mbedalvaro 35:35af5086ab4f 130
mbedalvaro 35:35af5086ab4f 131
mbedalvaro 35:35af5086ab4f 132 // (2) Add some initial SPOT_FOLLOWING or SPOT_GHOST spots (the ghosts):
mbedalvaro 35:35af5086ab4f 133 addOneRigidLoopGhost(vector2Df(CENTER_AD_MIRROR_X+500, CENTER_AD_MIRROR_Y-500), vector2Df(-5,0));
mbedalvaro 35:35af5086ab4f 134 addOneRigidLoopGhost(vector2Df(CENTER_AD_MIRROR_X-500, CENTER_AD_MIRROR_Y-500), vector2Df(5,0));
mbedalvaro 31:5f039cbddee8 135
mbedalvaro 30:d8af03f01cd4 136 break;
mbedalvaro 30:d8af03f01cd4 137 default:
mbedalvaro 30:d8af03f01cd4 138 break;
mbedalvaro 30:d8af03f01cd4 139 }
mbedalvaro 44:46e25fa1669b 140
mbedalvaro 44:46e25fa1669b 141 // make sure lockin red is ON (could be off if using blue for checking mirror delay...):
mbedalvaro 44:46e25fa1669b 142 IO.setLaserLockinPower(1);
mbedalvaro 30:d8af03f01cd4 143 }
mbedalvaro 30:d8af03f01cd4 144
mbedalvaro 30:d8af03f01cd4 145 // ==================== Template spots from which to create multi-spot configurations: =====================
mbedalvaro 30:d8af03f01cd4 146
mbedalvaro 30:d8af03f01cd4 147 void blobConfig::addOneElasticLoopRelax(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 148 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 149 pBlob->createBlob(blobArray.size(), RELAX, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 150 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 151 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 152
mbedalvaro 1:a4050fee11f7 153 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 154 numBlobs=blobArray.size();
mbedalvaro 1:a4050fee11f7 155
mbedalvaro 0:345b3bc7a0ea 156 }
mbedalvaro 0:345b3bc7a0ea 157
mbedalvaro 0:345b3bc7a0ea 158
mbedalvaro 30:d8af03f01cd4 159 void blobConfig::addOneElasticLoopContract(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 160 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 161 pBlob->createBlob(blobArray.size(), CONTRACT, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 162 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 163 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 164
mbedalvaro 1:a4050fee11f7 165 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 166 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 167 }
mbedalvaro 0:345b3bc7a0ea 168
mbedalvaro 30:d8af03f01cd4 169 void blobConfig::addOneElasticLoopContractCentral(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 170 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 171 pBlob->createBlob(blobArray.size(), CONTRACT_CENTRAL, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 172 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 173 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 174
mbedalvaro 1:a4050fee11f7 175 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 176 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 177 }
mbedalvaro 0:345b3bc7a0ea 178
mbedalvaro 30:d8af03f01cd4 179 void blobConfig::addOneElasticLoopContractCentralFast(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 19:228430f1350e 180 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 181 pBlob->createBlob(blobArray.size(), CONTRACT_CENTRAL_FAST, initpos, initspeed);
mbedalvaro 19:228430f1350e 182 // add this relaxing loop to the present config:
mbedalvaro 19:228430f1350e 183 blobArray.push_back(pBlob);
mbedalvaro 19:228430f1350e 184
mbedalvaro 19:228430f1350e 185 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 19:228430f1350e 186 numBlobs=blobArray.size();
mbedalvaro 19:228430f1350e 187 }
mbedalvaro 19:228430f1350e 188
mbedalvaro 30:d8af03f01cd4 189 void blobConfig::addOneElasticContourFollowing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 190
mbedalvaro 1:a4050fee11f7 191 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 192 pBlob->createBlob(blobArray.size(), CONTOUR_FOLLOWING, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 193 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 194 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 195
mbedalvaro 1:a4050fee11f7 196 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 197 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 198 }
mbedalvaro 0:345b3bc7a0ea 199
mbedalvaro 0:345b3bc7a0ea 200
mbedalvaro 30:d8af03f01cd4 201 void blobConfig:: addOneElasticContourFollowingFAST(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 202 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 203 pBlob->createBlob(blobArray.size(), CONTOUR_FOLLOWING_FAST, initpos, initspeed);
mbedalvaro 30:d8af03f01cd4 204 // add this relaxing loop to the present config:
mbedalvaro 30:d8af03f01cd4 205 blobArray.push_back(pBlob);
mbedalvaro 30:d8af03f01cd4 206
mbedalvaro 30:d8af03f01cd4 207 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 30:d8af03f01cd4 208 numBlobs=blobArray.size();
mbedalvaro 30:d8af03f01cd4 209 }
mbedalvaro 30:d8af03f01cd4 210
mbedalvaro 30:d8af03f01cd4 211 void blobConfig::addOneElasticBouncing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 212 elasticLoop* pBlob= new elasticLoop();
mbedalvaro 30:d8af03f01cd4 213 pBlob->createBlob(blobArray.size(), BOUNCING, initpos, initspeed);
mbedalvaro 0:345b3bc7a0ea 214 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 215 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 216
mbedalvaro 1:a4050fee11f7 217 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 218 numBlobs=blobArray.size();
mbedalvaro 1:a4050fee11f7 219 }
mbedalvaro 31:5f039cbddee8 220 void blobConfig::addOneRigidLoopBouncingGravity(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 31:5f039cbddee8 221 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 32:52273c3291fe 222 pBlob->createBlob(blobArray.size(), SPOT_BOUNCING_FACTOR, initpos, initspeed);
mbedalvaro 31:5f039cbddee8 223 // (We can use here methods of the child class, even if these are not declared virtual on the base class, because we are doing this BEFORE
mbedalvaro 31:5f039cbddee8 224 // adding this to the blobArray as a pointer). This is good to set parameters...
mbedalvaro 32:52273c3291fe 225 pBlob->gravity.set(0,3.0);
mbedalvaro 31:5f039cbddee8 226 pBlob->centerMass.dampMotion = 0.002;
mbedalvaro 32:52273c3291fe 227 pBlob->factorBouncingForce=0;//0.003; // this is because we will use a force on the central mass (not used in SPOT_BOUNCING_FACTOR)
mbedalvaro 32:52273c3291fe 228 pBlob->factorAbsorptionShock=0.8; // coef elastic bouncing
mbedalvaro 31:5f039cbddee8 229
mbedalvaro 31:5f039cbddee8 230 // add this relaxing loop to the present config:
mbedalvaro 31:5f039cbddee8 231 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 232
mbedalvaro 31:5f039cbddee8 233 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 31:5f039cbddee8 234 numBlobs=blobArray.size();
mbedalvaro 31:5f039cbddee8 235 }
mbedalvaro 30:d8af03f01cd4 236 void blobConfig::addOneRigidLoopBouncing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 237 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 32:52273c3291fe 238 pBlob->createBlob(blobArray.size(), SPOT_BOUNCING_FACTOR, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 239 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 240 blobArray.push_back(pBlob);
mbedalvaro 33:43e8bc451ef0 241
mbedalvaro 1:a4050fee11f7 242 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 243 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 244 }
mbedalvaro 0:345b3bc7a0ea 245
mbedalvaro 30:d8af03f01cd4 246 void blobConfig::addOneRigidLoopPacman(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 247 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 248 pBlob->createBlob(blobArray.size(), SPOT_PACMAN, initpos, initspeed);
mbedalvaro 30:d8af03f01cd4 249 // add this relaxing loop to the present config:
mbedalvaro 30:d8af03f01cd4 250 blobArray.push_back(pBlob);
mbedalvaro 30:d8af03f01cd4 251
mbedalvaro 30:d8af03f01cd4 252 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 30:d8af03f01cd4 253 numBlobs=blobArray.size();
mbedalvaro 30:d8af03f01cd4 254 }
mbedalvaro 30:d8af03f01cd4 255 void blobConfig::addOneRigidLoopGhost(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 256 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 257 pBlob->createBlob(blobArray.size(), SPOT_GHOST, initpos, initspeed);
mbedalvaro 0:345b3bc7a0ea 258 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 259 blobArray.push_back(pBlob);
mbedalvaro 1:a4050fee11f7 260
mbedalvaro 1:a4050fee11f7 261 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 262 numBlobs=blobArray.size();
mbedalvaro 0:345b3bc7a0ea 263 }
mbedalvaro 0:345b3bc7a0ea 264
mbedalvaro 30:d8af03f01cd4 265
mbedalvaro 30:d8af03f01cd4 266 void blobConfig::addOneRigidLoopLorentz(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 27:1ce994629ffc 267 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 268 pBlob->createBlob(blobArray.size(), SPOT_LORENTZ_FORCE, initpos, initspeed);
mbedalvaro 27:1ce994629ffc 269 // add this loop to the present config:
mbedalvaro 27:1ce994629ffc 270 blobArray.push_back(pBlob);
mbedalvaro 27:1ce994629ffc 271
mbedalvaro 27:1ce994629ffc 272 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 27:1ce994629ffc 273 numBlobs=blobArray.size();
mbedalvaro 27:1ce994629ffc 274 }
mbedalvaro 27:1ce994629ffc 275
mbedalvaro 30:d8af03f01cd4 276 void blobConfig::addOneRigidLoopAirHockey(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 28:44b7b6e35548 277 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 278 pBlob->createBlob(blobArray.size(), SPOT_AIR_HOCKEY, initpos, initspeed);
mbedalvaro 28:44b7b6e35548 279 // add this loop to the present config:
mbedalvaro 28:44b7b6e35548 280 blobArray.push_back(pBlob);
mbedalvaro 28:44b7b6e35548 281
mbedalvaro 28:44b7b6e35548 282 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 28:44b7b6e35548 283 numBlobs=blobArray.size();
mbedalvaro 28:44b7b6e35548 284 }
mbedalvaro 28:44b7b6e35548 285
mbedalvaro 30:d8af03f01cd4 286 void blobConfig::addOneRigidLoopFollowing(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 1:a4050fee11f7 287 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 288 pBlob->createBlob(blobArray.size(), SPOT_FOLLOWING, initpos, initspeed);
mbedalvaro 1:a4050fee11f7 289 // add this relaxing loop to the present config:
mbedalvaro 1:a4050fee11f7 290 blobArray.push_back(pBlob);
mbedalvaro 33:43e8bc451ef0 291
mbedalvaro 33:43e8bc451ef0 292 // random color for Tokyo Designer Week:
mbedalvaro 35:35af5086ab4f 293 //randomizeAllColors();
mbedalvaro 1:a4050fee11f7 294
mbedalvaro 1:a4050fee11f7 295 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 1:a4050fee11f7 296 numBlobs=blobArray.size();
mbedalvaro 1:a4050fee11f7 297 }
mbedalvaro 0:345b3bc7a0ea 298
mbedalvaro 30:d8af03f01cd4 299 void blobConfig::addOneRigidLoopTest(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 5:73cd58b58f95 300 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 301 pBlob->createBlob(blobArray.size(), SPOT_TEST, initpos, initspeed);
mbedalvaro 5:73cd58b58f95 302 // add this relaxing loop to the present config:
mbedalvaro 5:73cd58b58f95 303 blobArray.push_back(pBlob);
mbedalvaro 5:73cd58b58f95 304
mbedalvaro 5:73cd58b58f95 305 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 5:73cd58b58f95 306 numBlobs=blobArray.size();
mbedalvaro 5:73cd58b58f95 307 }
mbedalvaro 5:73cd58b58f95 308
mbedalvaro 30:d8af03f01cd4 309 void blobConfig::addOneRigidTrackingSpot(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 30:d8af03f01cd4 310 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 30:d8af03f01cd4 311 pBlob->createBlob(blobArray.size(), SPOT_TRACK, initpos, initspeed);
mbedalvaro 30:d8af03f01cd4 312 // add this relaxing loop to the present config:
mbedalvaro 30:d8af03f01cd4 313 blobArray.push_back(pBlob);
mbedalvaro 30:d8af03f01cd4 314
mbedalvaro 30:d8af03f01cd4 315 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 30:d8af03f01cd4 316 numBlobs=blobArray.size();
mbedalvaro 30:d8af03f01cd4 317 }
mbedalvaro 0:345b3bc7a0ea 318
mbedalvaro 31:5f039cbddee8 319 void blobConfig::addOneRigidTrackingSpotDot(vector2Df initpos, vector2Df initspeed) {
mbedalvaro 31:5f039cbddee8 320 rigidLoop* pBlob= new rigidLoop();
mbedalvaro 31:5f039cbddee8 321 pBlob->createBlob(blobArray.size(), SPOT_TRACK_DOT, initpos, initspeed);
mbedalvaro 31:5f039cbddee8 322 // add this relaxing loop to the present config:
mbedalvaro 31:5f039cbddee8 323 blobArray.push_back(pBlob);
mbedalvaro 31:5f039cbddee8 324
mbedalvaro 31:5f039cbddee8 325 // update auxiliary variable numBlobs (just for easy reference):
mbedalvaro 31:5f039cbddee8 326 numBlobs=blobArray.size();
mbedalvaro 31:5f039cbddee8 327 }
mbedalvaro 0:345b3bc7a0ea 328 // ==================================================================================================================================================
mbedalvaro 44:46e25fa1669b 329 void blobConfig::processSensedData() {
mbedalvaro 44:46e25fa1669b 330 for (int i=0; i<blobArray.size(); i++) blobArray[i]->displaySensingBuffer.processSensedData(); // note: region with light is -1, and without is 2 (TO CHANGE!!! then we don't need to do "if" in the moment computation, but just a product)
mbedalvaro 44:46e25fa1669b 331 }
mbedalvaro 0:345b3bc7a0ea 332
mbedalvaro 1:a4050fee11f7 333 void blobConfig::allKill() { // this put all the blobs in "dead" mode, meaning that neither rendering nor update is done (but they are not deleted).
mbedalvaro 1:a4050fee11f7 334 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 335 blobArray[i]->render = false;
mbedalvaro 1:a4050fee11f7 336 blobArray[i]->standByMode = false;
mbedalvaro 1:a4050fee11f7 337 }
mbedalvaro 1:a4050fee11f7 338 }
mbedalvaro 0:345b3bc7a0ea 339 void blobConfig::allAlive() {
mbedalvaro 1:a4050fee11f7 340 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 341 blobArray[i]->render = true;
mbedalvaro 1:a4050fee11f7 342 blobArray[i]->standByMode = true;
mbedalvaro 1:a4050fee11f7 343 }
mbedalvaro 1:a4050fee11f7 344 }
mbedalvaro 1:a4050fee11f7 345
mbedalvaro 0:345b3bc7a0ea 346 void blobConfig::allStandBy() {
mbedalvaro 1:a4050fee11f7 347 for (int i=0; i<blobArray.size(); i++) blobArray[i]->standByMode = true;
mbedalvaro 0:345b3bc7a0ea 348 }
mbedalvaro 0:345b3bc7a0ea 349
mbedalvaro 0:345b3bc7a0ea 350 void blobConfig::allResume() {
mbedalvaro 1:a4050fee11f7 351 for (int i=0; i<blobArray.size(); i++) blobArray[i]->standByMode = false;
mbedalvaro 0:345b3bc7a0ea 352 }
mbedalvaro 0:345b3bc7a0ea 353
mbedalvaro 1:a4050fee11f7 354 void blobConfig::allVisible() {
mbedalvaro 1:a4050fee11f7 355 for (int i=0; i<blobArray.size(); i++) blobArray[i]->render = true;
mbedalvaro 0:345b3bc7a0ea 356 }
mbedalvaro 0:345b3bc7a0ea 357
mbedalvaro 0:345b3bc7a0ea 358 void blobConfig::allInvisible() { // note that they may continue to evolve
mbedalvaro 1:a4050fee11f7 359 for (int i=0; i<blobArray.size(); i++) blobArray[i]->render = false;
mbedalvaro 0:345b3bc7a0ea 360 }
mbedalvaro 0:345b3bc7a0ea 361
mbedalvaro 25:74cb85b85fd2 362 void blobConfig::allSetColor(unsigned char c) {
mbedalvaro 25:74cb85b85fd2 363 for (int i=0; i<blobArray.size(); i++) blobArray[i]->setColor(c);
mbedalvaro 25:74cb85b85fd2 364 }
mbedalvaro 32:52273c3291fe 365
mbedalvaro 32:52273c3291fe 366 void blobConfig::allSetGreen(unsigned char c) {
mbedalvaro 32:52273c3291fe 367 for (int i=0; i<blobArray.size(); i++) blobArray[i]->setGreenColor(c);
mbedalvaro 32:52273c3291fe 368 }
mbedalvaro 32:52273c3291fe 369
mbedalvaro 32:52273c3291fe 370 void blobConfig::allSetBlue(unsigned char c) {
mbedalvaro 32:52273c3291fe 371 for (int i=0; i<blobArray.size(); i++) blobArray[i]->setBlueColor(c);
mbedalvaro 32:52273c3291fe 372 }
mbedalvaro 33:43e8bc451ef0 373
mbedalvaro 33:43e8bc451ef0 374 void blobConfig::randomizeAllColors() {
mbedalvaro 33:43e8bc451ef0 375 int c;
mbedalvaro 33:43e8bc451ef0 376 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 33:43e8bc451ef0 377 c= rand() % 2;
mbedalvaro 33:43e8bc451ef0 378 blobArray[i]->setBlueColor(c);
mbedalvaro 33:43e8bc451ef0 379 c= rand() % 2;
mbedalvaro 33:43e8bc451ef0 380 blobArray[i]->setGreenColor(c);
mbedalvaro 33:43e8bc451ef0 381 }
mbedalvaro 33:43e8bc451ef0 382 }
mbedalvaro 25:74cb85b85fd2 383
mbedalvaro 30:d8af03f01cd4 384 void blobConfig::update() { // update dynamics of the blob configuration:
mbedalvaro 31:5f039cbddee8 385 int i;
mbedalvaro 31:5f039cbddee8 386 float minDist=5000, dist;
mbedalvaro 31:5f039cbddee8 387 bool win;
mbedalvaro 31:5f039cbddee8 388 // Depending on the config type, perform some special test and updates:
mbedalvaro 30:d8af03f01cd4 389 switch(myConfigType) {
mbedalvaro 30:d8af03f01cd4 390 // simple behaviours:
mbedalvaro 30:d8af03f01cd4 391 case ONE_ELASTIC_FOLLOWING:
mbedalvaro 30:d8af03f01cd4 392 case ONE_ELASTIC_MOUTH:
mbedalvaro 30:d8af03f01cd4 393 case ONE_ELASTIC_MOUTH_SMALL:
mbedalvaro 30:d8af03f01cd4 394 case BOUNCING_SPOTS:
mbedalvaro 30:d8af03f01cd4 395 case LORENTZ_SPOTS:
mbedalvaro 30:d8af03f01cd4 396 case FOLLOWING_SPOTS:
mbedalvaro 31:5f039cbddee8 397 case ONE_TRACKING_SPOT:
mbedalvaro 31:5f039cbddee8 398 case AIR_HOCKEY_GAME:
mbedalvaro 31:5f039cbddee8 399 // In all these simple cases, update dynamics of each blob independently:
mbedalvaro 31:5f039cbddee8 400 for (i=0; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 401 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 402 }
mbedalvaro 31:5f039cbddee8 403 break;
mbedalvaro 30:d8af03f01cd4 404 // more game-like:
mbedalvaro 30:d8af03f01cd4 405 case CIRCULAR_PONG_GAME:
mbedalvaro 31:5f039cbddee8 406 // spot index 0 is a tracking spot, the background "anchor":
mbedalvaro 31:5f039cbddee8 407 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 408 // all the other spots are bouncing spots:
mbedalvaro 31:5f039cbddee8 409 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 410 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 411 }
mbedalvaro 31:5f039cbddee8 412 // GAME CHECK: is some bouncing spot too far from the anchor? if so, make it "explode" (and then dissapear, but leave this for now):
mbedalvaro 31:5f039cbddee8 413 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 414 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 415 if (dist>1000) {
mbedalvaro 31:5f039cbddee8 416 blobArray[i]->explosion();
mbedalvaro 31:5f039cbddee8 417 float anglaux=1.0*(i-1)/(blobArray.size()-1)*2*PI;
mbedalvaro 31:5f039cbddee8 418 blobArray[i]->setPositionSpeed(vector2Df(CENTER_AD_MIRROR_X+200*cos(anglaux), CENTER_AD_MIRROR_Y+200*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 419 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 420 }
mbedalvaro 31:5f039cbddee8 421 }
mbedalvaro 30:d8af03f01cd4 422 break;
mbedalvaro 32:52273c3291fe 423 case RAIN_MODE: // this is just spots with gravity that reapears in the top position when reaching the bottom:
mbedalvaro 32:52273c3291fe 424 // others are bouncing with gravity:
mbedalvaro 32:52273c3291fe 425 for (i=0; i<blobArray.size(); i++) {
mbedalvaro 32:52273c3291fe 426 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 32:52273c3291fe 427 }
mbedalvaro 32:52273c3291fe 428 // GAME CHECKS:
mbedalvaro 32:52273c3291fe 429 for (i=0; i<blobArray.size(); i++) {
mbedalvaro 32:52273c3291fe 430 if (blobArray[i]->getCenter().y>MAX_AD_MIRRORS-20) {
mbedalvaro 32:52273c3291fe 431 // Replace position of spot to the initial position:
mbedalvaro 32:52273c3291fe 432 blobArray[i]->explosion();
mbedalvaro 32:52273c3291fe 433 blobArray[i]->resetPositionSpeed();
mbedalvaro 32:52273c3291fe 434 }
mbedalvaro 32:52273c3291fe 435 }
mbedalvaro 32:52273c3291fe 436 break;
mbedalvaro 30:d8af03f01cd4 437 case VERTICAL_PINBALL_GAME:
mbedalvaro 31:5f039cbddee8 438 // spot index 0 is a tracking spot, the background "anchor":
mbedalvaro 31:5f039cbddee8 439 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 440 // others are bouncing with gravity:
mbedalvaro 31:5f039cbddee8 441 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 442 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 443 }
mbedalvaro 31:5f039cbddee8 444 // GAME CHECKS:
mbedalvaro 31:5f039cbddee8 445 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 446 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 447 //(1) win (meaning bouncing spot very close to anchor):
mbedalvaro 31:5f039cbddee8 448 if (dist<60) {
mbedalvaro 31:5f039cbddee8 449 blobArray[i]->explosion();
mbedalvaro 31:5f039cbddee8 450 blobArray[i]->setPositionSpeed(vector2Df(blobArray[0]->getCenter().x-400+rand()%800, blobArray[0]->getCenter().y-1200),
mbedalvaro 31:5f039cbddee8 451 vector2Df(0, 0));
mbedalvaro 31:5f039cbddee8 452 }
mbedalvaro 31:5f039cbddee8 453 //(2) loose (meaning spot went outside range):
mbedalvaro 31:5f039cbddee8 454 if (blobArray[i]->getCenter().y>blobArray[0]->getCenter().y) {
mbedalvaro 31:5f039cbddee8 455 blobArray[i]->setPositionSpeed(vector2Df(blobArray[0]->getCenter().x-400+rand()%800, blobArray[0]->getCenter().y-1200),
mbedalvaro 35:35af5086ab4f 456 vector2Df(i*10-5, 0));
mbedalvaro 31:5f039cbddee8 457 }
mbedalvaro 31:5f039cbddee8 458 }
mbedalvaro 30:d8af03f01cd4 459 break;
mbedalvaro 31:5f039cbddee8 460 case FISH_NET_GAME:
mbedalvaro 31:5f039cbddee8 461 // spot index 0 is a tracking spot, the background "anchor":
mbedalvaro 31:5f039cbddee8 462 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 463 // all the other spots are bouncing spots:
mbedalvaro 31:5f039cbddee8 464 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 465 if (blobArray[i]->standByMode==false) blobArray[i]->update();
mbedalvaro 31:5f039cbddee8 466 }
mbedalvaro 31:5f039cbddee8 467 // GAME CHECKS: a win only, when all the spots are very close to the mother spot:
mbedalvaro 31:5f039cbddee8 468 win=true;
mbedalvaro 31:5f039cbddee8 469 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 470 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 471 win&=(dist<80);
mbedalvaro 31:5f039cbddee8 472 }
mbedalvaro 31:5f039cbddee8 473 if (win) {
mbedalvaro 31:5f039cbddee8 474 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 475 blobArray[i]->explosion();
mbedalvaro 31:5f039cbddee8 476 float anglaux=1.0*(i-1)/(blobArray.size()-1)*2*PI;
mbedalvaro 31:5f039cbddee8 477 blobArray[i]->setPositionSpeed(vector2Df(CENTER_AD_MIRROR_X+400*cos(anglaux), CENTER_AD_MIRROR_Y+400*sin(anglaux)),
mbedalvaro 31:5f039cbddee8 478 vector2Df(cos(anglaux),sin(anglaux))*10);
mbedalvaro 31:5f039cbddee8 479 }
mbedalvaro 31:5f039cbddee8 480 }
mbedalvaro 31:5f039cbddee8 481 break;
mbedalvaro 30:d8af03f01cd4 482 case PAC_MAN_GAME:
mbedalvaro 31:5f039cbddee8 483 // spot index 0 is the pacman:
mbedalvaro 31:5f039cbddee8 484 if (blobArray[0]->standByMode==false) blobArray[0]->update();
mbedalvaro 31:5f039cbddee8 485 // spot 1 and 2 are ghosts:
mbedalvaro 31:5f039cbddee8 486 if (blobArray[1]->standByMode==false) blobArray[1]->update(blobArray[0]->getCenter());
mbedalvaro 31:5f039cbddee8 487 if (blobArray[2]->standByMode==false) blobArray[2]->update(blobArray[0]->getCenter()); // pass the position of the PACMAN!
mbedalvaro 31:5f039cbddee8 488
mbedalvaro 31:5f039cbddee8 489 // GAME CHECK: are any ghost too close to the pacman?
mbedalvaro 31:5f039cbddee8 490 for (i=1; i<blobArray.size(); i++) {
mbedalvaro 31:5f039cbddee8 491 dist=(blobArray[0]->getCenter()).distance(blobArray[i]->getCenter());
mbedalvaro 31:5f039cbddee8 492 if (minDist>dist) minDist=dist;
mbedalvaro 31:5f039cbddee8 493 }
mbedalvaro 31:5f039cbddee8 494 if (minDist<50) {
mbedalvaro 31:5f039cbddee8 495 blobArray[0]->explosion();
mbedalvaro 31:5f039cbddee8 496 // then restart the game:
mbedalvaro 31:5f039cbddee8 497 // initConfig(PAC_MAN_GAME);
mbedalvaro 31:5f039cbddee8 498 }
mbedalvaro 31:5f039cbddee8 499
mbedalvaro 30:d8af03f01cd4 500 break;
mbedalvaro 30:d8af03f01cd4 501 default:
mbedalvaro 30:d8af03f01cd4 502 break;
mbedalvaro 30:d8af03f01cd4 503 }
mbedalvaro 30:d8af03f01cd4 504
mbedalvaro 30:d8af03f01cd4 505
mbedalvaro 30:d8af03f01cd4 506 }
mbedalvaro 30:d8af03f01cd4 507
mbedalvaro 30:d8af03f01cd4 508 void blobConfig::computeBoundingBox() {
mbedalvaro 30:d8af03f01cd4 509 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 30:d8af03f01cd4 510 blobArray[i]->computeBoundingBox();
mbedalvaro 30:d8af03f01cd4 511 }
mbedalvaro 0:345b3bc7a0ea 512 }
mbedalvaro 0:345b3bc7a0ea 513
mbedalvaro 1:a4050fee11f7 514 void blobConfig::draw() { // draw uses the opengl like renderer (if any), and save projected trajectory in the LaserSensingTrajectory object of each blob
mbedalvaro 1:a4050fee11f7 515 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 516 if (blobArray[i]->render==true) blobArray[i]->draw();
mbedalvaro 1:a4050fee11f7 517 }
mbedalvaro 0:345b3bc7a0ea 518 }
mbedalvaro 0:345b3bc7a0ea 519
mbedalvaro 1:a4050fee11f7 520 void blobConfig::sendConfData() {
mbedalvaro 1:a4050fee11f7 521 // For the time being, only "per blob" data sending:
mbedalvaro 1:a4050fee11f7 522 // (b) Per-spot sending of data (note: both are NOT exclusive; so if we want just packaged data, we need to make all the spot STOP sending data.
mbedalvaro 18:d72935b13858 523 for (int i=0; i<blobArray.size(); i++) {
mbedalvaro 1:a4050fee11f7 524 if (blobArray[i]->render==true) blobArray[i]->sendData(); // a blob that is in stand-by mode may send data (good for testing with a fixed loop)
mbedalvaro 1:a4050fee11f7 525 }
mbedalvaro 0:345b3bc7a0ea 526 }
mbedalvaro 0:345b3bc7a0ea 527
mbedalvaro 0:345b3bc7a0ea 528
mbedalvaro 0:345b3bc7a0ea 529
mbedalvaro 0:345b3bc7a0ea 530