【问题标题】:Pygame coding enemy respawnPygame编码敌人重生
【发布时间】:2020-09-08 15:49:54
【问题描述】:

我正在尝试弄清楚如何在我的游戏中添加敌人重生,当敌人死亡时,它基本上是隐形的,你仍然可以射击它。我尝试了不同类型的代码并查看了不同的文章以寻求答案,但找不到任何东西。还需要帮助找到结束游戏的方法可能是在计时器上。感谢您的帮助,我真的很感激!

    import pygame

pygame.init()

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

pygame.display.set_caption("First Game")

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

clock = pygame.time.Clock()

bulletSound = pygame.mixer.Sound('bullet.wav')
hitSound = pygame.mixer.Sound('hit.wav')

music = pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1)

score = 0


def enemy(param, param1, param2, param3, param4):
    pass


goblins = [enemy(100, 410, 64, 64, 450)]


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.isJump = False
        self.jumpCount = 10
        self.x = 100
        self.y = 410
        self.walkCount = 0
        font1 = pygame.font.SysFont('comicsans', 100)
        text = font1.render('-5', 1, (255, 0, 0))
        win.blit(text, (250 - (text.get_width() / 2), 200))
        pygame.display.update()
        i = 0
        while i < 200:
            pygame.time.delay(10)
            i += 1
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    i = 201
                    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('R1E.png'), pygame.image.load('R2E.png'), pygame.image.load('R3E.png'),
                 pygame.image.load('R4E.png'), pygame.image.load('R5E.png'), pygame.image.load('R6E.png'),
                 pygame.image.load('R7E.png'), pygame.image.load('R8E.png'), pygame.image.load('R9E.png'),
                 pygame.image.load('R10E.png'), pygame.image.load('R11E.png')]
    walkLeft = [pygame.image.load('L1E.png'), pygame.image.load('L2E.png'), pygame.image.load('L3E.png'),
                pygame.image.load('L4E.png'), pygame.image.load('L5E.png'), pygame.image.load('L6E.png'),
                pygame.image.load('L7E.png'), pygame.image.load('L8E.png'), pygame.image.load('L9E.png'),
                pygame.image.load('L10E.png'), pygame.image.load('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, (350, 10))
    man.draw(win)
    goblins.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)
goblins = enemy(100, 410, 64, 64, 450)
shootLoop = 0
bullets = []
run = True
while run:
    clock.tick(27)

    if goblins.visible == True:
        if man.hitbox[1] < goblins.hitbox[1] + goblins.hitbox[3] and man.hitbox[1] + man.hitbox[3] > goblins.hitbox[1]:
            if man.hitbox[0] + man.hitbox[2] > goblins.hitbox[0] and man.hitbox[0] < goblins.hitbox[0] + goblins.hitbox[2]:
                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

    if goblins:
        for bullet in bullets:
            if bullet.y - bullet.radius < goblins[0].hitbox[1] + goblins[0].hitbox[3] and bullet.y + bullet.radius > \
                    goblins[0].hitbox[
                        1]:
                if bullet.x + bullet.radius > goblins[0].hitbox[0] and bullet.x - bullet.radius < goblins[0].hitbox[0] + \
                        goblins[0].hitbox[2]:
                    hitSound.play()
                    goblins[0].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:
        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, 0), facing))
        if enemy.health < 0:
            goblins.remove(0)
        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
    if not goblins:
        goblins.append(enemy(100, 410, 64, 64, 450))

    redrawGameWindow()

pygame.quit()

【问题讨论】:

标签: python pygame


【解决方案1】:

我查看了你的代码,但我找不到你删除地精对象的地方,这可能是敌人无敌的原因。我的建议是你为敌人列出一个清单。在您的情况下,您只有一个敌人,但这样做也可以让您拥有多个敌人。

goblins = [enemy(100, 410, 64, 64, 450)]

现在您还必须更改碰撞检测以使用goblins 列表而不是goblin 对象。

if goblins:
        for bullet in bullets:
            if bullet.y - bullet.radius < goblins[0].hitbox[1] + goblins[0].hitbox[3] and bullet.y + bullet.radius > goblins[0].hitbox[
                1]:
                if bullet.x + bullet.radius > goblins[0].hitbox[0] and bullet.x - bullet.radius < goblins[0].hitbox[0] + \
                        goblins[0].hitbox[2]:
                    hitSound.play()
                    goblins[0].hit()
                    score += 1
                    bullets.pop(bullets.index(bullet))

显然,您必须这样做以检测玩家和敌人以及您可能使用过地精的任何其他地方的碰撞检测。

现在我们在列表中有敌人,如果敌人死了,我们可以从列表中删除敌人。

if enemy.health < 1:
    goblins.remove(0)

然后只需将以下内容放在主循环中的某个位置,这样如果列表中没有敌人,它就会添加一个。

if not goblins:
    goblins.append(enemy(100, 410, 64, 64, 450))

【讨论】:

  • 我会尝试这个并尽快回答我没想到有人会很快回答这个问题哈哈抱歉没有尽快回复谢谢!
  • 欢迎您。如果它不起作用,请告诉我,我们会尝试找出问题所在。
  • 这样做会让我的游戏黑屏,没有绘图。
  • 如果enemy.health
  • 奇怪,敌人确实有属性生命值。尝试并确保您拼写正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多