In this article, we will learn How we can add collisions in arcade games in Python.
Installation
You can install the Arcade module using the below command:
pip install arcade
Example 1:
In this example, we are going to use the check_for_collision() function to add collision between 2 sprites.
Syntax: arcade.check_for_collision( sprite1, sprite2)
Parameters:
- sprite1:- First sprite
- sprite2:- Second sprite
Returns: Boolean value
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 Player1 and Player2
self .vel_x1 = 380
self .vel_x2 = 380
self .scene = None
# Creating variable to store player sprite
self .player1 = None
# Creating variable to store player sprite
self .player2 = None
# Creating on_draw() function to draw on the screen
def on_draw( self ):
arcade.start_render()
# Drawing the scene
self .scene.draw()
def setup( self ):
# Creating scene
self .scene = arcade.Scene()
# Adding player sprite
self .player_sprite1 = arcade.Sprite( "Player.png" , 1 )
self .player_sprite2 = arcade.Sprite( "Player2.png" , 1 )
# Adding coordinates for the center of the sprite
self .player_sprite1.center_x = 20
self .player_sprite1.center_y = 300
# Adding coordinates for the center of the sprite
self .player_sprite2.center_x = 580
self .player_sprite2.center_y = 300
# Adding sprites in scene
self .scene.add_sprite( 'Player' , self .player_sprite1)
self .scene.add_sprite( 'Player' , self .player_sprite2)
# Creating on_update function to
# update the x coordinate
def on_update( self , delta_time):
# Changing x coordinate of players
self .player_sprite1.center_x + = self .vel_x1 * delta_time
self .player_sprite2.center_x - = self .vel_x2 * delta_time
# Checking if sprites are colliding or not
colliding = arcade.check_for_collision(
self .player_sprite1, self .player_sprite2)
# If sprites are colliding then changing direction
if colliding:
self .vel_x1 * = - 1
self .vel_x2 * = - 1
# Changing the direction if sprites crosses the screen boundary
if self .player_sprite1.center_x > 600 or self .player_sprite1.center_x < 0 :
self .vel_x1 * = - 1
if self .player_sprite2.center_x > 600 or self .player_sprite2.center_x < 0 :
self .vel_x2 * = - 1
# Calling MainGame class game = MainGame()
game.setup() arcade.run() |
Output:
Example 2:
In this example, we are going to use PhysicsEnginePlatformer() function to add collision between our player and platform.
Syntax: arcade.PhysicsEnginePlatformer(player_sprite, platforms,, gravity, ladders)
Parameters:
- player_sprite:- The player sprite
- platforms:- The platform sprite list
- gravity:- Amount of gravity
- ladders:- Ladders the user can climb on
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 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()
# Drawing our scene
self .scene.draw()
def setup( self ):
# Initialize Scene object
self .scene = arcade.Scene()
# 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: