int do_test_rectangles(const char *test_parm) { (void) test_parm; rect_t out1, out2, oldw, neww; oldw.x = 1; oldw.y = 1; oldw.xsize = 10; oldw.ysize = 10; neww.x = 2; neww.y = 2; neww.xsize = 10; neww.ysize = 10; //int o2 = rect_sub( &out1, &out2, &oldw, &neww ); //rect_dump( &out1 ); //rect_dump( &out2 ); test_check_eq(out1.x,1); test_check_eq(out1.y,1); test_check_eq(out1.xsize,1); test_check_eq(out1.ysize,10); test_check_eq(out2.x,1); test_check_eq(out2.y,1); test_check_eq(out2.xsize,10); test_check_eq(out2.ysize,1); rect_t a, b; a.x = 10; a.y = 10; a.xsize = 10; a.ysize = 10; b.x = 15; b.y = 15; b.xsize = 10; b.ysize = 10; test_check_false( rect_includes( &a, &b ) ); test_check_true( rect_intersects( &a, &b ) ); b.xsize = 2; b.ysize = 2; test_check_true( rect_includes( &a, &b ) ); test_check_true( rect_intersects( &a, &b ) ); b.x = 35; b.y = 35; test_check_false( rect_includes( &a, &b ) ); test_check_false( rect_intersects( &a, &b ) ); return 0; }
// Subtract rectangle from q void paint_q_sub( rect_t *r ) { pqel_t *pqel; ASSERT_LOCKED_MUTEX( &rect_list_lock ); again: queue_iterate( &rect_list, pqel, pqel_t *, chain ) { // r includes qe - delete qe if( rect_includes( r, &pqel->r ) ) { queue_remove( &rect_list, pqel, pqel_t *, chain ); goto again; } // r intersects w qe - divide in two if( rect_intersects( r, &pqel->r ) ) { rect_t out1, out2; rect_sub( &out1, &out2, r, &pqel->r ); if( !rect_empty( &out1 ) ) { pqel_t *new1 = mkel( &out1 ); if( !new1 ) return; queue_enter(&rect_list, new1, pqel_t *, chain); }
static int scrollrect(VTermRect rect, int downward, int rightward, void *user) { VTermScreen *screen = user; if(screen->damage_merge != VTERM_DAMAGE_SCROLL) { vterm_scroll_rect(rect, downward, rightward, moverect_internal, erase_internal, screen); vterm_screen_flush_damage(screen); vterm_scroll_rect(rect, downward, rightward, moverect_user, erase_user, screen); return 1; } if(screen->damaged.start_row != -1 && !rect_intersects(&rect, &screen->damaged)) { vterm_screen_flush_damage(screen); } if(screen->pending_scrollrect.start_row == -1) { screen->pending_scrollrect = rect; screen->pending_scroll_downward = downward; screen->pending_scroll_rightward = rightward; } else if(rect_equal(&screen->pending_scrollrect, &rect) && ((screen->pending_scroll_downward == 0 && downward == 0) || (screen->pending_scroll_rightward == 0 && rightward == 0))) { screen->pending_scroll_downward += downward; screen->pending_scroll_rightward += rightward; } else { vterm_screen_flush_damage(screen); screen->pending_scrollrect = rect; screen->pending_scroll_downward = downward; screen->pending_scroll_rightward = rightward; } vterm_scroll_rect(rect, downward, rightward, moverect_internal, erase_internal, screen); if(screen->damaged.start_row == -1) return 1; if(rect_contains(&rect, &screen->damaged)) { /* Scroll region entirely contains the damage; just move it */ vterm_rect_move(&screen->damaged, -downward, -rightward); rect_clip(&screen->damaged, &rect); } /* There are a number of possible cases here, but lets restrict this to only * the common case where we might actually gain some performance by * optimising it. Namely, a vertical scroll that neatly cuts the damage * region in half. */ else if(rect.start_col <= screen->damaged.start_col && rect.end_col >= screen->damaged.end_col && rightward == 0) { if(screen->damaged.start_row >= rect.start_row && screen->damaged.start_row < rect.end_row) { screen->damaged.start_row -= downward; if(screen->damaged.start_row < rect.start_row) screen->damaged.start_row = rect.start_row; if(screen->damaged.start_row > rect.end_row) screen->damaged.start_row = rect.end_row; } if(screen->damaged.end_row >= rect.start_row && screen->damaged.end_row < rect.end_row) { screen->damaged.end_row -= downward; if(screen->damaged.end_row < rect.start_row) screen->damaged.end_row = rect.start_row; if(screen->damaged.end_row > rect.end_row) screen->damaged.end_row = rect.end_row; } } else { DEBUG_LOG2("TODO: Just flush and redo damaged=" STRFrect " rect=" STRFrect "\n", ARGSrect(screen->damaged), ARGSrect(rect)); } return 1; }
void gameLogic() { if (danmakux.player->x < 0) { if (danmakux.player->focused) danmakux.player->x += danmakux.player->focusspeed; else danmakux.player->x += danmakux.player->speed; } if (danmakux.player->x > danmakux.width-danmakux.player->width) { if (danmakux.player->focused) danmakux.player->x -= danmakux.player->focusspeed; else danmakux.player->x -= danmakux.player->speed; } if (danmakux.player->y < 0) { if (danmakux.player->focused) danmakux.player->y += danmakux.player->focusspeed; else danmakux.player->y += danmakux.player->speed; } if (danmakux.player->y > danmakux.height-danmakux.player->height) { if (danmakux.player->focused) danmakux.player->y -= danmakux.player->focusspeed; else danmakux.player->y -= danmakux.player->speed; } for (std::list<PlayerBullet>::iterator i = danmakux.playerbullets.begin(); i != danmakux.playerbullets.end(); i++) { if ((*i).x+(*i).width < 0 || (*i).y+(*i).height < 0 || (*i).x > danmakux.width || (*i).y > danmakux.height || (*i).dead) { plblt_close(&(*i)); i = danmakux.playerbullets.erase(i); continue; } for (std::list<Enemy>::iterator j = danmakux.enemies.begin(); j != danmakux.enemies.end(); j++) { if (rect_intersects(&(*j).hitbox, &(*i).hitbox)) { (*j).health -= (*i).damage; plblt_close(&(*i)); i = danmakux.playerbullets.erase(i); for (std::list<EnemyBullet>::iterator k = (*j).bullets.begin(); k != (*j).bullets.end(); k++) { if (circ_intersects(&(*k).hitbox, &danmakux.player->hitbox)) { danmakux.player->health -= (*k).damage; enblt_close(&(*k)); k = (*j).bullets.erase(k); } if ((*k).x < 0 || (*k).y < 0 || (*k).x > danmakux.width || (*k).y > danmakux.height) { enblt_close(&(*k)); k = (*j).bullets.erase(k); } } if ((*j).health <= 0) { (*j).dead = true; addItem("powerup"); } if ((*j).dead && (*j).bullets.empty()) { enem_close(&(*j)); j = danmakux.enemies.erase(j); } } } } if (danmakux.player->health <= 0) { danmakux.player->dead = true; //dying procedure } for (std::list<Item>::iterator i = danmakux.items.begin(); i != danmakux.items.end(); i++) { if ((*i).type == "wall") { if (danmakux.player->moveu && danmakux.player->y < (*i).y+(*i).height && danmakux.player->x > (*i).x && danmakux.player->x < (*i).x+(*i).width) { if (danmakux.player->focused) { danmakux.player->y += danmakux.player->focusspeed; } else { danmakux.player->y += danmakux.player->speed; } } if (danmakux.player->moved && danmakux.player->y > (*i).y && danmakux.player->x > (*i).x && danmakux.player->x < (*i).x+(*i).width) { if (danmakux.player->focused) { danmakux.player->y -= danmakux.player->focusspeed; } else { danmakux.player->y -= danmakux.player->speed; } } if (danmakux.player->movel && danmakux.player->x < (*i).x+(*i).width && danmakux.player->y > (*i).y && danmakux.player->y < (*i).y+(*i).height) { if (danmakux.player->focused) { danmakux.player->x += danmakux.player->focusspeed; } else { danmakux.player->x += danmakux.player->speed; } } if (danmakux.player->mover && danmakux.player->x > (*i).x && danmakux.player->y > (*i).y && danmakux.player->y < (*i).y+(*i).height) { if (danmakux.player->focused) { danmakux.player->x -= danmakux.player->focusspeed; } else { danmakux.player->x -= danmakux.player->speed; } } } if (rect_intersects(&(*i).hitbox, &danmakux.player->pickupbox)) { if ((*i).type == "powerup") { runFunction(&danmakux.player->script, "powerup"); } item_close(&(*i)); i = danmakux.items.erase(i); } } }
bool enem_hit(Enemy *enemy, PlayerBullet *p) { if (!enemy->dead) { if (rect_intersects(&enemy->hitbox, &p->hitbox)) return true; } return false; }
bool plblt_hit(PlayerBullet *blt, Enemy *e) { if (!blt->dead) { if (rect_intersects(&blt->hitbox, &e->hitbox)) return true; } return false; }