Пример #1
0
void pf_move_to_mouse_position()
{
	int x, y, clicked_x, clicked_y;
	int tries;

	if (!pf_get_mouse_position(mouse_x, mouse_y, &clicked_x, &clicked_y)) return;
	x = clicked_x; y = clicked_y;

	if (pf_find_path(x, y))
		return;

	for (x= clicked_x-3, tries= 0; x <= clicked_x+3 && tries < 4 ; x++)
	{
		for (y= clicked_y-3; y <= clicked_y+3 && tries < 4; y++)
		{
			if (x == clicked_x && y == clicked_y)
				continue;

			pf_dst_tile = pf_get_tile(x, y);
			if (pf_dst_tile && pf_dst_tile->z > 0)
			{
				if (pf_find_path(x, y))
					return;
				tries++;
			}
		}
	}
}
Пример #2
0
int main(void){
	int i;
    ExactPosition start, goal;
    Map* map;
    MapContainer mc;
    BellmanFord* bf_state;

    bf_state = malloc(sizeof(BellmanFord));

    /* Build a map */
    map_heap_container = &mc;
    map = map_heap_alloc(MAP_MAX_WIDTH, MAP_MAX_HEIGHT);
    mc.accu = map;
    for(i = 0; i <= 10; ++i) {
        map_set_field(map, 12, i, FIELD_WALL);
    }

    start.x = 5.3;
    start.y = 5.1;
    goal.x = 17.1;
    goal.y = 6.1;

	printf("Starting search\n");
	pf_find_path(start, goal, bf_state);
    assert(bf_state->init_v != -1);

    printf("Found path:\n");
    i = 0;
    while (bf_state->init_v != -1) {
        ExactPosition buf;
        buf = bf_v2pos(bf_state, bf_state->init_v);
		printf("-> (%.1f, %.1f)", buf.x, buf.y);
        bf_state->init_v = bf_state->succ[bf_state->init_v];
        assert(++i < 30);
	}
    printf("\n\tEVALUATE BY HAND!\n");

    free(bf_state);
    map_heap_container = NULL;
    map_heap_free(map);
    free_printbuf();

	return 0;
}
Пример #3
0
/*
 * Handler for clicks into minimap. Coordinates are given as window pixels with origin at bottom-left corner
 */   
static int minimap_walkto(int mx, int my)
{
	float fmx = mx, fmy = my;
	actor *me;

	if ( (me = get_our_actor ()) == NULL)
		return 0;

	rotate_click_coords(&fmx,&fmy);

	fmx = me->x_tile_pos - minimap_tiles_distance 
		+ minimap_tiles_distance * 2 * fmx/float_minimap_size;
	fmy = me->y_tile_pos - minimap_tiles_distance 
		+ minimap_tiles_distance * 2 * fmy/float_minimap_size;

	/* Do path finding */
	if (pf_find_path(fmx, fmy))
	{
		return 1;
	}

	return 0;
}