;
; ;--------------------------------------------------------------------------;
; ; Step 9 ;
; ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;
;
;,,,,
; Same as Step 8, but with controllable view point.
;
; Again, let's recap.
;
; S---=---=---=---+
; | |
; ( )
; | |
; ( P )
; | |
; ( )
; | |
; +---=---=---=---+
;
; Everything on screen is relative to the player world position.
; Where the Player screen pos is half the screen.
;
; Player screen pos = Screen size / 2
;
; Add background.
;
; S---=---=---=---+
; | |
; ( )
; | |
; ( P )
; | |
; ( B- -)-----------+
; | |· ·|o o o o o o|
; +---=---=---=---+ o o o o o |
; |o o o o o o o o|
; | o o o o o o o |
; |o o o o o o o o|
; | o o o o o o o |
; |o o o o o o o o|
; +---------------+
;
; The old background screen position equation:
;
; Back screen pos = Back world pos - Player world pos
; + Player screen pos
;----
;
;,,,,
; We want to add a relative viewpoint to all world positions on screen.
;
; Screen coord = World coord + Relative view point
;
; Formerly we were using the View_Pos variables.
; I'm affraid we're gonna have to rename this to View_WorldPos.
;
; So when we want to move the screen over the world,
; e.g. the reversed thingy again,
; all we have to do is subtracting this
; from all world-to-screen equations.
; Yes, it's that simple! :)
;
; First, background.
;
; Back screen pos = Back world pos - Player world pos
; + Player screen pos - View world pos
;
; Second, player.
;
; Player screen pos = Screen size / 2 - View world pos
;----
; -- Sizes --
; Introducing the screen size variables.
Screen_SizeX = GraphicsWidth ()
Screen_SizeY = GraphicsHeight ()
; Half the screen or 'screen middle'.
Screen_MidX = Screen_SizeX / 2
Screen_MidY = Screen_SizeY / 2
Back_SizeX = Screen_SizeX
Back_SizeY = Screen_SizeY
Player_SizeX = 20
Player_SizeY = 20
; -- Positions --
Back_WorldPosX = 0
Back_WorldPosY = 0
Player_WorldPosX = 0
Player_WorldPosY = 0
View_WorldPosX = 0
View_WorldPosY = 0
; -- Loop --
SetBuffer BackBuffer ()
Repeat
; -- Input --
; Regular arrow keys to move the player.
If KeyDown ( 200 ) Then Player_WorldPosY = Player_WorldPosY - 2
If KeyDown ( 208 ) Then Player_WorldPosY = Player_WorldPosY + 2
If KeyDown ( 203 ) Then Player_WorldPosX = Player_WorldPosX - 2
If KeyDown ( 205 ) Then Player_WorldPosX = Player_WorldPosX + 2
; Keypad arrow keys to move the view point.
If KeyDown ( 72 ) Then View_WorldPosY = View_WorldPosY - 2
If KeyDown ( 80 ) Then View_WorldPosY = View_WorldPosY + 2
If KeyDown ( 75 ) Then View_WorldPosX = View_WorldPosX - 2
If KeyDown ( 77 ) Then View_WorldPosX = View_WorldPosX + 2
; -- Logic --
; Equation for background position on screen:
;
; Back screen pos = Back world pos - Player world pos
; + Player screen pos - View world pos
;
; Because we now have a variable player screen position,
; and the 'player screen position' in the above equation
; is actually the player offset on screen,
; we'll substitute this with 'middle of screen' directly.
; This way we can alter the player screen position
; without having to worry about screwing
; the background position on screen.
Back_ScreenPosX = Back_WorldPosX - Player_WorldPosX + Screen_MidX - View_WorldPosX
Back_ScreenPosY = Back_WorldPosY - Player_WorldPosY + Screen_MidY - View_WorldPosY
; Okay, same thing for equation for player screen position.
;
; Player screen pos = Screen size / 2 - View world pos
Player_ScreenPosX = Screen_MidX - View_WorldPosX
Player_ScreenPosY = Screen_MidY - View_WorldPosY
; -- Render --
Rect Back_ScreenPosX , Back_ScreenPosY , Back_SizeX , Back_SizeY , False
Rect Player_ScreenPosX,Player_ScreenPosY,Player_SizeX,Player_SizeY,False
Flip
Cls
Until KeyHit ( 1 )
End