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.