ECE2035 Project 2

Dependencies:   mbed mbed-rtos SDFileSystem

Committer:
kwengryn3
Date:
Tue Apr 20 13:46:45 2021 +0000
Revision:
9:f1d34ef049c5
Parent:
4:8e15742ebcc6
Child:
10:1994adcfc86f
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 0:bff8b9020128 45 M->type = rand() % 3;
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 0:bff8b9020128 57 default:
kwengryn3 0:bff8b9020128 58 break;
kwengryn3 0:bff8b9020128 59 }
kwengryn3 4:8e15742ebcc6 60
kwengryn3 0:bff8b9020128 61 M->tick = 0;
kwengryn3 0:bff8b9020128 62 //set a random source for the fruit
kwengryn3 0:bff8b9020128 63 M->direction = rand() % 3;
kwengryn3 0:bff8b9020128 64 if (M->direction == 0){
kwengryn3 4:8e15742ebcc6 65 //pc.printf("0\n");
kwengryn3 0:bff8b9020128 66 M->source = rand() % (SIZE_X - FRUIT_SIZE - PLAYER_SPACE);
kwengryn3 0:bff8b9020128 67 //set a random target for the fruit
kwengryn3 0:bff8b9020128 68 M->target = rand() % (SIZE_X - FRUIT_SIZE - PLAYER_SPACE);
kwengryn3 0:bff8b9020128 69 //the fruit starts at its source
kwengryn3 0:bff8b9020128 70 M->box.topLeft.x = M->source + PLAYER_SPACE;
kwengryn3 0:bff8b9020128 71 M->box.topLeft.y = 0; // = {M->source + PLAYER_SPACE, 0};
kwengryn3 0:bff8b9020128 72 M->box.bottomRight.x = M->source + FRUIT_SIZE + PLAYER_SPACE;
kwengryn3 0:bff8b9020128 73 M->box.bottomRight.y = FRUIT_SIZE;
kwengryn3 0:bff8b9020128 74 //M->box.bottomRight = {M->source + FRUIT_SIZE + PLAYER_SPACE, FRUIT_SIZE};
kwengryn3 0:bff8b9020128 75 double diagnal = sqrt((M->source - M->target)*(M->source - M->target) + SIZE_Y*SIZE_Y);
kwengryn3 0:bff8b9020128 76 M->delta_x = (M->target - M->source) / diagnal;
kwengryn3 0:bff8b9020128 77 M->delta_y = fabs(SIZE_Y / diagnal);
kwengryn3 0:bff8b9020128 78 }
kwengryn3 0:bff8b9020128 79 else if(M->direction == 1){
kwengryn3 4:8e15742ebcc6 80
kwengryn3 4:8e15742ebcc6 81
kwengryn3 0:bff8b9020128 82 M->source = rand() % (SIZE_Y - FRUIT_SIZE);
kwengryn3 0:bff8b9020128 83 //set a random target for the fruit
kwengryn3 0:bff8b9020128 84 M->target = rand() % (SIZE_Y - FRUIT_SIZE);
kwengryn3 0:bff8b9020128 85 M->box.topLeft.x = PLAYER_SPACE;
kwengryn3 0:bff8b9020128 86 M->box.topLeft.y = M->source;
kwengryn3 0:bff8b9020128 87 //M->box.topLeft = {PLAYER_SPACE, M->source};
kwengryn3 4:8e15742ebcc6 88
kwengryn3 0:bff8b9020128 89 M->box.bottomRight.x = PLAYER_SPACE + FRUIT_SIZE;
kwengryn3 0:bff8b9020128 90 M->box.bottomRight.y = M->source + FRUIT_SIZE;
kwengryn3 0:bff8b9020128 91 //M->box.bottomRight = {PLAYER_SPACE + FRUIT_SIZE, M->source + FRUIT_SIZE};
kwengryn3 4:8e15742ebcc6 92
kwengryn3 0:bff8b9020128 93 double diagnal = sqrt((M->source - M->target)*(M->source - M->target) + (SIZE_X - PLAYER_SPACE)*(SIZE_X - PLAYER_SPACE));
kwengryn3 0:bff8b9020128 94 M->delta_x = (SIZE_X - PLAYER_SPACE) / diagnal;
kwengryn3 4:8e15742ebcc6 95
kwengryn3 0:bff8b9020128 96 M->delta_y = fabs((M->target - M->source) / diagnal);
kwengryn3 4:8e15742ebcc6 97
kwengryn3 4:8e15742ebcc6 98
kwengryn3 0:bff8b9020128 99 }else{
kwengryn3 4:8e15742ebcc6 100 //pc.printf("else\n");
kwengryn3 0:bff8b9020128 101 M->source = rand() % (SIZE_Y - FRUIT_SIZE);
kwengryn3 0:bff8b9020128 102 //set a random target for the fruit
kwengryn3 0:bff8b9020128 103 M->target = rand() % (SIZE_Y - FRUIT_SIZE);
kwengryn3 0:bff8b9020128 104 M->box.topLeft.x = PLAYER_SPACE + SIZE_X - FRUIT_SIZE;
kwengryn3 0:bff8b9020128 105 M->box.topLeft.y = M->source;
kwengryn3 0:bff8b9020128 106 //M->box.topLeft = {PLAYER_SPACE + SIZE_X - FRUIT_SIZE, M->source};
kwengryn3 0:bff8b9020128 107 M->box.bottomRight.x = PLAYER_SPACE + SIZE_X;
kwengryn3 0:bff8b9020128 108 M->box.bottomRight.y = M->source + FRUIT_SIZE;
kwengryn3 0:bff8b9020128 109 //M->box.bottomRight = {PLAYER_SPACE + SIZE_X, M->source + FRUIT_SIZE};
kwengryn3 0:bff8b9020128 110 double diagnal = sqrt((M->source - M->target)*(M->source - M->target) + (SIZE_X - PLAYER_SPACE)*(SIZE_X - PLAYER_SPACE));
kwengryn3 0:bff8b9020128 111 M->delta_x = (PLAYER_SPACE - SIZE_X) / diagnal;
kwengryn3 0:bff8b9020128 112 M->delta_y = fabs((M->target - M->source) / diagnal);
kwengryn3 0:bff8b9020128 113 }
kwengryn3 4:8e15742ebcc6 114
kwengryn3 4:8e15742ebcc6 115
kwengryn3 0:bff8b9020128 116
kwengryn3 0:bff8b9020128 117 M->status = FRUIT_ACTIVE;
kwengryn3 4:8e15742ebcc6 118 //pc.printf("new fruit coords= (%d, %d)\n", M->box.topLeft.x, M->box.topLeft.y );
kwengryn3 0:bff8b9020128 119
kwengryn3 0:bff8b9020128 120 insertHead(fruitDLL, M);
kwengryn3 0:bff8b9020128 121 }
kwengryn3 0:bff8b9020128 122
kwengryn3 0:bff8b9020128 123 void fruit_update_position(void){
kwengryn3 0:bff8b9020128 124
kwengryn3 4:8e15742ebcc6 125 //pc.printf("fruit: fruit_update_position");
kwengryn3 0:bff8b9020128 126 //controls how fast the fruit will move
kwengryn3 4:8e15742ebcc6 127 const int rate = FRUIT_SPEED;
kwengryn3 0:bff8b9020128 128 //delta_x and delta_y account for the slope of the fruit
kwengryn3 0:bff8b9020128 129 DrawFunc draw = NULL;
kwengryn3 0:bff8b9020128 130 LLNode* current = fruitDLL->head;
kwengryn3 0:bff8b9020128 131 FRUIT* newFruit;
kwengryn3 0:bff8b9020128 132 //iterate over all fruits
kwengryn3 4:8e15742ebcc6 133 int count = 0;
kwengryn3 4:8e15742ebcc6 134 while(count < fruitDLL->size)
kwengryn3 4:8e15742ebcc6 135 {
kwengryn3 4:8e15742ebcc6 136
kwengryn3 4:8e15742ebcc6 137 newFruit = (FRUIT*) current->data;
kwengryn3 4:8e15742ebcc6 138 //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 139 if(newFruit->status == FRUIT_SLICED ||
kwengryn3 0:bff8b9020128 140 newFruit->box.topLeft.x > 127 ||
kwengryn3 4:8e15742ebcc6 141 newFruit->box.topLeft.y > 127 ||
kwengryn3 9:f1d34ef049c5 142 newFruit->box.bottomRight.x <= 0 ||
kwengryn3 9:f1d34ef049c5 143 newFruit->box.bottomRight.y <= 0)
kwengryn3 0:bff8b9020128 144 {
kwengryn3 0:bff8b9020128 145 //cover the last fruit location
kwengryn3 0:bff8b9020128 146 draw_nothing(newFruit->box);
kwengryn3 0:bff8b9020128 147 // clear the fruit on the screen
kwengryn3 0:bff8b9020128 148 draw = NULL;
kwengryn3 0:bff8b9020128 149 // Remove it from the list
kwengryn3 0:bff8b9020128 150 //pc.printf("deleting fruit node...\n");
kwengryn3 4:8e15742ebcc6 151 LLNode* toDelete = current;
kwengryn3 4:8e15742ebcc6 152 current = current->next;
kwengryn3 4:8e15742ebcc6 153 deleteNode(fruitDLL, toDelete);
kwengryn3 4:8e15742ebcc6 154 count++;
kwengryn3 4:8e15742ebcc6 155 continue;
kwengryn3 4:8e15742ebcc6 156
kwengryn3 0:bff8b9020128 157 //pc.printf("fruit node deleted.\n");
kwengryn3 0:bff8b9020128 158 }
kwengryn3 0:bff8b9020128 159 else
kwengryn3 0:bff8b9020128 160 {
kwengryn3 0:bff8b9020128 161 //cover the last fruit location
kwengryn3 4:8e15742ebcc6 162
kwengryn3 0:bff8b9020128 163 draw_nothing(newFruit->box);
kwengryn3 0:bff8b9020128 164
kwengryn3 0:bff8b9020128 165 // update fruit position
kwengryn3 0:bff8b9020128 166
kwengryn3 0:bff8b9020128 167 //pc.printf("%f, %f\n", newFruit->delta_x, newFruit->delta_y);
kwengryn3 4:8e15742ebcc6 168
kwengryn3 0:bff8b9020128 169 newFruit->box.topLeft.x += rate*newFruit->delta_x;
kwengryn3 0:bff8b9020128 170 newFruit->box.topLeft.y += rate*newFruit->delta_y;
kwengryn3 0:bff8b9020128 171 newFruit->box.bottomRight.x += rate*newFruit->delta_x;
kwengryn3 0:bff8b9020128 172 newFruit->box.bottomRight.y += rate*newFruit->delta_y;
kwengryn3 0:bff8b9020128 173 //pc.printf(" %f, %f", newFruit->delta_x, newFruit->delta_y);
kwengryn3 0:bff8b9020128 174 // draw fruit
kwengryn3 4:8e15742ebcc6 175
kwengryn3 0:bff8b9020128 176 draw = newFruit->draw;
kwengryn3 0:bff8b9020128 177 //update fruit's internal tick
kwengryn3 0:bff8b9020128 178 newFruit->tick++;
kwengryn3 4:8e15742ebcc6 179
kwengryn3 0:bff8b9020128 180 //current->data = (void*) newFruit;
kwengryn3 0:bff8b9020128 181 }
kwengryn3 0:bff8b9020128 182 // Advance the loop
kwengryn3 4:8e15742ebcc6 183 if(draw){
kwengryn3 4:8e15742ebcc6 184
kwengryn3 4:8e15742ebcc6 185 draw(newFruit->box);
kwengryn3 4:8e15742ebcc6 186 }
kwengryn3 4:8e15742ebcc6 187
kwengryn3 0:bff8b9020128 188 current = current->next;
kwengryn3 4:8e15742ebcc6 189
kwengryn3 4:8e15742ebcc6 190 count++;
kwengryn3 0:bff8b9020128 191 }
kwengryn3 0:bff8b9020128 192 }
kwengryn3 0:bff8b9020128 193
kwengryn3 0:bff8b9020128 194 DLinkedList* get_fruit_list() {
kwengryn3 0:bff8b9020128 195 return fruitDLL;
kwengryn3 0:bff8b9020128 196
kwengryn3 0:bff8b9020128 197 }