Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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);
            }
Ejemplo n.º 3
0
Archivo: screen.c Proyecto: rasilon/vim
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;
}
Ejemplo n.º 4
0
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);
		}
	}
}
Ejemplo n.º 5
0
bool enem_hit(Enemy *enemy, PlayerBullet *p) {
	if (!enemy->dead) {
		if (rect_intersects(&enemy->hitbox, &p->hitbox)) return true;
	}
	return false;
}
Ejemplo n.º 6
0
bool plblt_hit(PlayerBullet *blt, Enemy *e) {
	if (!blt->dead) {
		if (rect_intersects(&blt->hitbox, &e->hitbox)) return true;
	}
	return false;
}