finished p2-2

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Committer:
levelsnake3
Date:
Mon Apr 26 00:30:47 2021 +0000
Revision:
2:7abebe259d59
Parent:
1:05e3f86df6d5
finalAdv;

Who changed what in which revision?

UserRevisionLine numberNew 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