-1
import pygame

pygame.init()

win = pygame.display.set_mode((500, 480))
pygame.display.set_caption('Legend of Zorro')

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()

bulletSound = pygame.mixer.Sound('Game/bullet.mp3')
hitSound = pygame.mixer.Sound('Game/hit.mp3')

score = 0

framerate = 45

This is the player class. The man is created using this class.

class Player(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 10
        self.isJump = False
        self.jumpCount = 10
        self.left = True
        self.right = False
        self.walkCount = 0
        self.standing = True
        self.hitbox = (self.x + 19, self.y + 10, 28, 56)
        self.health = 10
        self.visible = True

    def draw(self, win):
        if self.visible:
            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))

            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 + 19, self.y + 10, 28, 56)
            pygame.draw.rect(win, (255, 0, 0), self.hitbox, 2)

It seems that whenever the man is "hitting" the goblin, he should be spawning as per the coordinates indicated below - and he does provided that the collision takes place on the left/right/under the goblin. For some reason, when the man collides with the TOP of the goblin, he spawns further down below. y > 410

Top Goblin Collision

    def hit(self):
        self.x = 0
        self.y = 410
        self.walkCount = 0
        font1 = pygame.font.SysFont('comicsans', 100)

        if self.health > 1:
            text = font1.render('-1', True, (255, 0, 0))
            win.blit(text, (250 - (text.get_width() / 2), 200))
            pygame.display.update()

        else:
            self.visible = False

        i = 0
        while i < 100:
            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, colour, facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.colour = colour
        self.facing = facing
        self.vel = 10 * facing

    def draw(self, win):
        pygame.draw.circle(win, self.colour, (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/L8E.png'), pygame.image.load('Game/L9E.png'),
                pygame.image.load('Game/L10E.png'),
                pygame.image.load('Game/L11E.png'), pygame.image.load('Game/L7E.png'),
                pygame.image.load('Game/L6E.png'),
                pygame.image.load('Game/L5E.png'), pygame.image.load('Game/L4E.png'), pygame.image.load('Game/L3E.png'),
                pygame.image.load('Game/L2E.png'), pygame.image.load('Game/L1E.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 + 5, self.y, 57, 61)
        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 - 10, 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 + 5, self.y, 57, 61)
            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 > 1:
            self.health -= 1
        else:
            self.visible = False
        pass


def redrawGameWindow():
    win.blit(bg, (0, 0))
    text = font.render("Score: " + str(score), True, (0, 0, 0))
    win.blit(text, (350, 10))
    text = font.render("Health: " + str(man.health), True, (0, 0, 0))
    win.blit(text, (0, 10))
    man.draw(win)
    goblin.draw(win)
    for bullet in bullets:
        bullet.draw(win)

    pygame.display.update()


font = pygame.font.SysFont('comicsans', 30, True)
man = Player(300, 405, 64, 64)
goblin = enemy(0, 410, 64, 64, 437)
shootLoop = 0
bullets = []

run = True
while run:
    clock.tick(framerate)
    keys = pygame.key.get_pressed()

    if man.health > 0:
        if goblin.visible:
            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[2]):
                    man.hit()
                    man.health -= 1

        for bullet in bullets:
            if score < 10:
                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]):
                        hitSound.play()
                        goblin.hit()
                        score += 1
                        bullets.remove(bullet)

            if 500 > bullet.x > 0:
                bullet.x += bullet.vel
            else:
                bullets.remove(bullet)

        if shootLoop > 0:
            shootLoop += 1
        if shootLoop > 3:
            shootLoop = 0

        if keys[pygame.K_SPACE] and shootLoop == 0:
            bulletSound.play()
            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, 128), 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.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

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    redrawGameWindow()

pygame.quit()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174

0 Answers0