void mouse_down(MouseDownEvent * ev, GameState * state) { if (ev->button == 1) { Mouse * mouse = &state->mouse; if (in_world_screen(mouse->screen_x, mouse->screen_y)) { if (state->action == BUILD_TOWER) { //er wordt een toren neergezet Entity* entity; entity = place_tower(&state->world, state->blueprint.entity.tower.tower_type, mouse->world_x, mouse->world_y); if (entity != NULL) { if (state->money - entity->tower.cost >= 0) { //pas state aan nu de toren geplaatst is state->money -= entity->tower.cost; state->towers_length++; state->towers = (Entity**) realloc(state->towers, state->towers_length * sizeof(Entity*)); state->towers[state->towers_length - 1] = entity; state->world.entities[mouse->tile_x][mouse->tile_y] = *entity; state->refresh_paths = 1; //beweeg de muis om te zien of aan te tonen dat hier nu geen toren meer kan staan move_mouse(state); } else{ //niet genoeg geld destroy_tower(&state->world, entity); } } } else if (state->action == DESTROY_TOWER) { //toren moet verwijderd worden if (state->world.entities[mouse->tile_x][mouse->tile_y].type == TOWER) { register int i = 0; Entity *tower = state->towers[i]; while (!(convert_world2tile_x(tower->all.world_x) == mouse->tile_x && convert_world2tile_y(tower->all.world_y) == mouse->tile_y)) { tower = state->towers[i]; i++; } //je krijgt de helft van de kost terug als je de toren terug "verkoopt" state->money += tower->tower.cost / 2; destroy_tower(&state->world, tower); if (i != 0) { i--; } //schuif in de array alle elementen na de verwijderde toren ייn plaats terug for (i = i; i < state->towers_length - 1; i++) { state->towers[i] = state->towers[i + 1]; } state->towers_length--; if (state->towers_length != 0) { state->towers = (Entity**) realloc(state->towers, state->towers_length * sizeof(Entity*)); } state->refresh_paths = 1; } } } else { /* Outside of world frame => buttons */ set_button_action(state); /* DO NOT CHANGE */ } } else if (ev->button == 2) { state->action = NONE; } }
/* @brief mouse event dispatcher... might want an improved architecture later */ void controls_click(SDL_MouseButtonEvent *ev, state_t *state) { if(ev->button == SDL_BUTTON_RIGHT) { state->type_selected = ATTR_NONE; } else if((ev->x > SEL_X + SEL_BUFFER || ev->y < SEL_Y - SEL_BUFFER) && ev->y < BOT_BAR - BOT_BAR_BUFFER) { int gx = ev->x/GRID_SIZE; int gy = ev->y/GRID_SIZE; if(ev->button == SDL_BUTTON_LEFT && state->type_selected != ATTR_NONE) place_tower(gx, gy, 100, state->type_selected); } else if(ev->x < SEL_X && ev->y > SEL_Y) { int x = ev->x; int y = YRES - ev->y; if(x % BTN_SIZE > BTN_OFFSET && y % BTN_SIZE > BTN_OFFSET) sel_click(x / BTN_SIZE, y / BTN_SIZE, state); } else if(ev->y > BOT_BAR) { } }