0

So, I am making a simple game in which when the player collides with the enemy it's health is supposed to decrease with a graphic of a -5 popping up and then the game restarts. But when I start the programme the -5 pops up while it is not even supposed to and the rest of the screen stays black. And their is no error except a warning that has nothing to do with the messed up graphics. So, I am just going to paste the whole code as I think there is a problem with the player class, the scoring method and also with the blit method.

import pygame
pygame.init()

win = pygame.display.set_mode((500,480))

pygame.display.set_caption("First Game")

walkRight = [pygame.image.load('Game//R1.png'), pygame.image.load('Game//R2.png'), pygame.image.load('Game//R3.png'), pygame.image.load('Game//R4.png'), pygame.image.load('Game//R5.png'), pygame.image.load('Game//R6.png'), pygame.image.load('Game//R7.png'), pygame.image.load('Game//R8.png'), pygame.image.load('Game//R9.png')]
walkLeft = [pygame.image.load('Game//L1.png'), pygame.image.load('Game//L2.png'), pygame.image.load('Game//L3.png'), pygame.image.load('Game//L4.png'), pygame.image.load('Game//L5.png'), pygame.image.load('Game//L6.png'), pygame.image.load('Game//L7.png'), pygame.image.load('Game//L8.png'), pygame.image.load('Game//L9.png')]
bg = pygame.image.load('Game//bg.jpg')
char = pygame.image.load('Game//standing.png')

clock = pygame.time.Clock()

score = 0

