ECE2035 Project 2

Dependencies:   mbed mbed-rtos SDFileSystem

Committer:
kwengryn3
Date:
Tue Apr 20 18:15:22 2021 +0000
Revision:
10:1994adcfc86f
Parent:
9:f1d34ef049c5
adv features

Who changed what in which revision?

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