LaVOZs

The World’s Largest Online Community for Developers

'; python - How to resize an image in pygame to reach the top/bottom of screen? - LavOzs.Com

I'm remaking flappy bird in pygame but with a Star Wars theme. I've completed the art and general formatting of the game, but now I need to tweak the specifics. I've been switching numbers around to try to get the lightsabers to fully reach the top and bottom of the screen because at the moment there are sometimes gaps that aren't the intended space to pass through. enter image description here

import pygame
from random import randint
from pygame.locals import *

#Define Colors - RGB
black = (0,0,0)
white = (255,255,255)
green = (0,255,0)
red = (255,0,0)

pygame.init()

#Screen Size
size = 700,500
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Flappy Bird in Python")

done = False
clock = pygame.time.Clock()

def ball(x,y):
    #Radius of 20 px
    ballImg1 = pygame.image.load('PlayerFrame1.png')
    ballImg1 = pygame.transform.scale(ballImg1,(50,50))
    screen.blit(ballImg1, (x,y))
    ballImg2 = pygame.image.load('PlayerFrame2.png')
    ballImg2 = pygame.transform.scale(ballImg2,(50,50))
    screen.blit(ballImg2, (x,y))

def gameover():
    font = pygame.font.SysFont(None,55)
    text = font.render("Game Over! Try Again?",True,red)
    screen.blit(text, [150,250])

def obstacle(xloc,yloc,xsize,ysize):
    pipe = pygame.image.load('blade.png')
    pipe1 = pygame.transform.scale(pipe,(xsize,ysize))
    pipe2 = pygame.transform.scale(pipe,(xsize,500))
    screen.blit(pipe1,[xloc,yloc,xsize,ysize])
    screen.blit(pipe2,[xloc,int(yloc+ysize+space),xsize,ysize+500]))

#If the ball is between 2 points on the screen, increment score
def Score(score):
    font = pygame.font.SysFont(None,55)
    text = font.render("Score: "+str(score),True,white)
    screen.blit(text, [0,0])

x = 350
y = 250
x_speed = 0
y_speed = 0
ground = 477
xloc = 700
yloc = 0
xsize = 70
ysize = randint(0,350)
#Size of space between 2 blocks
space = 150
obspeed = 2
score = 0


while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                y_speed = -5

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                y_speed = 4


    screen.fill(black)
    obstacle(xloc,yloc,xsize,ysize)
    ball(x,y)
    Score(score)

    y += y_speed
    xloc -= obspeed

    if y > ground:
        gameover()
        y_speed = 0
        obspeed = 0

    if x+20 > xloc and y-20 < ysize and x-15 < xsize+xloc:
        gameover()
        y_speed = 0
        obspeed = 0

    if x+20 > xloc and y+20 < ysize and x-15 < xsize+xloc:
        gameover()
        y_speed = 0
        obspeed = 0

    if xloc < -80:
        xloc = 700
        ysize = randint(0,350)

    if x > xloc and x < xloc+3:
        score = score + 1

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

You should load image only once and rescale to window height - and get its size and position as pygame.Rect() (using get_rect())

image = pygame.image.load("images.png").convert()
image = pygame.transform.scale(image, (50, SCREEN_HEIGHT))
image_rect = image.get_rect()

and then you can create pygame.Rect() for every pipe

pipe1_rect = image_rect.copy()
pipe2_rect = image_rect.copy()

If gap has size 200 and it should be 300 pixel at top

gap_size = 200
gap_top = 300

then positions of pipes will be

pipe1_rect.bottom = gap_top
pipe2_rect.top = pipe1_rect.bottom + gap_size

and you will blit it as

screen.blit(image, pipe1_rect)
screen.blit(image, pipe2_rect)

and you will move it from right to left

pipe1_rect.x -= 1
pipe2_rect.x -= 1

Example code

EDIT: I added: gap is in random position, pipes are moving, when ball touch pipes then it prints "Game Over" in console/terminal, when pipes touch left side of screen then it prints "WIN" in console/terminal

import pygame
import random 

# --- constants --- (UPPER_CASE_NAMES)

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

FPS = 60

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)

# --- classes --- (CamelCaseNames)

# empty 

# --- main ---

pygame.init()

screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
screen_rect = screen.get_rect()

image = pygame.image.load("Obrazy/images/paddle.png").convert()
image = pygame.transform.scale(image, (50, SCREEN_HEIGHT))
image_rect = image.get_rect()

pipe1_rect = image_rect.copy()
pipe2_rect = image_rect.copy()

pipe1_rect.right = screen_rect.right # move to right of screen
pipe2_rect.right = screen_rect.right # move to right of screen

gap_size = 200
gap_top = 300

#pipe1_rect.bottom = gap_top
pipe1_rect.bottom = random.randint(50, SCREEN_HEIGHT-gap_size-50)
pipe2_rect.top = pipe1_rect.bottom + gap_size

ball_rect = pygame.Rect((0,0,100,100))
ball_rect.center = screen_rect.center

ball_speed = 5

# --- mainloop ---

clock = pygame.time.Clock()

running = True
while running:

    # --- events ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_ESCAPE:
                running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                ball_speed = -3

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                ball_speed = 4

    # --- changes/moves/updates ---

    ball_rect.y += ball_speed

    pipe1_rect.x -= 1
    pipe2_rect.x -= 1

    if pipe1_rect.colliderect(ball_rect) or pipe2_rect.colliderect(ball_rect):
        print('Game Over')
        pipe1_rect.right = screen_rect.right
        pipe2_rect.right = screen_rect.right
        pipe1_rect.bottom = random.randint(50, SCREEN_HEIGHT-gap_size-50)
        pipe2_rect.top = pipe1_rect.bottom + gap_size

    if pipe1_rect.left == 0:
        print("WIN")
        pipe1_rect.right = screen_rect.right
        pipe2_rect.right = screen_rect.right
        pipe1_rect.bottom = random.randint(50, SCREEN_HEIGHT-gap_size-50)
        pipe2_rect.top = pipe1_rect.bottom + gap_size

    # --- draws ---

    screen.fill(BLACK)

    screen.blit(image, pipe1_rect)
    screen.blit(image, pipe2_rect)

    pygame.draw.rect(screen, GREEN, ball_rect)

    pygame.display.flip()

    # --- FPS ---

    ms = clock.tick(FPS)
    #pygame.display.set_caption('{}ms'.format(ms)) # 40ms for 25FPS, 16ms for 60FPS
    fps = clock.get_fps()
    pygame.display.set_caption('FPS: {}'.format(fps))

# --- end ---

pygame.quit()

If I am understanding your variable names, perhaps in the fourth line of the function obstacle() try:

screen.blit(pipe,[xloc,int(yloc+space),xsize,ysize+500])
Related
How do I resize an image using PIL and maintain its aspect ratio?
Pygame image screen fill
Resize image on mouse click in Pygame
How can I display an image on top of an image in PyGame?
Screen resizing pygame
pygame-How to darken screen
How to 'blit' the image to the screen in Pygame