In this article, we will learn How we can add cameras to arcade games in Python.
Adding Camera
You can create a camera in arcade using the Camera() function.
Syntax: arcade.Camera( width. height)
Parameters:
- width: Width of the camera
- height: Height of the camera
So to use this camera we are going to create a new variable.
self.camera = None
Then in our setup() function, we will create our camera using the Camera() function.
self.camera= arcade.Camera(200,200)
After that, we will use the camera.use function in our on_draw() function to use the camera.
self.camera.use()
In the below example, we are going to create MainGame() class. Inside our MainGame() class first we will initialize some variables for velocity, camera, scene, player’s sprite, and physics engine after that we will create 5 functions:
- on_draw(): Inside this function, we will start the rendering using arcade.start_render() then we will draw our scene.
- setup(): Inside this function, we will call the arcade.Scene() and arcade.Camera() functions and then we will load and store our sprites in a sprite list.
- on_update(): Here we will update the x coordinate of our player sprite and our physics engine.
- on_key_press(): Inside this function, we will check which keyboard button is pressed and we will change the value of the velocity variable according to that.
- on_key_release(): Inside this function, we will check which keyboard button is released and we will change the value of the velocity variable according to that.
Sprites Used:
Below is the implementation:
# Importing arcade module import arcade
# Creating MainGame class class MainGame(arcade.Window):
def __init__( self ):
super ().__init__( 600 , 600 , title = "Player Movement" )
# Initializing a variable to store
# the velocity of the player
self .vel_x = 0
# Creating variable for Camera
self .camera = None
# Creating scene object
self .scene = None
# Creating variable to store player sprite
self .player = None
# Creating variable for our game engine
self .physics_engine = None
# Creating on_draw() function to draw on the screen
def on_draw( self ):
arcade.start_render()
self .camera.use()
# Drawing our scene
self .scene.draw()
def setup( self ):
# Initialize Scene object
self .scene = arcade.Scene()
# Using Camera() function
self .camera = arcade.Camera( 200 , 200 )
# Creating different sprite lists
self .scene.add_sprite_list( "Player" )
self .scene.add_sprite_list( "Platforms" ,
use_spatial_hash = True )
# Adding player sprite
self .player_sprite = arcade.Sprite( "Player.png" , 1 )
# Adding coordinates for the center of the sprite
self .player_sprite.center_x = 64
self .player_sprite.center_y = 600
# Adding Sprite in our scene
self .scene.add_sprite( "Player" , self .player_sprite)
# Adding platform sprite
platform = arcade.Sprite( "Platform.png" , 1 )
# Adding coordinates for the center of the platform
platform.center_x = 300
platform.center_y = 32
self .scene.add_sprite( "Platforms" , platform)
# Creating Physics engine
self .physics_engine = arcade.PhysicsEnginePlatformer(
self .player_sprite, self .scene.get_sprite_list( "Platforms" ), 0.5
)
# Creating on_update function to
# update the x coordinate
def on_update( self , delta_time):
# Changing x coordinate of player
self .player_sprite.center_x + = self .vel_x * delta_time
# Updating the physics engine to move the player
self .physics_engine.update()
# Creating function to change the velocity
# when button is pressed
def on_key_press( self , symbol, modifier):
# Checking the button pressed
# and changing the value of velocity
if symbol = = arcade.key.LEFT:
self .vel_x = - 300
elif symbol = = arcade.key.RIGHT:
self .vel_x = 300
# Creating function to change the velocity
# when button is released
def on_key_release( self , symbol, modifier):
# Checking the button released
# and changing the value of velocity
if symbol = = arcade.key.LEFT:
self .vel_x = 0
elif symbol = = arcade.key.RIGHT:
self .vel_x = 0
# Calling MainGame class game = MainGame()
game.setup() arcade.run() |
Output:
But here you can see our camera is not moving with our player. So to move the Camera with our player we have to create a function.
Moving the Camera
Now we are going to create a new camera_move() function to move our camera with our player. Then we will call this function in our on_update() function.
camera_move(): Inside this function, we will calculate the x and y coordinates of the center of the camera according to our player’s position. Then we will move our camera with the help of the move_to() function.
Below is the implementation:
# Importing arcade module import arcade
# Creating MainGame class class MainGame(arcade.Window):
def __init__( self ):
super ().__init__( 600 , 600 , title = "Player Movement" )
# Initializing a variable to store
# the velocity of the player
self .vel_x = 0
# Creating variable for Camera
self .camera = None
# Creating scene object
self .scene = None
# Creating variable to store player sprite
self .player = None
# Creating variable for our game engine
self .physics_engine = None
# Creating on_draw() function to draw on the screen
def on_draw( self ):
arcade.start_render()
# Using the camera
self .camera.use()
# Drawing our scene
self .scene.draw()
def setup( self ):
# Initialize Scene object
self .scene = arcade.Scene()
# Using Camera() function
self .camera = arcade.Camera( 200 , 200 )
# Creating different sprite lists
self .scene.add_sprite_list( "Player" )
self .scene.add_sprite_list( "Platforms" ,
use_spatial_hash = True )
# Adding player sprite
self .player_sprite = arcade.Sprite( "Player.png" , 1 )
# Adding coordinates for the center of the sprite
self .player_sprite.center_x = 64
self .player_sprite.center_y = 600
#Adding Sprite in our scene
self .scene.add_sprite( "Player" ,
self .player_sprite)
# Adding platform sprite
platform = arcade.Sprite( "Platform.png" , 1 )
# Adding coordinates for the center of the platform
platform.center_x = 300
platform.center_y = 32
self .scene.add_sprite( "Platforms" , platform)
# Creating Physics engine
self .physics_engine = arcade.PhysicsEnginePlatformer(
self .player_sprite,
self .scene.get_sprite_list( "Platforms" ), 0.5
)
# Creating on_update function to
# update the x coordinate
def on_update( self ,delta_time):
# Changing x coordinate of player
self .player_sprite.center_x + = self .vel_x * delta_time
# Updating the physics engine to move the player
self .physics_engine.update()
# Calling the camera_move function
self .camera_move()
# Creating function to change the velocity
# when button is pressed
def on_key_press( self , symbol,modifier):
# Checking the button pressed
# and changing the value of velocity
if symbol = = arcade.key.LEFT:
self .vel_x = - 300
elif symbol = = arcade.key.RIGHT:
self .vel_x = 300
# Creating function to change the velocity
# when button is released
def on_key_release( self , symbol, modifier):
# Checking the button released
# and changing the value of velocity
if symbol = = arcade.key.LEFT:
self .vel_x = 0
elif symbol = = arcade.key.RIGHT:
self .vel_x = 0
def camera_move( self ):
# Getting the x coordinate for the center of camera
screen_x = self .player_sprite.center_x -
( self .camera.viewport_width / 2 )
# Getting the y coordinate for the center of camera
screen_y = self .player_sprite.center_y -
( self .camera.viewport_height / 2 )
# Moving the camera
self .camera.move_to([screen_x, screen_y])
# Calling MainGame class game = MainGame()
game.setup() arcade.run() |
Output: