float clamp_x;
float clamp_y;
- float dead_zone_x;
+ float dynamic_speed_sm;
CameraConfig() :
xmode(4),
sensitive_x(-1),
clamp_x(0.1666f),
clamp_y(0.3f),
- dead_zone_x(64.0f)
+ dynamic_speed_sm(0.8f)
{
}
camconfig->get("kirby-rectsize-y", kirby_rectsize_y);
camconfig->get("edge-x", edge_x);
camconfig->get("sensitive-x", sensitive_x);
- camconfig->get("dead-zone-x", dead_zone_x);
+ camconfig->get("dynamic-speed-sm", dynamic_speed_sm);
}
};
player_pos.y - SCREEN_HEIGHT * (0.5f - halfsize));
}
if(ymode == 4) {
- // Magic Konstant (include config multiplier?)
- float K = SCREEN_HEIGHT / (16.0f * 2 + SCREEN_HEIGHT);
+ float upperend = SCREEN_HEIGHT * config.edge_x;
+ float lowerend = SCREEN_HEIGHT * (1 - config.edge_x);
- lookahead_pos.y = player_pos.y + K*(lookahead_pos.y - player_pos.y);
+ if (player_delta.y < -CAMERA_EPSILON) {
+ // walking left
+ lookahead_pos.y -= player_delta.y * config.dynamic_speed_sm;
- cached_translation.y = 2 * player_pos.y - lookahead_pos.y - (SCREEN_WIDTH / 2);
+ if(lookahead_pos.y > lowerend) {
+ lookahead_pos.y = lowerend;
+ }
+ } else if (player_delta.y > CAMERA_EPSILON) {
+ // walking right
+ lookahead_pos.y -= player_delta.y * config.dynamic_speed_sm;
+ if(lookahead_pos.y < upperend) {
+ lookahead_pos.y = upperend;
+ }
+ }
+
+ // adjust for level ends
+ if (player_pos.y < upperend) {
+ lookahead_pos.y = upperend;
+ }
+ if (player_pos.y > sector->get_width() - upperend) {
+ lookahead_pos.y = lowerend;
+ }
+
+ cached_translation.y = player_pos.y - lookahead_pos.y;
}
translation.y = cached_translation.y;
player_pos.x - SCREEN_WIDTH * (0.5f - halfsize));
}
if(xmode == 4) {
- // Magic Konstant
- float K = SCREEN_WIDTH / (320.0f /* MAX_RUN_XM */ /64.0f * 2 + SCREEN_WIDTH);
+ float LEFTEND = SCREEN_WIDTH * config.edge_x;
+ float RIGHTEND = SCREEN_WIDTH * (1 - config.edge_x);
+
+ if (player_delta.x < -CAMERA_EPSILON) {
+ // walking left
+ lookahead_pos.x -= player_delta.x * config.dynamic_speed_sm;
+ if(lookahead_pos.x > RIGHTEND) {
+ lookahead_pos.x = RIGHTEND;
+ }
+
+ } else if (player_delta.x > CAMERA_EPSILON) {
+ // walking right
+ lookahead_pos.x -= player_delta.x * config.dynamic_speed_sm;
+ if(lookahead_pos.x < LEFTEND) {
+ lookahead_pos.x = LEFTEND;
+ }
+ }
- // Only update in dead zone
- if( fabsf(player_pos.x - lookahead_pos.x) > config.dead_zone_x )
- lookahead_pos.x = player_pos.x + K*(lookahead_pos.x - player_pos.x);
+ // adjust for level ends
+ if (player_pos.x < LEFTEND) {
+ lookahead_pos.x = LEFTEND;
+ }
+ if (player_pos.x > sector->get_width() - LEFTEND) {
+ lookahead_pos.x = RIGHTEND;
+ }
- cached_translation.x = 2 * player_pos.x - lookahead_pos.x - (SCREEN_WIDTH / 2);
+ cached_translation.x = player_pos.x - lookahead_pos.x;
}
translation.x = cached_translation.x;