finished p2-2
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
fruit.cpp@2:7abebe259d59, 2021-04-26 (annotated)
- Committer:
- levelsnake3
- Date:
- Mon Apr 26 00:30:47 2021 +0000
- Revision:
- 2:7abebe259d59
- Parent:
- 1:05e3f86df6d5
finalAdv;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DCchico |
0:95264f964374 | 1 | //================================================================= |
DCchico |
0:95264f964374 | 2 | // Implementation of fruit module. |
DCchico |
0:95264f964374 | 3 | // |
DCchico |
0:95264f964374 | 4 | // Copyright 2020 Georgia Tech. All rights reserved. |
DCchico |
0:95264f964374 | 5 | // The materials provided by the instructor in this course are for |
DCchico |
0:95264f964374 | 6 | // the use of the students currently enrolled in the course. |
DCchico |
0:95264f964374 | 7 | // Copyrighted course materials may not be further disseminated. |
DCchico |
0:95264f964374 | 8 | // This file must not be made publicly available anywhere. |
DCchico |
0:95264f964374 | 9 | //================================================================== |
DCchico |
0:95264f964374 | 10 | |
DCchico |
0:95264f964374 | 11 | #include "fruit_private.h" |
DCchico |
0:95264f964374 | 12 | #include "doubly_linked_list.h" |
levelsnake3 | 1:05e3f86df6d5 | 13 | #include "compost_pile_private.h" |
levelsnake3 | 1:05e3f86df6d5 | 14 | |
DCchico |
0:95264f964374 | 15 | |
DCchico |
0:95264f964374 | 16 | int fruit_tick=0; |
levelsnake3 | 2:7abebe259d59 | 17 | int difMod = 0; |
levelsnake3 | 2:7abebe259d59 | 18 | int practice = 0; |
DCchico |
0:95264f964374 | 19 | |
DCchico |
0:95264f964374 | 20 | //Create a DLL for fruits |
DCchico |
0:95264f964374 | 21 | DLinkedList* fruitDLL = NULL; |
DCchico |
0:95264f964374 | 22 | |
DCchico |
0:95264f964374 | 23 | void fruit_init(void) |
DCchico |
0:95264f964374 | 24 | { |
DCchico |
0:95264f964374 | 25 | //Create a new doubly linked list of fruits |
levelsnake3 | 1:05e3f86df6d5 | 26 | //also initsGround |
levelsnake3 | 1:05e3f86df6d5 | 27 | draw_ground(); |
DCchico |
0:95264f964374 | 28 | fruitDLL = create_dlinkedlist(); |
levelsnake3 | 1:05e3f86df6d5 | 29 | return; |
DCchico |
0:95264f964374 | 30 | } |
levelsnake3 | 2:7abebe259d59 | 31 | void difficultyMode(int n){ |
levelsnake3 | 2:7abebe259d59 | 32 | if(n == 1) difMod = 3; |
levelsnake3 | 2:7abebe259d59 | 33 | else if(n == 2) difMod = -3; |
levelsnake3 | 2:7abebe259d59 | 34 | else if(n == 3){ |
levelsnake3 | 2:7abebe259d59 | 35 | practice = 1; |
levelsnake3 | 2:7abebe259d59 | 36 | difMod = 0; |
levelsnake3 | 2:7abebe259d59 | 37 | } |
levelsnake3 | 2:7abebe259d59 | 38 | else difMod = 0; |
levelsnake3 | 2:7abebe259d59 | 39 | } |
DCchico |
0:95264f964374 | 40 | |
DCchico |
0:95264f964374 | 41 | void fruit_generator(void){ |
DCchico |
0:95264f964374 | 42 | fruit_tick++; |
DCchico |
0:95264f964374 | 43 | // only fire the fruit at certain ticks |
levelsnake3 | 1:05e3f86df6d5 | 44 | // must detail interval of different fruits |
levelsnake3 | 2:7abebe259d59 | 45 | if((fruit_tick % (FRUIT_INTERVAL + difMod))==0 || fruit_tick==0){ |
DCchico |
0:95264f964374 | 46 | //printf("fruit_create()"); |
DCchico |
0:95264f964374 | 47 | fruit_create(); |
DCchico |
0:95264f964374 | 48 | } |
DCchico |
0:95264f964374 | 49 | // update the fruits and draw them |
DCchico |
0:95264f964374 | 50 | fruit_update_position(); |
DCchico |
0:95264f964374 | 51 | } |
DCchico |
0:95264f964374 | 52 | |
DCchico |
0:95264f964374 | 53 | void fruit_create(void){ |
DCchico |
0:95264f964374 | 54 | FRUIT* M = (FRUIT*)malloc(sizeof(FRUIT)); |
DCchico |
0:95264f964374 | 55 | // M->y = 0; |
DCchico |
0:95264f964374 | 56 | //each fruit has its own tick |
levelsnake3 | 2:7abebe259d59 | 57 | if(practice == 1) M->type = 5; |
levelsnake3 | 2:7abebe259d59 | 58 | else M->type = rand() % 5; |
DCchico |
0:95264f964374 | 59 | switch (M->type) |
DCchico |
0:95264f964374 | 60 | { |
DCchico |
0:95264f964374 | 61 | case 0: |
DCchico |
0:95264f964374 | 62 | M->draw = draw_bomb; |
DCchico |
0:95264f964374 | 63 | break; |
DCchico |
0:95264f964374 | 64 | case 1: |
levelsnake3 | 1:05e3f86df6d5 | 65 | M->draw = draw_realOrange; |
DCchico |
0:95264f964374 | 66 | break; |
DCchico |
0:95264f964374 | 67 | case 2: |
levelsnake3 | 2:7abebe259d59 | 68 | M->draw = drawRealBanana; |
levelsnake3 | 2:7abebe259d59 | 69 | break; |
levelsnake3 | 2:7abebe259d59 | 70 | case 3: |
levelsnake3 | 2:7abebe259d59 | 71 | M->draw = draw_Rec; |
levelsnake3 | 2:7abebe259d59 | 72 | break; |
levelsnake3 | 2:7abebe259d59 | 73 | case 4: |
levelsnake3 | 2:7abebe259d59 | 74 | M->draw = drawBigOrange; |
levelsnake3 | 2:7abebe259d59 | 75 | break; |
levelsnake3 | 2:7abebe259d59 | 76 | case 5: |
levelsnake3 | 2:7abebe259d59 | 77 | M->draw = drawPractice; |
DCchico |
0:95264f964374 | 78 | break; |
DCchico |
0:95264f964374 | 79 | default: |
DCchico |
0:95264f964374 | 80 | break; |
DCchico |
0:95264f964374 | 81 | } |
DCchico |
0:95264f964374 | 82 | M->tick = 0; |
DCchico |
0:95264f964374 | 83 | //set a random source for the fruit |
DCchico |
0:95264f964374 | 84 | M->direction = rand() % 3; |
DCchico |
0:95264f964374 | 85 | if (M->direction == 0){ |
DCchico |
0:95264f964374 | 86 | M->source = rand() % (SIZE_X - FRUIT_SIZE - PLAYER_SPACE); |
DCchico |
0:95264f964374 | 87 | //set a random target for the fruit |
DCchico |
0:95264f964374 | 88 | M->target = rand() % (SIZE_X - FRUIT_SIZE - PLAYER_SPACE); |
DCchico |
0:95264f964374 | 89 | //the fruit starts at its source |
DCchico |
0:95264f964374 | 90 | M->box.topLeft.x = M->source + PLAYER_SPACE; |
DCchico |
0:95264f964374 | 91 | M->box.topLeft.y = 0; // = {M->source + PLAYER_SPACE, 0}; |
DCchico |
0:95264f964374 | 92 | M->box.bottomRight.x = M->source + FRUIT_SIZE + PLAYER_SPACE; |
DCchico |
0:95264f964374 | 93 | M->box.bottomRight.y = FRUIT_SIZE; |
DCchico |
0:95264f964374 | 94 | //M->box.bottomRight = {M->source + FRUIT_SIZE + PLAYER_SPACE, FRUIT_SIZE}; |
DCchico |
0:95264f964374 | 95 | double diagnal = sqrt((M->source - M->target)*(M->source - M->target) + SIZE_Y*SIZE_Y); |
DCchico |
0:95264f964374 | 96 | M->delta_x = (M->target - M->source) / diagnal; |
DCchico |
0:95264f964374 | 97 | M->delta_y = fabs(SIZE_Y / diagnal); |
DCchico |
0:95264f964374 | 98 | } |
DCchico |
0:95264f964374 | 99 | else if(M->direction == 1){ |
DCchico |
0:95264f964374 | 100 | M->source = rand() % (SIZE_Y - FRUIT_SIZE); |
DCchico |
0:95264f964374 | 101 | //set a random target for the fruit |
DCchico |
0:95264f964374 | 102 | M->target = rand() % (SIZE_Y - FRUIT_SIZE); |
DCchico |
0:95264f964374 | 103 | M->box.topLeft.x = PLAYER_SPACE; |
DCchico |
0:95264f964374 | 104 | M->box.topLeft.y = M->source; |
DCchico |
0:95264f964374 | 105 | //M->box.topLeft = {PLAYER_SPACE, M->source}; |
DCchico |
0:95264f964374 | 106 | M->box.bottomRight.x = PLAYER_SPACE + FRUIT_SIZE; |
DCchico |
0:95264f964374 | 107 | M->box.bottomRight.y = M->source + FRUIT_SIZE; |
DCchico |
0:95264f964374 | 108 | //M->box.bottomRight = {PLAYER_SPACE + FRUIT_SIZE, M->source + FRUIT_SIZE}; |
DCchico |
0:95264f964374 | 109 | double diagnal = sqrt((M->source - M->target)*(M->source - M->target) + (SIZE_X - PLAYER_SPACE)*(SIZE_X - PLAYER_SPACE)); |
DCchico |
0:95264f964374 | 110 | M->delta_x = (SIZE_X - PLAYER_SPACE) / diagnal; |
DCchico |
0:95264f964374 | 111 | M->delta_y = fabs((M->target - M->source) / diagnal); |
DCchico |
0:95264f964374 | 112 | }else{ |
DCchico |
0:95264f964374 | 113 | M->source = rand() % (SIZE_Y - FRUIT_SIZE); |
DCchico |
0:95264f964374 | 114 | //set a random target for the fruit |
DCchico |
0:95264f964374 | 115 | M->target = rand() % (SIZE_Y - FRUIT_SIZE); |
DCchico |
0:95264f964374 | 116 | M->box.topLeft.x = PLAYER_SPACE + SIZE_X - FRUIT_SIZE; |
DCchico |
0:95264f964374 | 117 | M->box.topLeft.y = M->source; |
DCchico |
0:95264f964374 | 118 | //M->box.topLeft = {PLAYER_SPACE + SIZE_X - FRUIT_SIZE, M->source}; |
DCchico |
0:95264f964374 | 119 | M->box.bottomRight.x = PLAYER_SPACE + SIZE_X; |
DCchico |
0:95264f964374 | 120 | M->box.bottomRight.y = M->source + FRUIT_SIZE; |
DCchico |
0:95264f964374 | 121 | //M->box.bottomRight = {PLAYER_SPACE + SIZE_X, M->source + FRUIT_SIZE}; |
DCchico |
0:95264f964374 | 122 | double diagnal = sqrt((M->source - M->target)*(M->source - M->target) + (SIZE_X - PLAYER_SPACE)*(SIZE_X - PLAYER_SPACE)); |
DCchico |
0:95264f964374 | 123 | M->delta_x = (PLAYER_SPACE - SIZE_X) / diagnal; |
DCchico |
0:95264f964374 | 124 | M->delta_y = fabs((M->target - M->source) / diagnal); |
DCchico |
0:95264f964374 | 125 | } |
DCchico |
0:95264f964374 | 126 | |
DCchico |
0:95264f964374 | 127 | |
DCchico |
0:95264f964374 | 128 | M->status = FRUIT_ACTIVE; |
DCchico |
0:95264f964374 | 129 | |
DCchico |
0:95264f964374 | 130 | insertHead(fruitDLL, M); |
DCchico |
0:95264f964374 | 131 | } |
DCchico |
0:95264f964374 | 132 | |
DCchico |
0:95264f964374 | 133 | void fruit_update_position(void){ |
DCchico |
0:95264f964374 | 134 | |
DCchico |
0:95264f964374 | 135 | |
DCchico |
0:95264f964374 | 136 | //controls how fast the fruit will move |
DCchico |
0:95264f964374 | 137 | int rate = FRUIT_SPEED; |
DCchico |
0:95264f964374 | 138 | //delta_x and delta_y account for the slope of the fruit |
DCchico |
0:95264f964374 | 139 | DrawFunc draw = NULL; |
DCchico |
0:95264f964374 | 140 | LLNode* current = fruitDLL->head; |
DCchico |
0:95264f964374 | 141 | FRUIT* newFruit; |
DCchico |
0:95264f964374 | 142 | //iterate over all fruits |
DCchico |
0:95264f964374 | 143 | while(current) |
DCchico |
0:95264f964374 | 144 | { newFruit = (FRUIT*) current->data; |
DCchico |
0:95264f964374 | 145 | if(newFruit->status == FRUIT_SLICED || |
levelsnake3 | 1:05e3f86df6d5 | 146 | newFruit->box.topLeft.x > 110 || |
levelsnake3 | 1:05e3f86df6d5 | 147 | newFruit->box.bottomRight.y > 115 || |
DCchico |
0:95264f964374 | 148 | newFruit->box.bottomRight.x < 0 || |
levelsnake3 | 1:05e3f86df6d5 | 149 | newFruit->box.topLeft.y < 0) |
DCchico |
0:95264f964374 | 150 | { |
DCchico |
0:95264f964374 | 151 | //cover the last fruit location |
levelsnake3 | 1:05e3f86df6d5 | 152 | if(newFruit->type == 1){ |
levelsnake3 | 1:05e3f86df6d5 | 153 | draw_nothingOrange(newFruit->box); |
levelsnake3 | 1:05e3f86df6d5 | 154 | } |
levelsnake3 | 2:7abebe259d59 | 155 | else if((newFruit->type == 0)||(newFruit->type == 3)||(newFruit->type == 5)){ |
levelsnake3 | 2:7abebe259d59 | 156 | draw_nothingBomb(newFruit->box); |
levelsnake3 | 2:7abebe259d59 | 157 | } |
levelsnake3 | 2:7abebe259d59 | 158 | else if(newFruit->type == 4){ |
levelsnake3 | 2:7abebe259d59 | 159 | nothingBigOrange(newFruit->box); |
levelsnake3 | 2:7abebe259d59 | 160 | } |
levelsnake3 | 1:05e3f86df6d5 | 161 | else{ |
levelsnake3 | 1:05e3f86df6d5 | 162 | draw_nothing(newFruit->box); |
levelsnake3 | 1:05e3f86df6d5 | 163 | } |
DCchico |
0:95264f964374 | 164 | // clear the fruit on the screen |
DCchico |
0:95264f964374 | 165 | draw = NULL; |
DCchico |
0:95264f964374 | 166 | // Remove it from the list |
DCchico |
0:95264f964374 | 167 | //pc.printf("deleting fruit node...\n"); |
DCchico |
0:95264f964374 | 168 | deleteNode(fruitDLL, current); |
levelsnake3 | 1:05e3f86df6d5 | 169 | maintainComp(); |
DCchico |
0:95264f964374 | 170 | //pc.printf("fruit node deleted.\n"); |
DCchico |
0:95264f964374 | 171 | } |
DCchico |
0:95264f964374 | 172 | else |
DCchico |
0:95264f964374 | 173 | { |
DCchico |
0:95264f964374 | 174 | //cover the last fruit location |
levelsnake3 | 1:05e3f86df6d5 | 175 | if(newFruit->type == 1){ |
levelsnake3 | 1:05e3f86df6d5 | 176 | draw_nothingOrange(newFruit->box); |
levelsnake3 | 1:05e3f86df6d5 | 177 | } |
levelsnake3 | 2:7abebe259d59 | 178 | else if((newFruit->type == 0)||(newFruit->type == 3)||(newFruit->type == 5)){ |
levelsnake3 | 2:7abebe259d59 | 179 | draw_nothingBomb(newFruit->box); |
levelsnake3 | 2:7abebe259d59 | 180 | } |
levelsnake3 | 2:7abebe259d59 | 181 | else if(newFruit->type == 4){ |
levelsnake3 | 2:7abebe259d59 | 182 | nothingBigOrange(newFruit->box); |
levelsnake3 | 2:7abebe259d59 | 183 | } |
levelsnake3 | 1:05e3f86df6d5 | 184 | else{ |
levelsnake3 | 1:05e3f86df6d5 | 185 | draw_nothing(newFruit->box); |
levelsnake3 | 1:05e3f86df6d5 | 186 | } |
DCchico |
0:95264f964374 | 187 | // update fruit position |
DCchico |
0:95264f964374 | 188 | |
DCchico |
0:95264f964374 | 189 | //pc.printf("%f, %f\n", newFruit->delta_x, newFruit->delta_y); |
DCchico |
0:95264f964374 | 190 | newFruit->box.topLeft.x += rate*newFruit->delta_x; |
DCchico |
0:95264f964374 | 191 | newFruit->box.topLeft.y += rate*newFruit->delta_y; |
DCchico |
0:95264f964374 | 192 | newFruit->box.bottomRight.x += rate*newFruit->delta_x; |
DCchico |
0:95264f964374 | 193 | newFruit->box.bottomRight.y += rate*newFruit->delta_y; |
DCchico |
0:95264f964374 | 194 | //pc.printf(" %f, %f", newFruit->delta_x, newFruit->delta_y); |
DCchico |
0:95264f964374 | 195 | // draw fruit |
DCchico |
0:95264f964374 | 196 | draw = newFruit->draw; |
DCchico |
0:95264f964374 | 197 | //update fruit's internal tick |
DCchico |
0:95264f964374 | 198 | newFruit->tick++; |
DCchico |
0:95264f964374 | 199 | //current->data = (void*) newFruit; |
DCchico |
0:95264f964374 | 200 | } |
DCchico |
0:95264f964374 | 201 | // Advance the loop |
DCchico |
0:95264f964374 | 202 | if(draw) draw(newFruit->box); |
DCchico |
0:95264f964374 | 203 | current = current->next; |
DCchico |
0:95264f964374 | 204 | } |
DCchico |
0:95264f964374 | 205 | } |
DCchico |
0:95264f964374 | 206 | |
DCchico |
0:95264f964374 | 207 | DLinkedList* get_fruit_list() { |
levelsnake3 | 1:05e3f86df6d5 | 208 | return fruitDLL; |
levelsnake3 | 1:05e3f86df6d5 | 209 | } |
DCchico |
0:95264f964374 | 210 |