Alex Collins
Alex Collins

Reputation: 11

Problem with images overlapping in pygame

Im having problems with blitting images to rect objects in pygame. i have a background image blitted to my main pygame window, and also an image blitted to a rect object on the screen which moves. the problem i am having is the rect object is overlapping my background image when its moving around. i was looking to only be able to see the green helicopter shape and not the black outline around it. sorry if i havent explained this very well. will try to include all files im using. Thanks for any help

import pygame as pg
import random as r
import time
pg.init()



MAX_X = 1190
MAX_Y = 590
MIN_X = 10
MIN_Y = 10
SIZE = 100
SPEED = 1
COLOR = (0,255,0)
move_amount = 0



wn = pg.display.set_mode((1200, 600))

BG_IMG = pg.image.load('bg.png').convert()
BG_IMG = pg.transform.scale(BG_IMG, (1200, 600))

class Wall (pg.Rect):
    def __init__(self, posX, posY):
        self.xcor = posX
        self.ycor = posY
        self.rect = None

class Heli (pg.Rect):
    def __init__(self, posX, posY):
        self.image = pg.image.load('art.png').convert()
        self.rect = self.image.get_rect()
        
        self.xcor = posX
        self.ycor = posY
        

# top and bottom constant walls
TOP = pg.Rect(MIN_X, MIN_Y, MAX_X, 3)
BOTTOM = pg.Rect(MIN_X, MAX_Y, MAX_X, 3)


heli = Heli(MIN_X, MAX_Y //2)


# keep moving walls in a list
moving_walls = [Wall(MAX_X, r.randint((MIN_Y + 10), (MAX_Y - 10)))]




# main loop
while True:
    # fill screen
    wn.fill('black')
    

    # editing objects to move

    

    # blitting must happen before everything else
    
    pg.draw.rect(wn,COLOR, heli.rect)
    
    wn.blit(BG_IMG, (0,0))
    wn.blit(heli.image, heli.rect)

    heli.rect.y += move_amount
    heli.rect.y += 1

    # use a variable to control how much movement is happening
    # movement happens continuosly
    # if key down it  oves if key up it doesnt
    

    
    for wall in moving_walls :
        wall.rect = pg.Rect(wall.xcor, wall.ycor, 3, SIZE)
        pg.draw.rect(wn, COLOR, wall.rect)
        wall.xcor -= SPEED

        if wall.xcor < MIN_X + 10:
            wall.xcor = MAX_X
            wall.ycor = r.randint((MIN_Y), (MAX_Y - SIZE))
        
    # drawing all objects back to the screen



    pg.draw.rect(wn, COLOR, TOP)
    pg.draw.rect(wn, COLOR, BOTTOM)


    # update window
    pg.display.update()

    # event handling
    for ev in pg.event.get():
        if ev.type == pg.KEYDOWN:
            if ev.key == pg.K_UP:
                move_amount = -3
        if ev.type == pg.KEYUP:
            move_amount = 0
                
        if ev.type == pg.QUIT:
            pg.quit()
    time.sleep(0.01)

Upvotes: 1

Views: 71

Answers (1)

Rabbid76
Rabbid76

Reputation: 210878

You discard the transparency information of the image. You have to use convert_alpha instead of convert:

self.image = pg.image.load('art.png').convert()

self.image = pg.image.load('art.png').convert_alpha()

The pygame documentation notes that:

The returned Surface will contain the same color format, colorkey and alpha transparency as the file it came from. You will often want to call convert() with no arguments, to create a copy that will draw more quickly on the screen.
For alpha transparency, like in .png images, use the convert_alpha() method after loading so that the image has per pixel transparency.

See also How can I make an Image with a transparent Backround in Pygame?

Upvotes: 1

Related Questions