just a test

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Sun Sep 23 10:11:43 2012 +0000
Revision:
31:5f039cbddee8
Parent:
30:d8af03f01cd4
Child:
32:52273c3291fe
this is quite nice, but  I am going to make a deep modification of the bouncing principle: instead of depending on the penetration, it will just be a factor over the speed (perfect elastic bouncing being factorElastic=1, and perfectly absorption=0);

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