Open In App

Display Snowfall using arcade library in Python

Last Updated : 05 Nov, 2020
Improve
Improve
Like Article
Like
Save
Share
Report

In this article, we are going to display snowfall using the arcade Python Package. The Arcade library is a modern Python Module used widely for developing 2D video games with compelling graphics and sound. It is an object-oriented library and can be installed like any other Python Package.

Step-by-step Approach:

  • First and foremost step in this series is to import the arcade library in your Python IDE. Also import random and math module, since in displaying snowfall at random places on the screen.

Python3




# Import required modules
import random
import math
import arcade


  • Specify the values for screen width, height, and title of the output screen.

Python3




# Adjust window attributes
Width = 800
Height = 600
Title = "SnowFall"


  • Define a class snow_fall which consists of __init__ method and a function to reset snowfall to random position above screen.

Python3




class snow_fall:
    def __init__(self):
        self.x = 0
        self.y = 0
  
    def reset_snow(self):
  
        # Reset flake to random position above screen
        self.y = random.randrange(Height, Height + 100)
        self.x = random.randrange(Width)


  • Now, define another class snowfall() and function to randomly position snowfall.

Python3




class snowfall(arcade.Window):
    def __init__(self, width, height, title):
        
        # Calls "__init__" of parent class 
        # (arcade.Window) to setup screen
        super().__init__(width, height, title)
  
    def start_snowfall(self):
        
        # Set up snowfall and initialize variables.
        self.snowfall_list = []
  
        for i in range(50):
              
            # Create snowfall instance
            snowfall = snow_fall()
  
            # Randomly position snowfall
            snowfall.x = random.randrange(Width)
            snowfall.y = random.randrange(Height + 200)
  
            # Set other variables for the snowfall
            snowfall.size = random.randrange(8)
            snowfall.speed = random.randrange(20, 40)
            snowfall.angle = random.uniform(math.pi, math.pi * 2)
  
            # Add snowflake to snowfall list
            self.snowfall_list.append(snowfall)


  • Set the background color.

Python3




# Set the background color
arcade.set_background_color(arcade.color.BLUE)


  • Now, define the function for animating snowfall and displaying the current position of each snowfall.

Python3




def on_draw(self):
  
        # This command is necessary before drawing
        arcade.start_render()
  
        # Draw the current position of each snowfall
        for snowfall in self.snowfall_list:
            arcade.draw_circle_filled(snowfall.x, snowfall.y,
                                      snowfall.size, arcade.color.WHITE)
  
    def on_update(self, delta_time):
          
        # Animate all the snowfall falling
        for snowfall in self.snowfall_list:
            snowfall.y -= snowfall.speed * delta_time
  
            # Check if snowfall has fallen below screen
            if snowfall.y < 0:
                snowfall.reset_snow()
  
            # Some math to make the snowfall move side to side
            snowfall.x += snowfall.speed * \
                math.cos(snowfall.angle) * delta_time
            snowfall.angle += 1 * delta_time


  • Last step is to create an arcade object and call the required methods.

Python3




# Driver Code
if __name__ == "__main__":
    screen = snowfall(800, 600, "Snow")
    screen.start_snowfall()
    arcade.run()


Below is the complete program based on the above approach:

Python3




# Import required modules
import random
import math
import arcade
  
  
  
# Adjust window attributes
Width = 800
Height = 600
Title = "SnowFall"
  
  
  
class snow_fall:
    def __init__(self):
        self.x = 0
        self.y = 0
  
    def reset_snow(self):
          
        # Reset flake to random position above screen
        self.y = random.randrange(Height, Height + 100)
        self.x = random.randrange(Width)
  
  
  
class snowfall(arcade.Window):
    def __init__(self, width, height, title):
        
        # Calls "__init__" of parent class 
        # (arcade.Window) to setup screen
        super().__init__(width, height, title)
  
    def start_snowfall(self):
        
        # Set up snowfall and initialize variables.
        self.snowfall_list = []
  
        for i in range(50):
              
            # Create snowfall instance
            snowfall = snow_fall()
  
            # Randomly position snowfall
            snowfall.x = random.randrange(Width)
            snowfall.y = random.randrange(Height + 200)
  
            # Set other variables for the snowfall
            snowfall.size = random.randrange(8)
            snowfall.speed = random.randrange(20, 40)
            snowfall.angle = random.uniform(math.pi, math.pi * 2)
  
            # Add snowflake to snowfall list
            self.snowfall_list.append(snowfall)
  
        # Set the background color
        arcade.set_background_color(arcade.color.BLUE)
  
    def on_draw(self):
          
        # This command is necessary before drawing
        arcade.start_render()
  
        # Draw the current position of each snowfall
        for snowfall in self.snowfall_list:
            arcade.draw_circle_filled(snowfall.x, snowfall.y,
                                      snowfall.size, arcade.color.WHITE)
  
    def on_update(self, delta_time):
          
        # Animate all the snowfall falling
        for snowfall in self.snowfall_list:
            snowfall.y -= snowfall.speed * delta_time
  
            # Check if snowfall has fallen below screen
            if snowfall.y < 0:
                snowfall.reset_snow()
  
            # Some math to make the snowfall move side to side
            snowfall.x += snowfall.speed * \
                math.cos(snowfall.angle) * delta_time
            snowfall.angle += 1 * delta_time
  
  
  
# Driver Code
if __name__ == "__main__":
    screen = snowfall(800, 600, "Snow")
    screen.start_snowfall()
    arcade.run()


Output:



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads