Alvaro Cassinelli / Mbed 2 deprecated skinGames_forktest

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Mon Nov 05 06:08:35 2012 +0000
Revision:
33:43e8bc451ef0
Parent:
32:52273c3291fe
Child:
35:35af5086ab4f
added resizing functions, as well as better control on the thresholding modes

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