1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 23:52:26 +00:00

Implemented motion 'correctly', for programs written to do all work outside of the pixel area.

This commit is contained in:
Thomas Harte 2017-02-11 20:25:49 -05:00
parent 7ab6023a0c
commit aeff59addc

View File

@ -578,25 +578,45 @@ void TIA::draw_playfield(int start, int end)
void TIA::draw_player(Player &player, CollisionType collision_identity, const int position_identity, int start, int end) void TIA::draw_player(Player &player, CollisionType collision_identity, const int position_identity, int start, int end)
{ {
// don't do anything if this window ends too early
int first_pixel = first_pixel_cycle + (horizontal_blank_extend_ ? 8 : 0);
if(end < first_pixel) return;
if(start < first_pixel) start = first_pixel;
int &position = position_[position_identity]; int &position = position_[position_identity];
int &motion = motion_[position_identity]; int &motion = motion_[position_identity];
bool &is_moving = is_moving_[position_identity]; bool &is_moving = is_moving_[position_identity];
// movement is applied prior to the drawing area (as well as within)
int first_pixel = first_pixel_cycle + (horizontal_blank_extend_ ? 8 : 0);
if(is_moving)
{
// round up to the next H@1 cycle
int movement_time = (start + 3) & ~3;
while(movement_time < end && movement_time < first_pixel)
{
int movement = (movement_time - horizontal_move_start_time_) >> 2;
if(movement == (motion ^ 8))
{
is_moving = false;
break;
}
position ++;
movement_time += 4;
}
position %= 160;
}
// don't do any drawing if this window ends too early
if(end < first_pixel) return;
if(start < first_pixel) start = first_pixel;
// while(start < end) // while(start < end)
// { // {
int length = end - start; int length = end - start;
// quick hack! // quick hack!
if(is_moving) // if(is_moving)
{ // {
position += (motion ^ 8); // position += (motion ^ 8);
is_moving_[position_identity] = false; // is_moving_[position_identity] = false;
position %= 160; // position %= 160;
} // }
// check for initial trigger; player.position is guaranteed to be less than 160 so this is easy // check for initial trigger; player.position is guaranteed to be less than 160 so this is easy
if(player.graphic && position + length >= 160) if(player.graphic && position + length >= 160)