diff options
| author | Petr Sykora <petr.sykora@gmail.com> | 2008-10-27 15:10:47 +0100 |
|---|---|---|
| committer | Petr Sykora <petr.sykora@gmail.com> | 2008-10-27 15:10:47 +0100 |
| commit | 7eab9e3fe59e9b6893bc1404880073e42d3511ed (patch) | |
| tree | 289b2f1c9eb0ce7c34380e6c005d088755cbbaec /src/client | |
| parent | ffe650b3bfd258d20a91f25f7e39b866611b2f11 (diff) | |
new addLayer, fixed behavior
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/layer.c | 67 | ||||
| -rw-r--r-- | src/client/layer.h | 17 |
2 files changed, 54 insertions, 30 deletions
diff --git a/src/client/layer.c b/src/client/layer.c index d06c92a..8807c35 100644 --- a/src/client/layer.c +++ b/src/client/layer.c @@ -31,17 +31,19 @@ void initLayer() } /* - * Prida novu polozku do zoznamu vrstiev - * *img - obrazok, ktory obsahuje polozka - * x y w h - suradnca kam sa obrazok vykresli a jeho rozmery - * px py pw ph - suradnica casti obrazka *img ktora sa ma zobrazit - * layer - vrstva na ktorej sa zobrazi obrazok + * Add image to queue for rendering + * *img - image to be rendered + * x,y - coordinates where to draw the image + * w,h - width and height of rendered part of image + * px,py - coordinates of upper left corner of rendered part of image + * layer - on which layer to draw + * (0 - under tuxanci | 1 - same as tuxanci | 2 - over tuxancami) */ void addLayer(image_t * img, int x, int y, int px, int py, int w, int h, int player) { layer_t *new; - layer_t *this; + layer_t *actual; int i, j; assert(img != NULL); @@ -56,21 +58,44 @@ addLayer(image_t * img, int x, int y, int px, int py, int w, int h, int player) new->layer = player; new->image = img; - for (i = 0; i < listLayer->count; i++) { - this = (layer_t *) listLayer->list[i]; - - if (this->layer == new->layer) { - for (j = i; j < listLayer->count; j++) { - this = (layer_t *) listLayer->list[j]; - - if (this->y + this->h > new->y + new->h) { - insList(listLayer, j, new); - return; - } - } - } - } - + //first, we check if we should insert our image at the begining of the queue + if (listLayer->count == 0) { + addList(listLayer, new); + return; + }; + + if (((layer_t *)listLayer->list[0])->layer > new->layer) { + insList(listLayer, 0, new); + return; + }; + + //here we are sure, that we want to insert it somewhere else than the begining + for (i = 0; i < listLayer->count; i ++) { + actual = getList(listLayer, i); + //if we are at the same layer, we apply insert sort in (y+h/2) + while ((actual->layer == new->layer)) { + if ((new->y + new->h / 2) < (actual->y + actual->h/2)) { + insList(listLayer, i, new); + return; + }; + + i ++; + if (i >= listLayer->count) break; + actual = getList(listLayer, i); + + if (actual->layer > new->layer) { + insList(listLayer, i, new); + return; + }; + }; + if (i >= listLayer->count) break; + + //we check if we are on layer, that is not present yet + if (actual->layer > new->layer) { + insList(listLayer, i, new); + return; + }; + }; addList(listLayer, new); } diff --git a/src/client/layer.h b/src/client/layer.h index fc17a23..37c0628 100644 --- a/src/client/layer.h +++ b/src/client/layer.h @@ -28,21 +28,20 @@ extern bool_t isLayerInicialized(); extern void initLayer(); /* - * Prida obrazok na vykreslenie do zoznamu - * *img - ponter na urfrace obrazka - * x,y - suradnice kam sa ma obrazok nakreslit - * w,h - rozmeri obrazka - * px,py - suradnice casti *img z ktorej sa bude obrazok vykreslovat - * ph,ph - rozmeri casti obrazka *img z ktorej sa bude obrazok vykreslovat - * layer - layer, na ktorej bude obrazok - * (0 - pod tuxancami | 1 - na tej istej ako tuxanci | 2 - nad tuxancami) + * Add image to queue for rendering + * *img - image to be rendered + * x,y - coordinates where to draw the image + * w,h - width and height of rendered part of image + * px,py - coordinates of upper left corner of rendered part of image + * layer - on which layer to draw + * (0 - under tuxanci | 1 - same as tuxanci | 2 - over tuxancami) */ extern void addLayer(image_t * img, int x, int y, int px, int py, int w, int h, int player); /* - * Vykresli zoznam na obrazovku + * Draws queue on the screen */ extern void drawLayer(); extern void drawLayerCenter(int x, int y); |