Home > Software engineering >  Why isn't the second image appearing on top of the first image after I draw it in Pygame
Why isn't the second image appearing on top of the first image after I draw it in Pygame

Time:11-03

I'm trying to make an Idle Clicker Game using Pygame for school and Im running into some problems and id really appreciate some help

I want to replace the enemy on screen when the hp of the current enemy reaches zero but when I draw the second image when the enemy HP reaches 0 the first image doesn't get replaced can someone please help me figure this out

Thanks in advance

import pygame
pygame.init()
pygame.font.init()
colours = {"White" : (255, 255, 255), "Black" : (0, 0, 0), "Red" : (255, 0, 0), "Blue" : (0, 0, 255), "Green" : (0, 255, 0)}
orighpamt = 10

class Screen():
    def __init__(self, title, width=400, height=600, fill=colours["White"]):
        self.title=title
        self.width=width
        self.height = height
        self.fill = fill
        self.current = False

    def makeCurrent(self):
        pygame.display.set_caption(self.title)
        self.current = True
        self.screen = pygame.display.set_mode((self.width, self.height))

    def endCurrent(self):
        self.current = False

    def checkUpdate(self):
        return self.current
    def screenUpdate(self):
        if(self.current):
            self.screen.fill(self.fill)

    def returnTitle(self):
        return self.screen

class Button():
        def __init__(self, x, y, sx, sy, bcolour, fbcolour, font, fontsize, fcolour, text):
            self.x = x
            self.y = y
            self.sx = sx
            self.sy = sy
            self.bcolour = bcolour
            self.fbcolour = fbcolour
            self.fcolour = fcolour
            self.fontsize = fontsize
            self.text = text
            self.current = False
            self.buttonf = pygame.font.SysFont(font, fontsize)
        def showButton(self, display):
            if(self.current):
                pygame.draw.rect(display, self.fbcolour, (self.x, self.y, self.sx, self.sy))
            else:
                pygame.draw.rect(display, self.bcolour, (self.x, self.y, self.sx, self.sy))

            textsurface = self.buttonf.render(self.text, False, self.fcolour)
            display.blit(textsurface, ((self.x   (self.sx/2) - (self.fontsize/2)*(len(self.text)/2) - 5,(self.y   (self.sy/2) -(self.fontsize/2) - 4))))
        def focusCheck(self, mousepos, mouseclick):
            if(mousepos[0] >= self.x and mousepos[0] <= self.x   self.sx and mousepos[1] >= self.y and mousepos[1] <= self.y   self.sy):
                self.current = True
                return mouseclick
            else:
                self.current = False
                return False
class Enemy(pygame.sprite.Sprite):

    def __init__(self, dx, dy, filename):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load(filename).convert()

        self.rect = self.image.get_rect()
        self.rect.x = dx
        self.rect.y = dy



    def draw(self, screen):
        screen.blit(self.image, self.rect)



menuScreen = Screen("Menu Screen")
screen2 = Screen("Screen 2")

win = menuScreen.makeCurrent()


done = False
font = pygame.font.Font('freesansbold.ttf', 32)
clickdamage = 1
hitpoints = orighpamt
DungeonButton = Button(125, 500, 150, 50, colours["Black"], colours["Blue"], "arial", 20, colours["White"], "Dungeon")
hitboxButton = Button(80, 50, 280, 400, colours["White"], colours["Red"], "arial", 20, colours["White"], "")
hitpointamount = Button(100, 0, 200, 50, colours["White"], colours["Black"], "arial", 20, colours["Black"], str(hitpoints))
goblin = Enemy(0 , 20, "images\goblin-resized.png")
goblin2 = Enemy(0 , 20, "images\goolin.png")
toggle = False
while not done:
    menuScreen.screenUpdate()
    screen2.screenUpdate()
    mouse_pos = pygame.mouse.get_pos()
    keys = pygame.key.get_pressed()

    mouse_click = False
    for event in pygame.event.get():
        if(event.type == pygame.QUIT):
            done = True
        if event.type == pygame.MOUSEBUTTONDOWN:
            mouse_click = True

    if menuScreen.checkUpdate():
        attack = hitboxButton.focusCheck(mouse_pos, mouse_click)
        hitboxButton.showButton(menuScreen.returnTitle())
        goblin.draw(menuScreen.screen)
        hitpointamount.showButton(menuScreen.returnTitle())
        if attack:
            hitpoints -= clickdamage
            if hitpoints < 0:
                hitpoints = 0
            hitpointamount = Button(100, 0, 200, 50, colours["White"], colours["Black"], "arial", 20, colours["Black"], str(hitpoints))
            hitpointamount.showButton(menuScreen.returnTitle())
            if hitpoints == 0:
                goblin2.draw(menuScreen.screen)
                menuScreen.screenUpdate()
                orighpamt = round(orighpamt * 1.5)
                hitpoints = orighpamt
                hitpointamount = Button(100, 0, 200, 50, colours["White"], colours["Black"], "arial", 20, colours["Black"], str(hitpoints))
                hitpointamount.showButton(menuScreen.returnTitle())                
                pygame.display.update()

    elif screen2.checkUpdate():
        returnm = DungeonButton.focusCheck(mouse_pos, mouse_click)
        if returnm:
            win = menuScreen.makeCurrent()
            screen2.endCurrent()

    pygame.display.update()

pygame.quit()

CodePudding user response:

[This is my first answer, please cut me some slack]

When it comes to displaying sprites, it is vital to keep track of which sprite you are displaying. The cleanest solution for your current code is simply to use a tracking variable, like 'currentGoblin'.

currentGoblin = 0

Every time your goblin is killed, increment that variable by 1. Now, to render your sprites. Delete the goblin2.draw(), it is unnecessary. Where you are drawing your first sprite (goblin), replace the code with this:

if currentGoblin == 0:
    goblin.draw(menuScreen.screen)
elif currentGoblin == 1:
    goblin2.draw(menuScreen.screen)
# etc, so you can add more goblin images

The flaw with your code is that you are not permanently changing the image / sprite, just until it re-displays.

Essentially what this fix is doing is displaying whatever goblin you are up to, and moving onto the next one when it is killed.

  • Related