Alvaro Cassinelli / Mbed 2 deprecated skinGames_forktest

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Mon Oct 29 14:28:47 2012 +0000
Revision:
32:52273c3291fe
Parent:
31:5f039cbddee8
Child:
33:43e8bc451ef0
code for Tokyo design week (starting with two colored following spots, and NO standby mode)

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