We will make a Pygame window where you can click your mouse to make a red dot. Then, if you press the 'T' key, a blue dot will appear at the same spot where you last clicked. This shows how the game can remember things you do.
We will make a Pygame window where you can click your mouse to make a red dot. Then, if you press the 'T' key, a blue dot will appear at the same spot where you last clicked. This shows how the game can remember things you do.
Run this command to see what parts of your code are not working yet.
pytest module-1.2/blueprint-3/quest-45
Here's what we expect to see:
test_click_draws_red_dot
test_t_key_press_without_click_does_nothing
test_click_then_t_key_press_draws_both_dots
test_other_key_press_does_nothing
Now it's your turn to write the code in main.py
!
Your program needs to remember where you click the mouse. When you click, it should draw a red dot. If you then press the 'T' key, it should draw a blue dot at the same spot.
Here are some examples of how Pygame works. These examples show different parts of a Pygame program. You will need to use these ideas to build your own complete program.
import pygame
# Example: Storing a position
last_position = None
# Example: Drawing a red circle
def draw_red_circle(surface, position, radius=15):
pygame.draw.circle(surface, (255, 0, 0), position, radius)
# Example: Drawing a blue circle
def draw_blue_circle(surface, position, radius=15):
pygame.draw.circle(surface, (0, 0, 255), position, radius)
# Example: Checking for mouse clicks and key presses
def handle_input_events(event, stored_pos):
if event.type == pygame.MOUSEBUTTONDOWN:
print(f"Mouse clicked at: {event.pos}")
return event.pos # Store this position
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_t:
print("T key pressed!")
# You would use stored_pos here to draw the blue dot
return stored_pos # Return the stored position (or None)
Run this command again to see if your code works.
pytest module-1.2/blueprint-3/quest-45
Here's what we want to see:
test_initialization_and_quit
test_click_draws_red_dot
test_t_key_press_without_click_does_nothing
test_click_then_t_key_press_draws_both_dots
test_other_key_press_does_nothing
This document provides a quick reference for key concepts and functions related to handling mouse input and drawing basic shapes in Pygame.
A typical Pygame application uses a main loop that repeats continuously. This loop is often structured into distinct phases to manage the flow of the program.
# Basic structure of a Pygame game loop
running = True
while running:
# Phase 1: Process Input
for event in pygame.event.get():
# Handle events here (e.g., check event.type)
pass
# Phase 2: Update State
# Modify game variables here
# Phase 3: Render
screen.fill(BACKGROUND_COLOR) # Clear screen
# Draw game elements here
pygame.display.flip() # Update the display
# After the loop exits
pygame.quit()
Pygame collects all user actions and window events in an event queue. You access these events using pygame.event.get()
, which returns a list of all events that have occurred since the last call.
# Inside the main loop
for event in pygame.event.get():
# Check the type of the event
if event.type == pygame.QUIT:
# Handle window closing
pass
# Check for other event types...
Mouse actions generate specific types of events.
pygame.MOUSEMOTION
: Occurs when the mouse cursor moves over the window.pygame.MOUSEBUTTONDOWN
: Occurs when a mouse button is pressed down.pygame.MOUSEBUTTONUP
: Occurs when a mouse button is released.for event in pygame.event.get():
if event.type == pygame.MOUSEMOTION:
# Code to run when the mouse moves
pass
if event.type == pygame.MOUSEBUTTONDOWN:
# Code to run when a mouse button is pressed
pass
if event.type == pygame.MOUSEBUTTONUP:
# Code to run when a mouse button is released
pass
Event objects contain attributes that provide details about the event.
event.pos
: A tuple (x, y)
representing the mouse coordinates at the time the event occurred.event.button
: An integer indicating which mouse button was pressed or released (only for MOUSEBUTTONDOWN
and MOUSEBUTTONUP
events).
1
: Left button2
: Middle button3
: Right button4
: Scroll wheel up5
: Scroll wheel down# Example of accessing event attributes
for event in pygame.event.get():
if event.type == pygame.MOUSEMOTION:
mouse_position = event.pos
# Use mouse_position (e.g., print it, draw something there)
# print(mouse_position) # Example from MQ10
if event.type == pygame.MOUSEBUTTONDOWN:
click_position = event.pos
button_number = event.button
# Use click_position and button_number
# print(button_number) # Example from MQ55
# Check which button was pressed
if event.button == 1:
# Code for left-click
pass
elif event.button == 3:
# Code for right-click
pass
State management involves using variables to keep track of information that persists between frames or events. Boolean flags and position variables are common examples.
A boolean variable (True
or False
) is useful for tracking simple on/off states, such as whether a drawing action is currently active.
# Initialize state outside the loop
is_drawing = False
# Inside the event loop:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
# Set the flag when drawing starts
is_drawing = True
# print("State changed: is_drawing is now True") # Example from MQ30
if event.type == pygame.MOUSEBUTTONUP:
# Unset the flag when drawing stops
is_drawing = False
# print("State changed: is_drawing is now False") # Example from MQ30
# Inside the update or render phase:
# Use the flag to control behavior
if is_drawing:
# Perform drawing actions only when the flag is True
pass
Variables can store coordinate tuples (x, y)
to remember locations, such as the starting point of a line or the position of the last click.
# Initialize state outside the loop
last_pos = None # Use None to indicate no position is stored initially
# Inside the event loop:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
# Store the position when the button is pressed
last_pos = event.pos
if event.type == pygame.MOUSEBUTTONUP:
# Reset the position when drawing stops
last_pos = None
if event.type == pygame.MOUSEMOTION:
# If drawing is active and a last position exists
if is_drawing and last_pos is not None:
current_pos = event.pos
# Draw something using last_pos and current_pos
# pygame.draw.line(screen, COLOR, last_pos, current_pos, WIDTH) # Example from MQ50
# Update last_pos for the next motion event
last_pos = current_pos
Drawing in Pygame happens on a Surface
object, typically the main screen
surface.
Draws a circle on a surface.
pygame.draw.circle(surface, color, center_pos, radius)
surface
: The Surface
object to draw on.color
: An RGB tuple (e.g., (255, 0, 0)
for red).center_pos
: A tuple (x, y)
for the center of the circle.radius
: The radius of the circle in pixels.# Example: Draw a red circle at (100, 150) with radius 20
RED = (255, 0, 0)
center = (100, 150)
radius = 20
pygame.draw.circle(screen, RED, center, radius) # Example from MQ35
Draws a rectangle on a surface. This function requires a pygame.Rect
object to define the rectangle's position and size.
pygame.draw.rect(surface, color, rect_object)
surface
: The Surface
object to draw on.color
: An RGB tuple.rect_object
: A pygame.Rect
object defining (left, top, width, height)
.pygame.Rect(left, top, width, height)
# Example: Draw a blue rectangle at (50, 50) with width 100 and height 50
BLUE = (0, 0, 255)
rect_x = 50
rect_y = 50
rect_width = 100
rect_height = 50
my_rect = pygame.Rect(rect_x, rect_y, rect_width, rect_height)
pygame.draw.rect(screen, BLUE, my_rect) # Example from MQ70 (body)
Draws a line connecting two points on a surface.
pygame.draw.line(surface, color, start_pos, end_pos, width)
surface
: The Surface
object to draw on.color
: An RGB tuple.start_pos
: A tuple (x, y)
for the starting point.end_pos
: A tuple (x, y)
for the ending point.width
: The thickness of the line in pixels.# Example: Draw a black line from (10, 10) to (200, 50) with thickness 3
BLACK = (0, 0, 0)
start = (10, 10)
end = (200, 50)
thickness = 3
pygame.draw.line(screen, BLACK, start, end, thickness) # Example from MQ50
By combining event handling, state management, and drawing functions, you can create interactive drawing programs. Events like MOUSEBUTTONDOWN
, MOUSEBUTTONUP
, and MOUSEMOTION
can trigger changes in state variables (like is_drawing
or last_pos
), and the drawing phase uses these state variables to determine what and where to draw on the screen. Checking event.button
allows for different actions or drawing styles based on which mouse button is used.