whitgl_fvec _game_camera_target(game_game game, whitgl_ivec screen_size) { whitgl_fvec target = whitgl_ivec_to_fvec(game.snake.pos[game.snake.size-1]); whitgl_int i; for(i=game.snake.size-2; i>=0; i--) target = whitgl_fvec_interpolate(target, whitgl_ivec_to_fvec(game.snake.pos[i]), 0.3); whitgl_fvec screen = whitgl_fvec_divide(whitgl_ivec_to_fvec(screen_size), whitgl_fvec_val(8*2)); target = whitgl_fvec_sub(target, screen); whitgl_faabb bounds = {whitgl_fvec_zero, {MAP_WIDTH-screen_size.x/8, MAP_HEIGHT-screen_size.y/8}}; target = whitgl_fvec_bound(target, bounds); target = whitgl_fvec_scale(target, whitgl_fvec_val(8)); return target; }
space_pirate space_pirate_update(space_pirate p, whitgl_fvec target) { if(!p.e.active) return p; whitgl_fvec diff = whitgl_fvec_sub(target, p.e.pos); whitgl_float target_angle = whitgl_fvec_to_angle(diff)+whitgl_pi/2; whitgl_float ang_diff = whitgl_fwrap(target_angle-p.e.angle, -whitgl_pi, whitgl_pi); whitgl_bool r, l; if(ang_diff > 0.2) { r = true; l = false; } else if(ang_diff < -0.2) { r = false; l = true; } else { l = true; r = true; } if(l&&r) { whitgl_fvec impulse = {0,-0.002}; impulse = whitgl_rotate_point_around_point(impulse, whitgl_fvec_zero, p.e.angle); p.speed = whitgl_fvec_add(p.speed, impulse); } if(l) p.angle_speed = whitgl_fclamp(p.angle_speed-0.01, -0.2, 0.2); if(r) p.angle_speed = whitgl_fclamp(p.angle_speed+0.01, -0.2, 0.2); p.angle_speed = p.angle_speed*0.9; p.e.angle = whitgl_fwrap(p.e.angle+p.angle_speed, 0, whitgl_pi*2); p.e.pos = whitgl_fvec_add(p.e.pos, p.speed); p.speed = whitgl_fvec_interpolate(p.speed, whitgl_fvec_zero, 0.01); whitgl_int i; for(i=0; i<2; i++) { whitgl_bool on = i == 0 ? r : l; // if(on && !p.was_on[i]) // whitgl_sound_play(i == 0 ? SOUND_THRUST_L : SOUND_THRUST_R, 1.0); // p.was_on[i] = on; whitgl_float target = on ? 1 : 0; p.engine_thrust[i] = p.engine_thrust[i]*0.6 + 0.4*target; } return p; }