Domanda

So I'm making a basic pygame, and I have several "barriers" and "portals" on the game map. The former are spots that the player cannot touch, and the latter are spots that change the level.

I'm trying to make them invisible, so just have an invisible rectangle on the map that the collision detection would notice, but right now, when I blit it to the map, I have ugly black blobs.

I tried using dirty rectangles, but that didn't seem to work out so well.

My code (or at least the spots that handle the barriers and portals):

class Barrier(pygame.sprite.DirtySprite):
    '''class that builds up the invisible barriers in the game'''

    #constructor function
    def __init__(self, posX, posY, width, height): #create a self variable to refer to the object
    #call up the parent's constructor
        pygame.sprite.DirtySprite.__init__(self)
        self.dirty = 1
        self.visible = 0

        #Make the barrier.
        self.image = pygame.Surface([width, height])

        #debug code that makes sure that the barrier is in the right place
        #self.image.fill(white)

        # place the top left corner of the barrier at the given location
        self.rect = self.image.get_rect()
        self.rect.y = posY
        self.rect.x = posX

barriers = pygame.sprite.Group() #global barrier list used in all maps
portals = pygame.sprite.Group() #global portal list used in all maps


class Portal(pygame.sprite.DirtySprite):
    '''class that builds up the portals in the game'''

    #constructor function
    def __init__(self, posX, posY, width, height): #create a self variable to refer to the object
    #call up the parent's constructor
        pygame.sprite.DirtySprite.__init__(self)

        self.dirty = 1
        self.visible = 0

        #Make the barrier.
        self.image = pygame.Surface([width, height])

        #debug code that makes sure that the barrier is in the right place
        self.image.fill(black)

        # place the top left corner of the barrier at the given location
        self.rect = self.image.get_rect()
        self.rect.y = posY
        self.rect.x = posX

def LoadInside():

    barriers.empty()
    portals.empty()
    #Load up the level image
    whichLevel = 1

    background_image = pygame.image.load("House.png").convert()

    #a list of all the barriers in the room
    room_barrier_list = pygame.sprite.Group()

    #make a barrier out of all of the objects in the room
    barrierTopWall = Barrier(0,125,661,7)
    barrierLeftWall= Barrier(5, 130,5, 300)
    barrierBottomWallLeft= Barrier(10,414,292,7)
    barrierBottomWallRight= Barrier(364,412,298,7)
    barrierRightWall= Barrier(649,126,5, 294)
    bed = Barrier(19,199,62,93)
    smallTableChairs = Barrier(273,220,97,39)
    pot = Barrier(300,288,34,31)
    table = Barrier(493,242,151,42)
    chair1 = Barrier(459,255,28,35)
    chair2 = Barrier(490,296,31,28)
    chair3 = Barrier(553,293,31,28)
    chair4 = Barrier(621,292,31,28)

    #make a portal to get out
    door = Portal(300,413, 64,10)


    #add the barriers to the lists
    room_barrier_list.add(barrierTopWall, barrierLeftWall, barrierBottomWallLeft, barrierRightWall)

    barriers.add(room_barrier_list)

    all_sprites_list.add(barriers)

    room_barrier_list.add(smallTableChairs,pot,table,chair1,chair2,chair3,chair4, barrierBottomWallRight, bed)
    barriers.add(room_barrier_list)
    all_sprites_list.add(barriers)

    #add the portal to the list
    all_sprites_list.add(door)

    mainScreen.blit(background_image, [0,0])


#
# The above code handles the room barriers and portals
#


while done==False:

    for event in pygame.event.get(): #user did something
        if event.type == pygame.QUIT: #if the user hit the close button
                done=True

                # Move the player if an arrow key is pressed
        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            faceWhatDirection = 'left' # set the faceWhatDirection variable
            player.updateLeft() # call up the animation function
            player.move(-10, 0)

        if key[pygame.K_RIGHT]:
            faceWhatDirection = 'right' # set the faceWhatDirection variable
            player.updateRight() # call up the animation function
            player.move(10, 0)

        if key[pygame.K_UP]:
            faceWhatDirection = 'up' # set the faceWhatDirection variable
            player.updateUp() # call up the animation function
            player.move(0, -10)

        if key[pygame.K_DOWN]:
            faceWhatDirection = 'down' # set the faceWhatDirection variable
            player.updateDown() # call up the animation function
            player.move(0, 10)


        #if the user presses the space bar, the attack button
        if key[pygame.K_SPACE]:

                bullet = Bullet()
                bullet_list.append(bullet) #adds bullet to the bullet list
                all_sprites_list.add(bullet) #adds the bullet to the sprite list to be drawn

                #puts the bullet in the same location as player (this needs to be changed to what direction player faces)
                bullet.rect.x = player.rect.x
                bullet.rect.y = player.rect.y + 15 # the + 15 places it at a location that is not on the player's face!
                bullet.bulletDirection = faceWhatDirection

                #checks to see what direction to move the bullet in
    for bullet in bullet_list:
        bullet.move_bullet()

        #see if the bullet hit anything
        barrier_hit_list = pygame.sprite.spritecollide(bullet, barriers, False)

        for barrier in barrier_hit_list:
        #remove the bullet if it hit something
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)

    mainScreen.fill(black)#makes the background white, and thus, the white part of the images will be invisible


    if whichLevel == 1:

        LoadInside()


    else:
        LoadOutside()


    #draw the sprites
    all_sprites_list.draw(mainScreen)



    #limit the game to 20 fps
    clock.tick(20)

    #update the screen on the regular
    pygame.display.flip()

pygame.quit()
È stato utile?

Soluzione

its quiet easy,

sprites were blitted with the Group.update() method.

all_sprites_list.draw(mainScreen)

Don't add the barriers to the all_sprites_list. Then they never get blitted on the screen.

but the barrier_hit_list can still used for collision.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top