Exemple #1
0
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;
	}
}
Exemple #2
0
/* @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) {
	}
}