ECE2035 Project 2
Dependencies: mbed mbed-rtos SDFileSystem
fruit.cpp@9:f1d34ef049c5, 2021-04-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |