How can I limit the screen in pygame?

I just started trying out pygame, so I watched a tutorial. When the guy showed, how to create edges left and right from the screen, it just didn’t work when I did it, even though I’ve written it 100% equal as the tutorial guy. The tutorial is already two years old, so maybe pygame just has changed. Can somebody help me?

That’s my code:

import pygame
import sys

pygame.init()
background = pygame.image.load("C:ProgrammierenPythonGrafikenpygame test1 - background.png")
screen = pygame.display.set_mode([1200,595])
clock = pygame.time.Clock()
pygame.display.set_caption("pygame test1")

def draw():
    screen.blit(background, (0, 0))
    pygame.draw.rect(screen, (0, 0, 255), (x, y, width, height))
    pygame.display.update()

x = 300
y = 300
speed = 3
width = 40
height = 80

left_wall = pygame.draw.rect(screen, (0,0,0), (-2,0,2,600), 0)
right_wall = pygame.draw.rect(screen, (0,0,0), (1201,0,2,600), 0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    character = pygame.Rect(x,y,width, height)
    pressed = pygame.key.get_pressed()
    if presses[pygame.K_UP] or pressed[pygame.K_w] or pressed[pygame.K_SPACE]:
        y -= speed
    if pressed[pygame.K_RIGHT] or pressed[pygame.K_d] and not character.colliderect(right_wall):
        x += speed
    if pressed[pygame.K_DOWN] or pressed[pygame.K_s]:
        y += speed
    if pressed[pygame.K_LEFT] or pressed[pygame.K_a] and not character.colliderect(left_wall):
        x -= speed

    draw()
    clock.tick(60)

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

The following code works for me after replacing the background.png path with a picture that exists on my computer. I changed left_wall and right_wall to call pygame.Rect instead of pygame.draw.rect and copied the draw.rect calls that were previously assigned to left_wall and right_wall to draw() function, and added some needed parentheses in two of the if statements. Also fixed a typo where pressed was spelled presses.

Without the parentheses, the character would always move right when right key is pressed even past the right edge of the window. When “d” is pressed, it would check against colliderect. Same for left arrow and “a” keys. or short-circuits, so if K_RIGHT or K_LEFT is pressed, it doesn’t check the right hand side of the or in the if statements. With the parentheses added, the “move right” if statement always checks colliderect when K_RIGHT or K_d is pressed, instead of only when K_d is pressed.

import pygame
import sys

pygame.init()
background = pygame.image.load("C:ProgrammierenPythonGrafikenpygame test1 - background.png")
screen = pygame.display.set_mode([1200,595])
clock = pygame.time.Clock()
pygame.display.set_caption("pygame test1")

def draw():
    screen.blit(background, (0, 0))
    pygame.draw.rect(screen, (0, 0, 255), (x, y, width, height))
    pygame.draw.rect(screen, (0,0,0), left_wall, 0)
    pygame.draw.rect(screen, (0,0,0), right_wall, 0)
    pygame.display.update()

x = 300
y = 300
speed = 3
width = 40
height = 80

left_wall = pygame.Rect(-2,0,2,600)
right_wall = pygame.Rect(1201,0,2,600)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    character = pygame.Rect(x,y,width, height)
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_UP] or pressed[pygame.K_w] or pressed[pygame.K_SPACE]:
        y -= speed
    if (pressed[pygame.K_RIGHT] or pressed[pygame.K_d]) and not character.colliderect(right_wall):
        x += speed
    if pressed[pygame.K_DOWN] or pressed[pygame.K_s]:
        y += speed
    if (pressed[pygame.K_LEFT] or pressed[pygame.K_a]) and not character.colliderect(left_wall):
        x -= speed

    draw()
    clock.tick(60)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x