ОШИБКА: Как предотвратить сброс панели здоровья врага? - PullRequest
0 голосов
/ 03 мая 2019

В настоящее время я работаю над RPG-подобной игрой с использованием python и tkinter.Проблема в том, что после нажатия на кнопку Heal, а затем нажатия любой кнопки атаки, панель здоровья врага будет сброшена.

Я уже пытался понять, откуда происходит ошибка, но она не принесла свои плоды.Я использовал print () после каждой строки для проверки значений, но ни один из них не ответил на мой вопрос.

import tkinter as tk 
from tkinter import font
import time 
import threading
import random

class InGameWindow(object) :
    def __init__(self, master) :
        #Window and it's settings
        self.master = master

        windowWidth = self.master.winfo_screenwidth()
        windowHeight = self.master.winfo_screenheight()

        rootCoord = f"800x400+{int((windowWidth/2)-400)}+{int((windowHeight/2)-200)}"

        master.title("A Simple RPG")
        master.geometry(rootCoord)
        master.resizable(width=False, height=False)
        master.overrideredirect(False)
        master.configure(bg="black")

        #Import files as .png etc...    
        levelIcon = tk.PhotoImage(file="playerInfoIcon.png")
        fireballIcon = tk.PhotoImage(file="fireball.png")
        earthquackeIcon = tk.PhotoImage(file="earthquacke.png")
        strokeIcon = tk.PhotoImage(file="stroke.png")
        healIcon = tk.PhotoImage(file="heal.png")
        startIcon = tk.PhotoImage(file="start.png")

        self.levelIcon = levelIcon
        self.fireballIcon = fireballIcon
        self.earthquackeIcon = earthquackeIcon
        self.strokeIcon = strokeIcon
        self.healIcon = healIcon
        self.startIcon = startIcon

        #Frames to create fancy borders and titles
        mainWindowFrame = tk.Frame(master, width=780, height=380, bg="black")
        mainWindowFrame.place(x=10, y=10)

        attackButtonsFrame = tk.LabelFrame(mainWindowFrame, width=420, height=165, bg="black", relief="ridge", bd=3)
        attackButtonsFrame.place(x=300, y=210)

        playerInfoFrame = tk.LabelFrame(mainWindowFrame, width=240, height=365, bg="black", bd=3)
        playerInfoFrame.place(x=10, y=10)

        self.mainWindowFrame = mainWindowFrame

        #Canvas and stuff related to player's info
        playerInfo = tk.Canvas(playerInfoFrame, bg="black", width=225, height=340, bd=0, highlightthickness=0, relief='ridge')
        playerInfo.place(x=0, y=0)

        self.playerInfo = playerInfo

        #Coordinates for .create_figure/image 
        dynamicHealthBarCoord = [14, 16, 214, 16, 195, 34, 14, 34]
        dynamicManaBarCoord = [13, 16+30, 214-100, 16+30, 195-100, 34+30, 13, 34+30]

        self.dynamicHealthBarCoord, self.dynamicManaBarCoord = dynamicHealthBarCoord, dynamicManaBarCoord


        healthBarForground = playerInfo.create_polygon(14, 15, 214, 16, 196, 34, 14, 34, fill="black", outline="black", width=2)
        dynamicHealthBar = playerInfo.create_polygon(dynamicHealthBarCoord, fill="red", width=1)
        healthBarBackground = playerInfo.create_polygon(11, 13, 220, 13, 196, 37, 11, 37, fill="", outline="gray", width=2)

        manaBarForground = playerInfo.create_polygon(14, 15+30, 214-100, 16+30, 196-100, 34+30, 14, 34+30, fill="black", outline="black", width=2)
        dynamicManaBar = playerInfo.create_polygon(dynamicManaBarCoord, fill="blue", width=1)
        manaBarBackground = playerInfo.create_polygon(11, 13+30, 220-99, 13+30, 196-99, 37+30, 11, 37+30, fill="", outline="gray", width=2)

        self.dynamicHealthBar, self.dynamicManaBar = dynamicHealthBar, dynamicManaBar

        #Buttons
        Attack_Stroke = tk.Button(mainWindowFrame, image=self.strokeIcon, command=lambda: self.Stroke(dynamicHealthBarCoord), cursor="hand1", state="disabled")
        Attack_Stroke.place(x=346.67-10, y=242-15)

        Spell_Heal = tk.Button(mainWindowFrame, image=self.healIcon, command=lambda: self.Heal(dynamicHealthBarCoord), cursor="hand1", state="disabled")
        Spell_Heal.place(x=533.33+10, y=242-15)

        Attack_Fireball = tk.Button(mainWindowFrame, image=self.fireballIcon, command=lambda: self.FireBall(dynamicHealthBarCoord, dynamicManaBarCoord), cursor="hand1", state="disabled")
        Attack_Fireball.place(x=346.67-10, y=242+60)

        Attack_Earthquake = tk.Button(mainWindowFrame, image=self.earthquackeIcon, command=lambda: self.EarthQuacke(dynamicHealthBarCoord, dynamicManaBarCoord), cursor="hand1", state="disabled")
        Attack_Earthquake.place(x=533.33+10, y=242+60)

        Enter_The_Dunjon = tk.Button(self.master, image=self.startIcon, command=self.Dunjon, cursor="hand1")
        Enter_The_Dunjon.place(x=440, y=67)

        self.Enter_The_Dunjon = Enter_The_Dunjon

        self.Attack_Stroke, self.Spell_Heal, self.Attack_Fireball, self.Attack_Earthquake =Attack_Stroke, Spell_Heal, Attack_Fireball, Attack_Earthquake

        manaRegenerationThread = threading.Thread(target=lambda: self.manaRegeneration(self.dynamicManaBarCoord))
        manaRegenerationThread.setDaemon(True)
        manaRegenerationThread.start()

        deathEventHandlerThread = threading.Thread(target=lambda: self.deathEventHandler(self.dynamicHealthBarCoord))
        deathEventHandlerThread.setDaemon(True)
        deathEventHandlerThread.start()

        #m = threading.Thread(target=lambda: manaRegeneration(dynamicManaBarCoord))
        #m.start()

    def Stroke(self, healthCoordList) :
        healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
        self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)

    def Heal(self, healthCoordList) :
        healthCoordList[2], healthCoordList[4] = 214, 195
        self.playerInfo.coords(self.dynamicHealthBar, healthCoordList)

    def FireBall(self, healthCoordList, manaCoordList) :
        healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
        self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)

        manaCoordList[2], manaCoordList[4] = manaCoordList[2] - 5, manaCoordList[4] - 5
        self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
        self.master.update()

        i = threading.Thread(target=self.timerFireBall)
        i.setDaemon(True)
        i.start()

    def EarthQuacke(self, healthCoordList, manaCoordList) :
        healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
        self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)

        manaCoordList[2], manaCoordList[4] = manaCoordList[2] - 25, manaCoordList[4] - 25
        self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
        self.master.update()

        i = threading.Thread(target=self.timerEarthQuacke)
        i.setDaemon(True)
        i.start()

    def timerStroke(self) :
        self.Attack_Stroke.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Stroke.configure(state="active")
        self.master.update()

    def timerHeal(self) :
        self.Spell_Heal.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Spell_Heal.configure(stae="active")
        self.master.upgrade()

    def timerFireBall(self) :
        self.Attack_Fireball.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Attack_Fireball.configure(state="active")
        self.master.update()

    def timerEarthQuacke(self) :
        self.Attack_Earthquake.configure(state="disabled")
        self.master.update()

        time.sleep(0)

        self.Attack_Earthquake.configure(state="active")
        self.master.update()

    def manaRegeneration(self, manaCoordList) :
        while True :
            if manaCoordList[2] < 114 :
                manaCoordList[2], manaCoordList[4] = manaCoordList[2] + 1, manaCoordList[4] + 1
                self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
                self.master.update()
                time.sleep(0.90)

            elif manaCoordList[2] >= 114 :
                manaCoordList[2], manaCoordList[4] = manaCoordList[2] + 0, manaCoordList[4] + 0
                self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
                self.master.update()

    def deathEventHandler(self, healthCoordList) :
        while True :
            if healthCoordList[2] < 10 :
                self.master.destroy()

    def Dunjon(self) :
        self.Enter_The_Dunjon.place_forget()

        ennemyInfoFrame = tk.LabelFrame(self.mainWindowFrame, width=420, height=165, bg="black", bd=3)
        ennemyInfoFrame.place(x=300, y=10)

        ennemyInfo = tk.Canvas(ennemyInfoFrame, bg="black", width=415, height=160, bd=0, highlightthickness=0, relief='ridge')
        ennemyInfo.place(x=0, y=0)

        ennemyDynamicHealthBarCoord = [14, 16, 214, 16, 195, 34, 14, 34] 

        ennemyHealthBarForground = ennemyInfo.create_polygon(14, 15, 214, 16, 196, 34, 14, 34, fill="black", outline="black", width=2)
        ennemyDynamicHealthBar = ennemyInfo.create_polygon(ennemyDynamicHealthBarCoord, fill="red", width=1)
        ennemyHealthBarBackground = ennemyInfo.create_polygon(11, 13, 220, 13, 196, 37, 11, 37, fill="", outline="gray", width=2)

        self.ennemyInfo, self.ennemyDynamicHealthBar = ennemyInfo, ennemyDynamicHealthBar

        self.Attack_Stroke.configure(state="active")
        self.Attack_Fireball.configure(state="active")
        self.Attack_Earthquake.configure(state="active")
        self.Spell_Heal.configure(state="active")

root = tk.Tk()
InGameWindow(root)
root.mainloop()

Я был бы очень признателен, если кто-то узнает, как исправить эту ошибку, также не стесняйтесьпоправьте мой пост.Большое спасибо за Вашу помощь !^^ (извините за возможные ошибки в английском, я студент по французскому языку)

1 Ответ

0 голосов
/ 03 мая 2019

В кнопке Spell_Heal вы используете список врагов self.Heal(dynamicHealthBarCoord), поэтому он меняет значение для врага, а позже вы видите это изменение как «сброс».

Возможно, вы должны использовать self.Heal(dynamicManaBarCoord) для изменения здоровья игрока.

Spell_Heal = tk.Button(mainWindowFrame, text='healIcon', 
       command=lambda: self.Heal(dynamicManaBarCoord), cursor="hand1", state="disabled")

Возможно, вам также придется изменить self.ennemyDynamicHealthBar в Heal().Вероятно, это должно быть self.dynamicManaBar, но я не уверен.

def Heal(self, healthCoordList) :
    healthCoordList[2], healthCoordList[4] = 214, 195
    self.playerInfo.coords(self.dynamicManaBar, healthCoordList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...