ECE2035 Project 2
Dependencies: mbed mbed-rtos SDFileSystem
fruit.cpp@10:1994adcfc86f, 2021-04-20 (annotated)
- 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?
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 | 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 | } |