;   ;--------------------------------------------------------------------------;
;   ;   Step 8                                                                 ;
;   ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;
;
;,,,,
    ;   Time to put the player in the center of the screen.
    ;   E.g. what you see in all those 2D games.
    ;
    ;   First, we have to know what relates to what.
    ;   If the the player is in the center of the screen,
    ;    then there's no need to control the viewpoint,
    ;    as the viewpoint is always the player on screen.
    ;   We could add a controllable viewpoint but this would
    ;    have to be relative to the player screen position.
    ;   Let's start with just centering the view on the player.
    ;
    ;       +---------------+
    ;       |               | - Screen
    ;       |   (Player)    |
    ;       |      \        |
    ;       |       X       |
    ;       |               |
    ;       |               |
    ;       |               |
    ;       +---------------+
    ;
    ;   When the player is in the center of the screen,
    ;    the player screen position is constant.
    ;
    ;       Player_ScreenPos = Screen_Size / 2
    ;
    ;   Add a background.
    ;
    ;       +---------------+
    ;       |               | - Screen
    ;       |   (Player)    |
    ;       |      \        |
    ;       |       X - - - |-------+
    ;       |       |       |       | - Background
    ;       |               |       |
    ;       |       |       |       |
    ;       +---------------+       |
    ;               |               |
    ;               |               |
    ;               |               |
    ;               +---------------+
    ;
    ;   If the player moves left, the background moves in the reversed
    ;    direction.
    ;   Yes, it's that reversed thingy again :)
    ;
    ;   How does the player world position relate to the view position?
    ;
    ;       (View_Pos)
    ;          \
    ;       -···O---------------+
    ;       ^   |               | - Screen
    ;    ry |   |   (Player)    |
    ;       v   |      \        |
    ;       -···|·······X - - - |-------+
    ;           |       |       |       | - Background
    ;           |       .       |       |
    ;           |       |       |       |
    ;           +---------------+       |
    ;           .       |               |
    ;           .       |               |
    ;           .       |               |
    ;           .       +---------------+
    ;           .       .
    ;           |<----->|
    ;              rx
    ;
    ;   Let's assume that the background always stays at world position (0,0).
    ;   And the player also starts at world position (0,0).
    ;   At this point, world coordinate (0,0) is center of screen.
    ;   When we move the player off the map for about a quarter..
    ;
    ;       (View_Pos)
    ;          \
    ;       -···O---------------+
    ;       ^   |               | - Screen
    ;    ry |   |   (Player)    |
    ;       v   |      \        |
    ;       -···|·······X       |
    ;           |       .       |
    ;           |       .   +- -|-----------+
    ;           |       .   |   |           | - Background
    ;           +---------------+           |
    ;           .       .   |               |
    ;           .       .   |               |
    ;           |<----->|   |               |
    ;              rx       |               |
    ;                       |               |
    ;                       +---------------+
    ;
    ;   The view position moves with the player world position.
    ;   You can conclude that, in english, the view position is the player
    ;    world position minus half the screen.
    ;
    ;       View_Pos = Player_WorldPos - Screen_Size / 2
    ;
    ;   Only thing is, we're not using a view point, as it's always
    ;    directly relative to the player world position.
    ;   So we can forget about that for now :)
