Richard Parker / EALCD
Committer:
richardparker
Date:
Thu Mar 04 10:54:06 2010 +0000
Revision:
1:f04bcaea1d60
Child:
4:f8f7f4f9c58d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
richardparker 1:f04bcaea1d60 1 #include "mbed.h"
richardparker 1:f04bcaea1d60 2 #include "EATouchManager.h"
richardparker 1:f04bcaea1d60 3
richardparker 1:f04bcaea1d60 4 #include "../screen/EATouch.h"
richardparker 1:f04bcaea1d60 5 #include "EAHitBox.h"
richardparker 1:f04bcaea1d60 6
richardparker 1:f04bcaea1d60 7 EATouchManager::EATouchManager(EATouch& touch)
richardparker 1:f04bcaea1d60 8 : _touch(touch),
richardparker 1:f04bcaea1d60 9 _head(NULL)
richardparker 1:f04bcaea1d60 10 {
richardparker 1:f04bcaea1d60 11 }
richardparker 1:f04bcaea1d60 12
richardparker 1:f04bcaea1d60 13 EATouchManager::~EATouchManager()
richardparker 1:f04bcaea1d60 14 {
richardparker 1:f04bcaea1d60 15 // Free any memory associated with the list.
richardparker 1:f04bcaea1d60 16 clearHitBoxes();
richardparker 1:f04bcaea1d60 17 }
richardparker 1:f04bcaea1d60 18
richardparker 1:f04bcaea1d60 19 void EATouchManager::tick()
richardparker 1:f04bcaea1d60 20 {
richardparker 1:f04bcaea1d60 21 short x = 0;
richardparker 1:f04bcaea1d60 22 short y = 0;
richardparker 1:f04bcaea1d60 23 bool p = false;
richardparker 1:f04bcaea1d60 24
richardparker 1:f04bcaea1d60 25 // Get the touch.
richardparker 1:f04bcaea1d60 26 _touch.touch(x, y, p);
richardparker 1:f04bcaea1d60 27
richardparker 1:f04bcaea1d60 28 // Check if hit target.
richardparker 1:f04bcaea1d60 29 if (p == true)
richardparker 1:f04bcaea1d60 30 {
richardparker 1:f04bcaea1d60 31 _doHits(x, y);
richardparker 1:f04bcaea1d60 32 }
richardparker 1:f04bcaea1d60 33 }
richardparker 1:f04bcaea1d60 34
richardparker 1:f04bcaea1d60 35 void EATouchManager::_doHits(short x, short y)
richardparker 1:f04bcaea1d60 36 {
richardparker 1:f04bcaea1d60 37 EAHitBox* current = _head;
richardparker 1:f04bcaea1d60 38
richardparker 1:f04bcaea1d60 39 while (current != NULL)
richardparker 1:f04bcaea1d60 40 {
richardparker 1:f04bcaea1d60 41 // Do the check this will fire the pointer function if it does.
richardparker 1:f04bcaea1d60 42 current->checkContains(x, y);
richardparker 1:f04bcaea1d60 43
richardparker 1:f04bcaea1d60 44 // Get the next item in the linked list.
richardparker 1:f04bcaea1d60 45 current = current->next();
richardparker 1:f04bcaea1d60 46 }
richardparker 1:f04bcaea1d60 47 }
richardparker 1:f04bcaea1d60 48
richardparker 1:f04bcaea1d60 49 void EATouchManager::deleteHitBox(EAHitBox* box)
richardparker 1:f04bcaea1d60 50 {
richardparker 1:f04bcaea1d60 51 EAHitBox* current = _head;
richardparker 1:f04bcaea1d60 52 EAHitBox* last = NULL;
richardparker 1:f04bcaea1d60 53 EAHitBox* next = NULL;
richardparker 1:f04bcaea1d60 54
richardparker 1:f04bcaea1d60 55 // If not valid then just return.
richardparker 1:f04bcaea1d60 56 if (box == NULL)
richardparker 1:f04bcaea1d60 57 {
richardparker 1:f04bcaea1d60 58 return;
richardparker 1:f04bcaea1d60 59 }
richardparker 1:f04bcaea1d60 60
richardparker 1:f04bcaea1d60 61 while (current != NULL)
richardparker 1:f04bcaea1d60 62 {
richardparker 1:f04bcaea1d60 63 // Get the next item in the linked list.
richardparker 1:f04bcaea1d60 64 next = current->next();
richardparker 1:f04bcaea1d60 65
richardparker 1:f04bcaea1d60 66 // If the pointer matches the one that want to delete then first
richardparker 1:f04bcaea1d60 67 // remove from the list, put the link in from previous to next
richardparker 1:f04bcaea1d60 68 // and actually delet the data.
richardparker 1:f04bcaea1d60 69 if (box == current)
richardparker 1:f04bcaea1d60 70 {
richardparker 1:f04bcaea1d60 71 if ((next != NULL) && (last == NULL))
richardparker 1:f04bcaea1d60 72 {
richardparker 1:f04bcaea1d60 73 // If there is an item after but none before then the next
richardparker 1:f04bcaea1d60 74 // becomes the root item.
richardparker 1:f04bcaea1d60 75 _head = next;
richardparker 1:f04bcaea1d60 76 }
richardparker 1:f04bcaea1d60 77 else if ((next != NULL) && (last != NULL))
richardparker 1:f04bcaea1d60 78 {
richardparker 1:f04bcaea1d60 79 // There was a last and there is a next so need to stitch
richardparker 1:f04bcaea1d60 80 // list together removing the current.
richardparker 1:f04bcaea1d60 81 last->setNext(next);
richardparker 1:f04bcaea1d60 82 }
richardparker 1:f04bcaea1d60 83 else if ((next == NULL) && (last == NULL))
richardparker 1:f04bcaea1d60 84 {
richardparker 1:f04bcaea1d60 85 // If there is no item after this one then nothing else to do.
richardparker 1:f04bcaea1d60 86 _head = NULL;
richardparker 1:f04bcaea1d60 87 }
richardparker 1:f04bcaea1d60 88 else if ((next == NULL) && (last != NULL))
richardparker 1:f04bcaea1d60 89 {
richardparker 1:f04bcaea1d60 90 // Last is now the end of the list.
richardparker 1:f04bcaea1d60 91 last->setNext(NULL);
richardparker 1:f04bcaea1d60 92 }
richardparker 1:f04bcaea1d60 93
richardparker 1:f04bcaea1d60 94 // Actually get rid of memory.
richardparker 1:f04bcaea1d60 95 delete current;
richardparker 1:f04bcaea1d60 96 current = NULL;
richardparker 1:f04bcaea1d60 97 break;
richardparker 1:f04bcaea1d60 98 }
richardparker 1:f04bcaea1d60 99
richardparker 1:f04bcaea1d60 100 // Swap pointers over.
richardparker 1:f04bcaea1d60 101 last = current;
richardparker 1:f04bcaea1d60 102 current = next;
richardparker 1:f04bcaea1d60 103 }
richardparker 1:f04bcaea1d60 104 }
richardparker 1:f04bcaea1d60 105
richardparker 1:f04bcaea1d60 106 EAHitBox* EATouchManager::createHitBox()
richardparker 1:f04bcaea1d60 107 {
richardparker 1:f04bcaea1d60 108 EAHitBox* box = new EAHitBox();
richardparker 1:f04bcaea1d60 109
richardparker 1:f04bcaea1d60 110 // If able to create then add the pointer to the list and return.
richardparker 1:f04bcaea1d60 111 if (box != NULL)
richardparker 1:f04bcaea1d60 112 {
richardparker 1:f04bcaea1d60 113 box->setNext(_head);
richardparker 1:f04bcaea1d60 114 _head = box;
richardparker 1:f04bcaea1d60 115 }
richardparker 1:f04bcaea1d60 116
richardparker 1:f04bcaea1d60 117 return box;
richardparker 1:f04bcaea1d60 118 }
richardparker 1:f04bcaea1d60 119
richardparker 1:f04bcaea1d60 120 void EATouchManager::clearHitBoxes()
richardparker 1:f04bcaea1d60 121 {
richardparker 1:f04bcaea1d60 122 EAHitBox* current = _head;
richardparker 1:f04bcaea1d60 123 EAHitBox* next = NULL;
richardparker 1:f04bcaea1d60 124
richardparker 1:f04bcaea1d60 125 // Delete each hit box in turn.
richardparker 1:f04bcaea1d60 126 while (current != NULL)
richardparker 1:f04bcaea1d60 127 {
richardparker 1:f04bcaea1d60 128 next = current->next();
richardparker 1:f04bcaea1d60 129
richardparker 1:f04bcaea1d60 130 delete current;
richardparker 1:f04bcaea1d60 131 current = NULL;
richardparker 1:f04bcaea1d60 132
richardparker 1:f04bcaea1d60 133 current = next;
richardparker 1:f04bcaea1d60 134 }
richardparker 1:f04bcaea1d60 135
richardparker 1:f04bcaea1d60 136 // Reset the root.
richardparker 1:f04bcaea1d60 137 _head = NULL;
richardparker 1:f04bcaea1d60 138
richardparker 1:f04bcaea1d60 139 }
richardparker 1:f04bcaea1d60 140
richardparker 1:f04bcaea1d60 141