102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
This demo shows drawing a grid of squares using a single buffer.
 | 
						|
 | 
						|
We calculate the points of each rectangle and add them to a point list.
 | 
						|
We create a list of colors for each point.
 | 
						|
We then draw all the squares with one drawing command.
 | 
						|
 | 
						|
This runs in about 0.000 seconds for me. It is much more complex in code
 | 
						|
than the prior two examples, but the pay-off in speed is huge.
 | 
						|
 | 
						|
If Python and Arcade are installed, this example can be run from the command line with:
 | 
						|
python -m arcade.examples.shape_list_demo_3
 | 
						|
"""
 | 
						|
 | 
						|
import arcade
 | 
						|
import timeit
 | 
						|
 | 
						|
SCREEN_WIDTH = 1200
 | 
						|
SCREEN_HEIGHT = 800
 | 
						|
SCREEN_TITLE = "Shape List Demo 3"
 | 
						|
 | 
						|
HALF_SQUARE_WIDTH = 2.5
 | 
						|
HALF_SQUARE_HEIGHT = 2.5
 | 
						|
SQUARE_SPACING = 10
 | 
						|
 | 
						|
 | 
						|
class MyGame(arcade.Window):
 | 
						|
    """ Main application class. """
 | 
						|
 | 
						|
    def __init__(self, width, height, title):
 | 
						|
        super().__init__(width, height, title)
 | 
						|
 | 
						|
        arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
 | 
						|
 | 
						|
        self.draw_time = 0
 | 
						|
        self.shape_list = None
 | 
						|
 | 
						|
    def setup(self):
 | 
						|
        self.shape_list = arcade.ShapeElementList()
 | 
						|
 | 
						|
        # --- Create all the rectangles
 | 
						|
 | 
						|
        # We need a list of all the points and colors
 | 
						|
        point_list = []
 | 
						|
        color_list = []
 | 
						|
 | 
						|
        # Now calculate all the points
 | 
						|
        for x in range(0, SCREEN_WIDTH, SQUARE_SPACING):
 | 
						|
            for y in range(0, SCREEN_HEIGHT, SQUARE_SPACING):
 | 
						|
 | 
						|
                # Calculate where the four points of the rectangle will be if
 | 
						|
                # x and y are the center
 | 
						|
                top_left = (x - HALF_SQUARE_WIDTH, y + HALF_SQUARE_HEIGHT)
 | 
						|
                top_right = (x + HALF_SQUARE_WIDTH, y + HALF_SQUARE_HEIGHT)
 | 
						|
                bottom_right = (x + HALF_SQUARE_WIDTH, y - HALF_SQUARE_HEIGHT)
 | 
						|
                bottom_left = (x - HALF_SQUARE_WIDTH, y - HALF_SQUARE_HEIGHT)
 | 
						|
 | 
						|
                # Add the points to the points list.
 | 
						|
                # ORDER MATTERS!
 | 
						|
                # Rotate around the rectangle, don't append points caty-corner
 | 
						|
                point_list.append(top_left)
 | 
						|
                point_list.append(top_right)
 | 
						|
                point_list.append(bottom_right)
 | 
						|
                point_list.append(bottom_left)
 | 
						|
 | 
						|
                # Add a color for each point. Can be different colors if you want
 | 
						|
                # gradients.
 | 
						|
                for i in range(4):
 | 
						|
                    color_list.append(arcade.color.DARK_BLUE)
 | 
						|
 | 
						|
        shape = arcade.create_rectangles_filled_with_colors(point_list, color_list)
 | 
						|
        self.shape_list.append(shape)
 | 
						|
 | 
						|
    def on_draw(self):
 | 
						|
        """
 | 
						|
        Render the screen.
 | 
						|
        """
 | 
						|
 | 
						|
        # This command has to happen before we start drawing
 | 
						|
        arcade.start_render()
 | 
						|
 | 
						|
        # Start timing how long this takes
 | 
						|
        draw_start_time = timeit.default_timer()
 | 
						|
 | 
						|
        # --- Draw all the rectangles
 | 
						|
        self.shape_list.draw()
 | 
						|
 | 
						|
        output = f"Drawing time: {self.draw_time:.3f} seconds per frame."
 | 
						|
        arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE, 18)
 | 
						|
 | 
						|
        self.draw_time = timeit.default_timer() - draw_start_time
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
 | 
						|
    window.setup()
 | 
						|
    arcade.run()
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |