diff --git a/source/actor.cpp b/source/actor.cpp index 9ada632..665e4a3 100644 --- a/source/actor.cpp +++ b/source/actor.cpp @@ -345,8 +345,20 @@ namespace actor selected = act; } - const bool isInFront(actor_t *act1, actor_t *act2) { + const bool overlap(actor_t *act1, actor_t *act2) + { + return act1->inner_x < act2->inner_x+act2->bmp_rect.w && + act1->inner_x+act1->bmp_rect.w > act2->inner_x && + act1->inner_y > act2->inner_y+act2->bmp_rect.h && + act1->inner_y+act1->bmp_rect.h < act2->inner_y; + } + const bool isInFront(actor_t *act1, actor_t *act2) + { + return (act1->pos.x >= act2->pos.x+act2->size.x) || + (act1->pos.y >= act2->pos.y+act2->size.y) || + (act1->pos.z >= act2->pos.z+act2->size.z); +/* if (act1->pos.x >= act2->pos.x+act2->size.x) { return true; } else if (act2->pos.x >= act1->pos.x+act1->size.x) { return false; } else if (act1->pos.y >= act2->pos.y+act2->size.y) { return true; } @@ -354,6 +366,7 @@ namespace actor else if (act1->pos.z >= act2->pos.z+act2->size.z) { return true; } else if (act2->pos.z >= act1->pos.z+act1->size.z) { return false; } else { return false; } +*/ } void reorder() @@ -363,22 +376,15 @@ namespace actor while (dirty) { + dirty->inner_x = 148-dirty->bmp_offset.x + dirty->pos.x*2 - dirty->pos.y*2; + dirty->inner_y = 91-dirty->bmp_offset.y + dirty->pos.x + dirty->pos.y - dirty->pos.z*2; + if (first) { actor_t *current = first; while (true) { - if (isInFront(current, dirty)) - { - dirty->prev = current->prev; - current->prev = dirty; - if (dirty->prev) dirty->prev->next = dirty; - dirty = dirty->next; - current->prev->next = current; - if (current==first) first=current->prev; - break; - } - else + if (overlap(dirty, current) || isInFront(dirty, current)) { if (current->next) { @@ -393,6 +399,16 @@ namespace actor break; } } + else + { + dirty->prev = current->prev; + current->prev = dirty; + if (dirty->prev) dirty->prev->next = dirty; + dirty = dirty->next; + current->prev->next = current; + if (current==first) first=current->prev; + break; + } } } else @@ -909,8 +925,8 @@ namespace actor if (!editor::isEditing() || ( (act->flags&FLAG_HERO)==0)) { - const int x = 148-act->bmp_offset.x + act->pos.x*2 - act->pos.y*2; - const int y = 91-act->bmp_offset.y + act->pos.x + act->pos.y - act->pos.z*2; + const int x = act->inner_x; // 148-act->bmp_offset.x + act->pos.x*2 - act->pos.y*2; + const int y = act->inner_y; // 91-act->bmp_offset.y + act->pos.x + act->pos.y - act->pos.z*2; const bool flip = ( (act->flags & FLAG_ORIENTABLE) && (act->orient==PUSH_XN || act->orient==PUSH_YP) ) ? DRAW_FLIP_HORIZONTAL : DRAW_FLIP_NONE; const int oo = ( (act->flags & FLAG_ORIENTABLE) && (act->orient==PUSH_XN || act->orient==PUSH_YN) ) ? act->bmp_rect.h : 0; @@ -1037,6 +1053,9 @@ namespace actor picked = act; picked->pos.x=36; picked->pos.y=82; + picked->inner_x = 148-act->bmp_offset.x + act->pos.x*2 - act->pos.y*2; + picked->inner_y = 91-act->bmp_offset.y + act->pos.x + act->pos.y - act->pos.z*2; + } actor_t *getPicked() { return picked; } diff --git a/source/actor.h b/source/actor.h index e771549..bf8b5b1 100644 --- a/source/actor.h +++ b/source/actor.h @@ -76,6 +76,9 @@ namespace actor actor_t *prev; actor_t *next; + + int inner_x; + int inner_y; }; // Torna el primer actor de la llista diff --git a/source/main.cpp b/source/main.cpp index 3518307..44c89ea 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -354,14 +354,14 @@ bool game::loop() actor::update(actor::getFirst()); } - actor::reorder(); - editor_select_by_keyboard(); - draw::resetViewport(); draw::cls(2); draw::setViewport(100,0,320,240); + actor::reorder(); + editor_select_by_keyboard(); + room::draw(); actor::draw(actor::getFirst()); room::draw2();