【问题标题】:How do I create an attack mechanism in my turn based game in Pygame?如何在 Pygame 的回合制游戏中创建攻击机制?
【发布时间】:2020-10-13 07:55:05
【问题描述】:

所以我制作了一个回合制游戏,玩家有 3 次攻击可供选择,我尝试这样做的方式是为每次攻击创建一个布尔值并将其设置为 false,当其设置为 true 时,对手的健康栏会在其上绘制一个白色矩形以创建损坏效果并播放动画,但我不知道如何制作它以便此“攻击”布尔值可重复使用,这意味着每次玩家使用它时矩形都会变长一定量。现在攻击只能使用一次,它会绘制一个矩形,并且动画会一直重复播放,因为布尔值设置为 true,如果我将其设置为 false,那么矩形会消失,我还尝试为每次使用攻击时都会增加的矩形宽度,但由于某种原因,它会给矩形一个边框。我将如何添加这个攻击系统?我附上了下面代码的必要部分,带有必备文件的整个代码是here

Hit = [pygame.image.load('Hit1.png'), pygame.image.load('Hit2.png'), pygame.image.load('Hit3.png')]
hitcount = 0

def attack():
    global FlareonX
    global FlareonY
    global hitcount
    f = 0
    Ax = 70
    Ay = 0
    scr_shake = False
    quick_attack = False
    click = False
    cursorX = 230
    cursorY = 540
    A1 = font.render('Thundershock', True, black)
    A2 = font.render('Quick Attack', True, black)
    A3 = font.render('Growl', True, black)
    A4 = font2.render('Electric', True, yellow)
    A5 = font2.render('Normal', True, grey)
    drawA4 = False
    drawA5 = False
    back_black = pygame.image.load('black_back.png')
    back_white = pygame.image.load('white_back.png')
    button_back = pygame.Rect(75, 200, 50, 50)

    running = True
         while running:
         scr.fill(black)
        if scr_shake:
            for Ay in [0, 0, 0, 0, 0, 0, -20, -20, -20, -20, -20, -20, 20, 20, 20, 20, 20, 20,]:
                scr.fill(black)
                scr.blit(attack_scr, (70, Ay))
                f += 1
                if f >= 9:
                    break
        scr.blit(attack_scr, (Ax, Ay))
        scr.blit(Flareon, (470, 0))
        scr.blit(A1, (270, 435))
        scr.blit(A2, (270, 470))
        scr.blit(A3, (270, 505))
        scr.blit(Cursor, (cursorX, cursorY))
        scr.blit(back_white, (70, 200))

        mx, my = pygame.mouse.get_pos()

        if button_back.collidepoint((mx, my)):
            scr.blit(back_black, (70, 200))
            if click:
                return
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True
            if event.type == pygame.KEYDOWN:
                if cursorY <= 535 and event.key == pygame.K_DOWN:
                    cursorY += 35
                if cursorY >= 470 and event.key == pygame.K_UP:
                    cursorY += -35
                if cursorY == 435:
                    drawA5 = False
                    drawA4 = True
                elif cursorY == 470:
                    drawA4 = False
                    drawA5 = True
                elif cursorY == 505:
                    drawA4 = False
                    drawA5 = True
                elif cursorY >= 505:
                    drawA4 = False
                    drawA5 = False

                # ATTACK MECHANISM
                if cursorY == 470 and event.key == pygame.K_RETURN:
                    quick_attack = True

        if drawA4:
            scr.blit(A4, (265, 310))

        if drawA5:
            scr.blit(A5, (265, 310))

        if hitcount + 2 >= 22:
            hitcount = 0

        if quick_attack:
            scr.blit(Hit[hitcount // 7], (FlareonX, FlareonY))
            scr_shake = True
            hitcount += 2
            pygame.draw.rect(scr, white, (373, 79, 30, 8))
        pygame.display.update()

【问题讨论】:

    标签: python pygame


    【解决方案1】:
    class Character:
        def __init__(self):
            self.HP = 100
    
        def setHP(self,HP):
            self.HP -= HP
    
        def getHP(self):
            return self.HP
        
    def attack():
        global FlareonX
        global FlareonY
        global hitcount
        me = Character()
        enemy = Character()
        f = 0
        Ax = 70
        Ay = 0
        scr_shake = False
        quick_attack = False
        click = False
        cursorX = 230
        cursorY = 540
        A1 = font.render('Thundershock', True, black)
        A2 = font.render('Quick Attack', True, black)
        A3 = font.render('Growl', True, black)
        A4 = font2.render('Electric', True, yellow)
        A5 = font2.render('Normal', True, grey)
        drawA4 = False
        drawA5 = False
        back_black = pygame.image.load('black_back.png')
        back_white = pygame.image.load('white_back.png')
        button_back = pygame.Rect(75, 200, 50, 50)
        running = True
        while running:
            pygame.display.update()
            scr.fill(black)
            if scr_shake:
                scr_shake = False
                f = 0
                for Ay in [0, 20, 0, -20, 0, 20, 0, -20, 0]:
                    scr.fill(black)
                    scr.blit(attack_scr, (70, Ay))
                    scr.blit(Flareon, (470, Ay))
                    scr.blit(Hit[f//3], (FlareonX, FlareonY))
                    f += 1
                    pygame.display.update()
                    time.sleep(0.05)
        scr.blit(attack_scr, (Ax, Ay))
        print(enemy.getHP())
        if enemy.getHP() != 100:
            pygame.draw.rect(scr, white, (203+enemy.getHP()*2, 80, (100-enemy.getHP())*2, 8))
        scr.blit(Flareon, (470, 0))
        scr.blit(A1, (270, 435))
        scr.blit(A2, (270, 470))
        scr.blit(A3, (270, 505))
        scr.blit(Cursor, (cursorX, cursorY))
        scr.blit(back_white, (70, 200))
    
        mx, my = pygame.mouse.get_pos()
    
        # removed button_back and event for shorter code, copy them back
    
        if drawA4:
            scr.blit(A4, (265, 310))
    
        if drawA5:
            scr.blit(A5, (265, 310))
    
        if hitcount + 2 >= 22:
            hitcount = 0
            running = False
    
        if quick_attack:
            scr_shake = True
            enemy.setHP(20)
            quick_attack = False
    

    为此工作导入时间。问题是您正在根据固定值绘制矩形。我根据HP定义了矩形的长度和起点。另外我建议将attack.png中的HP条从黑色更改为白色,然后绘制一个灰色的HP条,而不是在全HP上绘制一个白色矩形。您需要使用以下内容绘制灰色矩形:pygame.draw.rect(scr, gray, (203, 80, 200-enemy.getHP()*2, 8))。 我最重要的建议是为你的口袋妖怪和敌人的口袋妖怪创建包含生命值和其他所需信息的类。然后在里面创建方法来改变和返回信息。这也适用于您放入口袋妖怪对象和您的角色以包含口袋妖怪对象列表的攻击。上面的代码只是扩展的开始。希望这会有所帮助,祝你好运! :)

    【讨论】:

    • 天哪,谢谢!!这真的很好,你也改善了屏幕抖动!非常感谢!我将不得不阅读有关课程以及它们如何工作的内容,因为我对编程很陌生,而且我不知道它们是什么或它们是如何工作的,一旦我完成了课程,我肯定也会尝试并实施你的建议!你也介意我问你几个关于解决方案代码的问题吗?再次感谢你!
    • 没问题,很高兴能帮上忙!我看到你的用户名就猜到了哈哈。随时问我有关解决方案的任何问题
    • 好的,所以我现在对课程有了基本的了解,它们听​​起来很有趣,但我仍然不明白你所做的一些事情。 1) 为什么 pygame.display.update 在游戏循环开始和 screen_shake 结束时而不是在代码末尾? 2) 我不明白 draw.rect 语句中到底发生了什么 3) running = False 是做什么的?那不应该只是关闭游戏循环吗?
    • 1.第一次更新可以在代码末尾(忘记返回)。如果 for 循环中的更新被删除,动画将停止工作,因为对于每次迭代,您都希望更新显示以显示不同的图像和不同高度的攻击屏幕。 2. HP 条长 200 像素,要显示当前 HP,您必须设置矩形开始的位置 (203 +getHP()) 并在 HP 下降时向左移动。第二部分设置长度。最初的 100 - getHP() 为 0 并且 HP 已满。当你伤害你的敌人时,矩形会随着 HP 的降低而增长。 3. 是的,那是为了结束循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-05-05
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多