class player(object):
    def __init__(self,x,y,width,height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.isJump = False
        self.left = False
        self.right = False
        self.walkCount = 0
        self.jumpCount = 10
        self.standing = True
        self.hitbox = (self.x + 17, self.y + 11, 29, 52)

    def draw(self, win):
        if self.walkCount + 1 >= 27:
            self.walkCount = 0

        if not(self.standing):
            if self.left:
                win.blit(walkLeft[self.walkCount//3], (self.x,self.y))
                self.walkCount += 1
            elif self.right:
                win.blit(walkRight[self.walkCount//3], (self.x,self.y))
                self.walkCount +=1
        else:
            if self.right:
                win.blit(walkRight[0], (self.x, self.y))
            else:
                win.blit(walkLeft[0], (self.x, self.y))
        self.hitbox = (self.x + 17, self.y + 11, 29, 52)
        #pygame.draw.rect(win, (255,0,0), self.hitbox,2)

    def hit(self):
        self.x = 60
        self.y = 410
        self.walkCount = 0
        font1 = pygame.font.SysFont('comicsans', 100)
        text = font1.render('-5', 1, (255,0,0))
        win.blit(text, (250 - round(text.get_width()/2), 200))
        pygame.display.update()
        i = 0
        while i < 300:
            pygame.time.delay(10)
            i += 1
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    i = 301
                    pygame.quit()
                


class projectile(object):
    def __init__(self,x,y,radius,color,facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing
        self.vel = 8 * facing

    def draw(self,win):
        pygame.draw.circle(win, self.color, (self.x,self.y), self.radius)


class enemy(object):
    walkRight = [pygame.image.load('Game//R1E.png'), pygame.image.load('Game//R2E.png'), pygame.image.load('Game//R3E.png'), pygame.image.load('Game//R4E.png'), pygame.image.load('Game//R5E.png'), pygame.image.load('Game//R6E.png'), pygame.image.load('Game//R7E.png'), pygame.image.load('Game//R8E.png'), pygame.image.load('Game//R9E.png'), pygame.image.load('Game//R10E.png'), pygame.image.load('Game//R11E.png')]
    walkLeft = [pygame.image.load('Game//L1E.png'), pygame.image.load('Game//L2E.png'), pygame.image.load('Game//L3E.png'), pygame.image.load('Game//L4E.png'), pygame.image.load('Game//L5E.png'), pygame.image.load('Game//L6E.png'), pygame.image.load('Game//L7E.png'), pygame.image.load('Game//L8E.png'), pygame.image.load('Game//L9E.png'), pygame.image.load('Game//L10E.png'), pygame.image.load('Game//L11E.png')]

    def __init__(self, x, y, width, height, end):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.end = end
        self.path = [self.x, self.end]
        self.walkCount = 0
        self.vel = 3
        self.hitbox = (self.x + 17, self.y + 2, 31, 57)
        self.health = 10
        self.visible = True

    def draw(self,win):
        self.move()
        if self.visible:
            if self.walkCount + 1 >= 33:
                self.walkCount = 0

            if self.vel > 0:
                win.blit(self.walkRight[self.walkCount //3], (self.x, self.y))
                self.walkCount += 1
            else:
                win.blit(self.walkLeft[self.walkCount //3], (self.x, self.y))
                self.walkCount += 1

            pygame.draw.rect(win, (255,0,0), (self.hitbox[0], self.hitbox[1] - 20, 50, 10))
            pygame.draw.rect(win, (0,128,0), (self.hitbox[0], self.hitbox[1] - 20, 50 - (5 * (10 - self.health)), 10))
            self.hitbox = (self.x + 17, self.y + 2, 31, 57)
            #pygame.draw.rect(win, (255,0,0), self.hitbox,2)

    def move(self):
        if self.vel > 0:
            if self.x + self.vel < self.path[1]:
                self.x += self.vel
            else:
                self.vel = self.vel * -1
                self.walkCount = 0
        else:
            if self.x - self.vel > self.path[0]:
                self.x += self.vel
            else:
                self.vel = self.vel * -1
                self.walkCount = 0

    def hit(self):
        if self.health > 0:
            self.health -= 1
        else:
            self.visible = False
        print('hit')

        

def redrawGameWindow():
    win.blit(bg, (0,0))
    text = font.render('Score: ' + str(score), 1, (0,0,0))
    win.blit(text, (390, 10))
    man.draw(win)
    goblin.draw(win)
    for bullet in bullets:
        bullet.draw(win)
    
    pygame.display.update()


#mainloop
font = pygame.font.SysFont('comicsans', 30, True)
man = player(200, 410, 64,64)
goblin = enemy(100, 410, 64, 64, 450)
shootLoop = 0
bullets = []
run = True
while run:
    clock.tick(27)

    if man.hitbox[1] < goblin.hitbox[1] + goblin.hitbox[3] and man.hitbox [1] + man.hitbox[3] > goblin.hitbox[1]:
        if man.hitbox[0] + man.hitbox[2] > goblin.hitbox[0] and man.hitbox[0] < goblin.hitbox[0] + goblin.hitbox[0]:
            man.hit()
            score += 5

    if shootLoop > 0:
        shootLoop += 1
    if shootLoop > 3:
        shootLoop = 0
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        
    for bullet in bullets:
        if bullet.y - bullet.radius < goblin.hitbox[1] + goblin.hitbox[3] and bullet.y + bullet.radius > goblin.hitbox[1]:
            if bullet.x + bullet.radius > goblin.hitbox[0] and bullet.x - bullet.radius < goblin.hitbox[0] + goblin.hitbox[2]:
                goblin.hit()
                score += 1
                bullets.pop(bullets.index(bullet))
                
        if bullet.x < 500 and bullet.x > 0:
            bullet.x += bullet.vel
        else:
            bullets.pop(bullets.index(bullet))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_SPACE] and shootLoop == 0:
        if man.left:
            facing = -1
        else:
            facing = 1
            
        if len(bullets) < 5:
            bullets.append(projectile(round(man.x + man.width //2), round(man.y + man.height//2), 6, (0,0,0), facing))

        shootLoop = 1

    if keys[pygame.K_LEFT] and man.x > man.vel:
        man.x -= man.vel
        man.left = True
        man.right = False
        man.standing = False
    elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
        man.x += man.vel
        man.right = True
        man.left = False
        man.standing = False
    else:
        man.standing = True
        man.walkCount = 0
        
    if not(man.isJump):
        if keys[pygame.K_UP]:
            man.isJump = True
            man.right = False
            man.left = False
            man.walkCount = 0
    else:
        if man.jumpCount >= -10:
            neg = 1
            if man.jumpCount < 0:
                neg = -1
            man.y -= (man.jumpCount ** 2) * 0.5 * neg
            man.jumpCount -= 1
        else:
            man.isJump = False
            man.jumpCount = 10
            
    redrawGameWindow()

pygame.quit()

And so sorry for the inconvenience with the previous question, I hope this one clears out everything. And if it doesn't please let me know.

  • 1
    One may try to debug that, but it will be hard without files (like `bg.jpg`). Maybe add to your question from where can it be took. – Adam Tokarski Feb 04 '21 at 12:21

1 Answers1

1

Without images it's hard to run that locally and observe what exactly happens, but at this point it seems that hit condition, the whole

if man.hitbox[1] < goblin.hitbox[1] + goblin.hitbox[3] and man.hitbox[1] + \
        man.hitbox[3] > goblin.hitbox[1]:
    if man.hitbox[0] + man.hitbox[2] > goblin.hitbox[0] and man.hitbox[0] < \
            goblin.hitbox[0] + goblin.hitbox[0]:

is true at the very beginning. This means that as only main loop starts, it goes to man.hit(). Please check your initial settings for both items.

By the way, consider to make it somewhat more readable with changes like

if (
        man.hitbox[1] < goblin.hitbox[1] + goblin.hitbox[3] and 
        man.hitbox[1] + man.hitbox[3] > goblin.hitbox[1] and 
        man.hitbox[0] + man.hitbox[2] > goblin.hitbox[0] and 
        man.hitbox[0] < goblin.hitbox[0] + goblin.hitbox[0]
):
    ...

Also you could think about moving that condition into some method called collide (form example), which could calculate that internally.

Adam Tokarski
  • 659
  • 4
  • 13
  • so do I have to change the hit condition to False first? And how do I fix the problem of -5 popping at the wrong time because your answer didn't mention anything about that... – Bruce Banner Feb 04 '21 at 13:53
  • Look at your code. What happens is that in the very first step, there is this `if` which is true. That means that either this condition is wrong in some way or you just put `man` and `goblin` in the same place in initial settings. It's hard to guess as you're using the `hitbox` where you have some magic numbers. You could consider to add some comments and describe your logi cthere. – Adam Tokarski Feb 04 '21 at 14:01
  • I think I got it! Bc you said that there was something wrong with the True False thing (Boolean) I rechecked the code, and made one of the statements true. That statement stated that the -5 will appear no matter what, so what I did was only turn it to False and applied some conditions. And another thing was that I did some mistake with the man and goblin thing. Thanks very much your answer was very helpful! – Bruce Banner Feb 05 '21 at 15:34