Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pygame: Drawing a border of a rectangle [duplicate]

I am creating a 3d pong game using pygame. I wanted to add a thick black border layer to the rectangle to make it more stylish. Here's what I tried:

pygame.draw.rect(screen, (0,0,255), (x,y,150,150), 0)
pygame.draw.rect(screen, (0,0,0), (x-1,y-1,155,155), 1)
pygame.draw.rect(screen, (0,0,0), (x-2,y-2,155,155), 1)
pygame.draw.rect(screen, (0,0,0), (x-3,y-3,155,155), 1)
pygame.draw.rect(screen, (0,0,0), (x-4,y-4,155,155), 1)

It worked but as the game I am trying to create is a 3d game this method was time consuming. Please tell me if there is any inbuilt method in pygame to draw borders around a rectangle. Sorry for my English.

like image 755
Manan Bhansali Avatar asked May 22 '20 08:05

Manan Bhansali


2 Answers

You could also put it in a function, and make it more concise with for loops. First, you'll note that the four rectangles you drew were in a nice, easy pattern, so you could compact the drawing of the four rectangles like this:

pygame.draw.rect(surface, (0,0,255), (x,y,150,150), 0)
for i in range(4):
    pygame.draw.rect(surface, (0,0,0), (x-i,y-i,155,155), 1)

Then, because pygame draw functions do not need to be run in the global scope, you can put all this into a function:

def drawStyleRect(surface):
    pygame.draw.rect(surface, (0,0,255), (x,y,150,150), 0)
    for i in range(4):
        pygame.draw.rect(surface, (0,0,0), (x-i,y-i,155,155), 1)

Then, in your mainloop, all you have to do is run:

while not done:
   ...
   drawStyleRect(screen) # Or whatever you named the returned surface of 'pygame.display.set_mode()'
   ...

You could even put the drawing function in a separate module, if you really wanted to.

like image 82
User 12692182 Avatar answered Nov 13 '22 05:11

User 12692182


Create a function that creates a pygame.Surface object with per pixel alpha (SRCALPHA) and draw the rectangle and the border on the surface:

def create_rect(width, height, border, color, border_color):
    surf = pygame.Surface((width+border*2, height+border*2), pygame.SRCALPHA)
    pygame.draw.rect(surf, color, (border, border, width, height), 0)
    for i in range(1, border):
        pygame.draw.rect(surf, border_color, (border-i, border-i, width+5, height+5), 1)
    return surf

Create all the surfaces before the main application loop and blit them in the loop:

rect_surf1 = create_rect(150, 150, 5, (0, 0, 255), (0, 0, 0))
# [...]

run = True
while run:

    # [...]

    screen.blit(rect_surf1, (x, y))

    # [...]
like image 44
Rabbid76 Avatar answered Nov 13 '22 05:11

Rabbid76