void geom_step(float dt) { int i; sol_move(&goal.vary, NULL, dt); sol_move(&jump.vary, NULL, dt); for (i = 0; i < GEOM_MAX; i++) sol_move(&item[i].vary, NULL, dt); ball_step(dt); }
void move_ball(jball *ball){ int xstep, ystep; int collision_on_x, collision_on_y; jwall *game_wall = NULL; collision_on_x = wall_or_ball_located_to(ball->x_dir,ball->x_loc,ball->y_loc); collision_on_y = wall_or_ball_located_to(ball->y_dir,ball->x_loc,ball->y_loc); // We need to make the collision was not caused by an in game wall // because we do not want to change direction on that, plus // we want to disable that wall if(collision_on_x == 1 && collision_on_y == 1){ game_wall = game_wall_at(ball->x_loc+ball_step(ball->x_dir), ball->y_loc+ball_step(ball->y_dir)); if(game_wall != NULL){ collision_on_x = 0; collision_on_y = 0; } } else if(collision_on_x == 1){ game_wall = game_wall_at(ball->x_loc+ball_step(ball->x_dir), ball->y_loc); if(game_wall != NULL){ collision_on_x = 0; } } else if(collision_on_y == 1){ game_wall = game_wall_at(ball->x_loc, ball->y_loc+ball_step(ball->y_dir)); if(game_wall != NULL){ // This collision doesn't count, we'll keep going in the y_dir collision_on_y = 0; } } deactivate_game_wall(game_wall); // It checks for NULL ball->x_dir = new_ball_dir(collision_on_x,ball->x_dir); ball->y_dir = new_ball_dir(collision_on_y,ball->y_dir); xstep = ball_step(ball->x_dir); ystep = ball_step(ball->y_dir); ball->x_loc = ball->x_loc+xstep; ball->y_loc = ball->y_loc+ystep; return; }