This only works well in some situations, it's an alright start to a brilliant concept. Make your KH script so that the camera rotates when you move:
Code:
IF (key_w == 1 && key_s == 0 && key_a == 0 && key_d == 0) { temp.x = camera.pan; }
IF (key_s == 1 && key_w == 0 && key_a == 0 && key_d == 0) { temp.x = camera.pan + 180; }
IF (key_a == 1 && key_s == 0 && key_w == 0 && key_d == 0) { temp.x = camera.pan + 90; camera.pan += 5 * time; }
IF (key_d == 1 && key_s == 0 && key_a == 0 && key_w == 0) { temp.x = camera.pan - 90; camera.pan -= 5 * time; }
IF (key_w == 1 && key_a == 1 && key_d == 0 && key_s == 0) { temp.x = camera.pan + 45; camera.pan += 2.5 * time; }
IF (key_w == 1 && key_d == 1 && key_a == 0 && key_s == 0) { temp.x = camera.pan - 45; camera.pan -= 2.5 * time; }
IF (key_s == 1 && key_a == 1 && key_d == 0 && key_w == 0) { temp.x = camera.pan + 135; camera.pan += 6 * time; }
IF (key_s == 1 && key_d == 1 && key_a == 0 && key_w == 0) { temp.x = camera.pan - 135; camera.pan -= 6 * time; }
Now add the following code at the beginning of handle_camera. You will need to define the variable result2 or use a different variable.
Code:
result2 = 0; //trace 30 degrees to both sides of the camera and determine if it should move closer to the player
vec_diff(temp.x,camera.x,my.x);
vec_to_angle(temp2.pan,temp.x);
temp2.pan += 45; //45 degrees
vec_set(temp.x,vector(my.x + fcos(temp2.pan,camera_distance),my.y + fsin(temp2.pan,camera_distance),camera.z));
c_trace(my.x,temp.x,ignore_me|ignore_passable|ignore_models);
IF (result > 0) { result2 -= (camera_distance - result)/camera_distance; }
temp2.pan -= 90; //-45 degrees
vec_set(temp.x,vector(my.x + fcos(temp2.pan,camera_distance),my.y + fsin(temp2.pan,camera_distance),camera.z));
c_trace(my.x,temp.x,ignore_me|ignore_passable|ignore_models);
IF (result > 0) { result2 += (camera_distance - result)/camera_distance; }
temp2.pan += 75; //30 degrees
vec_set(temp.x,vector(my.x + fcos(temp2.pan,camera_distance),my.y + fsin(temp2.pan,camera_distance),camera.z));
c_trace(my.x,temp.x,ignore_me|ignore_passable|ignore_models);
IF (result > 0) { result2 -= ((camera_distance - result)/camera_distance) * 2; }
temp2.pan -= 60; //-30 degrees
vec_set(temp.x,vector(my.x + fcos(temp2.pan,camera_distance),my.y + fsin(temp2.pan,camera_distance),camera.z));
c_trace(my.x,temp.x,ignore_me|ignore_passable|ignore_models);
IF (result > 0) { result2 += ((camera_distance - result)/camera_distance) * 2; }
temp2.pan += 45; //15 degrees
vec_set(temp.x,vector(my.x + fcos(temp2.pan,camera_distance),my.y + fsin(temp2.pan,camera_distance),camera.z));
c_trace(my.x,temp.x,ignore_me|ignore_passable|ignore_models);
IF (result > 0) { result2 -= ((camera_distance - result)/camera_distance) * 10; }
temp2.pan -= 30; //-15 degrees
vec_set(temp.x,vector(my.x + fcos(temp2.pan,camera_distance),my.y + fsin(temp2.pan,camera_distance),camera.z));
c_trace(my.x,temp.x,ignore_me|ignore_passable|ignore_models);
IF (result > 0) { result2 += ((camera_distance - result)/camera_distance) * 10; }
camera.pan += result2 * 0.2;
Now the camera will pan based on obstacles around it, in a sense it's as though the camera moves to gt a better angle. It works really well in some cases and not so well in others. It will work well if the level design suits it, should require some tweaking but there's some code for a start. Based on this cool gamasutra article:
http://www.gamasutra.com/gdc2004/features/20040325/giors_02.shtmlOrange Brat posted here:
http://www.coniserver.net/ubbthreads/sho...true#Post681972