;----
;
;,,,,
    ;   Okay so where is the background on screen?
    ;   Well, the background position on screen is also relative
    ;    to the player world position.
    ;
    ;   For a second, let's put the player in upperleft corner of screen
    ;    instead of center of screen.
    ;
    ;       (View_Pos)
    ;          \
    ;           X---------------+
    ;          /|               | - Screen
    ;   (Player)|               |
    ;           |               |
    ;           |       + - - - |-------+
    ;           |       |       |       | - Background
    ;           |               |       |
    ;           |       |       |       |
    ;           +---------------+       |
    ;                   |               |
    ;                   |               |
    ;                   |               |
    ;                   +---------------+
    ;
    ;   So now rx and ry in the above pictures are no longer relevant.
    ;   They are always 0. Meaning?
    ;   The view position equals the player world position.
    ;
    ;   Also, in the above picture the background seems to begin in
    ;    the middle of the screen.
    ;   So because the background position on screen
    ;    is relative to the player world position,
    ;    the player *world* position has to be equal to..
    ;    half the screen :)
    ;
    ;       (Player_WorldPos)/(View_Pos)
    ;          \
    ;       -···X---------------+
    ;       ^   |               | - Screen
    ;    ry |   |(Back_WorldPos)|
    ;       v   |        /      |
    ;       -···|·······O - - - |-------+
    ;           |       |       |       | - Background
    ;           |       .       |       |
    ;           |       |       |       |
    ;           +---------------+       |
    ;           .       |               |
    ;           .       |               |
    ;           .       |               |
    ;           .       +---------------+
    ;           .       .
    ;           |<----->|
    ;              rx
    ;
    ;   Suppose the view position is still equal to the player position.
    ;   In the above display you see rx and ry as the distance between
    ;    player world position and background world position.
    ;
    ;   So the background screen position is the background world position
    ;    minus the player world position.
    ;
    ;       Back_ScreenPos = Back_WorldPos - Player_WorldPos
    ;
    ;   Since the background world position is also 0, you could also write:
    ;
    ;       Back_ScreenPos = -Player_WorldPos
    ;
    ;   But let's keep it in for clarity.
    ;
    ;   Now if we move the player back to the center of the screen..
    ;
    ;       +-------------+
    ;       |             | - Screen
    ;       |  (Player)   |
    ;       |     \       |
    ;       |      X······|················-
    ;       |      .      |                ^
    ;       |      .      |                | ry
    ;       |      .      |                v
    ;       +-------------+-------------+··-
    ;              .      |             |
    ;              .      |             | - Background
    ;              .      |             |
    ;              .      |             |
    ;              .      |             |
    ;              .      |             |
    ;              .      |             |
    ;              .      +-------------+
    ;              .      .
    ;              |<---->|
    ;                 rx
    ;
    ;   The relativity (rx,ry) is still the same.
    ;   The only thing that is changed is that half a screen is
    ;    added to all screen positions.
    ;
    ;   So let's remember our current background equation.
    ;
    ;       Back_ScreenPos = Back_WorldPos - Player_WorldPos
    ;
    ;   Now add half the screen.
    ;
    ;       Back_ScreenPos = Back_WorldPos - Player_WorldPos + Screen_Size / 2
    ;
    ;   And that's it! :)
;----

    Back_SizeX = GraphicsWidth ()
    Back_SizeY = GraphicsHeight ()

    Player_SizeX = 20
    Player_SizeY = 20

    Back_WorldPosX = 0
    Back_WorldPosY = 0

    Player_WorldPosX = 0
    Player_WorldPosY = 0

    ;   This variable/constant is the offset on screen
    ;    where the player should be.

    Player_ScreenPosX = GraphicsWidth ()  / 2
    Player_ScreenPosY = GraphicsHeight () / 2

    SetBuffer BackBuffer ()
    Repeat

        ;   Arrow keys control player world position.

        If KeyDown ( 200 ) Then Player_WorldPosY = Player_WorldPosY - 1
        If KeyDown ( 208 ) Then Player_WorldPosY = Player_WorldPosY + 1
        If KeyDown ( 203 ) Then Player_WorldPosX = Player_WorldPosX - 1
        If KeyDown ( 205 ) Then Player_WorldPosX = Player_WorldPosX + 1

        ;   View position relative to player world position.
        ;   Originally we had:
        ;
        ;       View_Pos = Player_WorldPos - ( Screen_Size / 2 )
        ;                                    `-----------------'
        ;                                             |
        ;                        +--------------------+
        ;                        |
        ;                .--------------.
        ;   I've defined Player_ScreenPos variables for this purpose.

        View_PosX = Player_WorldPosX - Player_ScreenPosX
        View_PosY = Player_WorldPosY - Player_ScreenPosY

        ;   Although the above is totally unused :)

        ;   Okay, the background.
        ;   Filled in Player_ScreenPos in the same way.
        ;   Now don't go filling in stuff with other stuff that incidently
        ;    leads to the same results but has nothing to do with it :P

        Back_ScreenPosX = Back_WorldPosX - Player_WorldPosX + Player_ScreenPosX
        Back_ScreenPosY = Back_WorldPosY - Player_WorldPosY + Player_ScreenPosY

        Rect Back_ScreenPosX , Back_ScreenPosY , Back_SizeX , Back_SizeY , False

        ;   Player screen position is constant,
        ;    so doesn't need to be calculated.

        Rect Player_ScreenPosX,Player_ScreenPosY,Player_SizeX,Player_SizeY,False
        Flip
        Cls

    Until KeyHit ( 1 )
    End