[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Panda3D - по русски » Panda3D » Для начинающих » Непонятная работа менеджера задач или как затаить дыхание?
Непонятная работа менеджера задач или как затаить дыхание?
drigromanlolДата: Пятница, 05.04.2019, 06:54 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 0
Репутация: 2
Статус: Offline
Ребят столкнулся я с такой проблемой что не могу отобразить правильно текст. И все связанно с менеджером задач. Короче у меня идет пошагова битва, имеется цикл который запихен в менеджер задач. Когда Игрок атакует, нажимает кнопку атаки, то должно отображаться остаток количество хп врага и идти не большая задержка (секунды 2.5). А после бот атакует игрока, отображается хп самого героя. Но почему то менеджер задач проскакивает отображение хп врага и сразу показывает остаток хп героя. Эти тексты выводятся по середине блокнота, чуть выше середины, если быть точнее. Здесь моя работа, маленькое освоение панды и  тут же не большая текстовая игра. Сможете понять в чем причина этого бага? Да я кстати не очень хорошо знаю английский, ну и сам почти новичок в программирование, так что не судите строго.

Архив с игрой
 
serg-kkzДата: Пятница, 05.04.2019, 07:56 | Сообщение # 2
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Глянул код, и честно сказать не понял что вы ожидаете от такой реализации игры. Вы запускаете параллельно несколько менеджеров задач, и ждете что это будет работать одной логикой.

Код

  #~~o~~o Метод высчитывание удара врага по герою

    def attackEnemy(self):

        self.actor.hp = self.actor.hp - self.enemy.attack

        self.actor_hp_bar.updateBar(self.actor.converterHP()) 

        self.actionDisplay.setText('Текущее здоровье героя: ' + str(self.actor.hp))

    #~~o~~o Основной цикл битвы

    def startBattle(self, task):

        if self.turn == 'Player':

            return task.cont

        elif self.turn == 'Enemy':

            time.sleep(2.5)            

            self.attackEnemy()

            self.turn = 'Player'

            return task.cont
 

Я не стал разбираться с логикой игры, так как не понятно в каком месте реализовано? 
Цитата drigromanlol ()
Но почему то менеджер задач проскакивает отображение хп врага и сразу показывает остаток хп героя


Для такой игры не нужен менеджер задач, причем вы используете задержку из питона. Смысла нет, вы также можете просто использовать функцию которая сработает от кнопки атака.
Просто чтоб двинуться дальше, нужно понять причину по которой вы используете менеджер задач. В то время как можно использовать вызов функции через событие кнопки.


ООП  -  
 
drigromanlolДата: Пятница, 05.04.2019, 08:49 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 0
Репутация: 2
Статус: Offline
Я новичок по части реализации игр. Мне нужна небольшая задержка во времени, чтобы игрок мог увидеть нужное сообщение перед тем как сам текст стирётся, новым сообщением. Имитируя ход соперника, небольшая пауза. 

Кстати может по советуете какую статью, книгу, чтобы можно было грамотно организовать архитектуру игры? А то частично отталкиваюсь от другого конструктора.


Сообщение отредактировал drigromanlol - Пятница, 05.04.2019, 08:54
 
serg-kkzДата: Пятница, 05.04.2019, 19:53 | Сообщение # 4
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Ну такая задержка time.sleep(2.5)  на самом деле заставляет Панду зависать. Вот как раз для очистки сообщений можно использовать задачу.
которая будет следить за строкой текста, и запускать очистку через некоторое время. Время кстати можно получить внутри функции задачи через task.time.

Цитата drigromanlol ()
Но почему то менеджер задач проскакивает отображение хп врага и сразу показывает остаток хп героя


Я так и не понял в какой строке кода это часть?

Цитата drigromanlol ()
Кстати может по советуете какую статью, книгу, чтобы можно было грамотно организовать архитектуру игры? А то частично отталкиваюсь от другого конструктора.


Я не думаю есть подобные статьи или книги, учиться мыслить логически  это задача программиста на основании потребностей для игры. Это все равно что искать инструкцию по Word, чтоб грамотно - морфологическии и синтаксически составить статью.


ООП  -  
 
drigromanlolДата: Понедельник, 08.04.2019, 06:44 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 0
Репутация: 2
Статус: Offline
Через task.time конечно можно, но как ограничить игрока от возможности нажатий на клавиш? Чтобы пока отображаются действия игрока, сам игрок выжидал своего хода. Как пошаговая текстовая битва.
Как примерно должен выглядеть игровой процесс
1. Игрок выбрал действие
2. На экране высветился результат (в это время игрок не может взаимодействовать с кнопками. Прятать их не хочу)
3. Далее действует бот. А точнее высвечиваются на экране его действия (на этом моменте, игрок тоже не как не может повлиять на игровой процесс)
4. после возвращаемся к пункту 1. Игрок снова может взаимодействать с кнопками, выбирать действия. При условии если у оппонентов больше 1 хп.

Позже укажу строчки в коде. Сейчас много работы навалилось, выбираюсь по возможности


Сообщение отредактировал drigromanlol - Понедельник, 08.04.2019, 06:46
 
serg-kkzДата: Понедельник, 08.04.2019, 08:03 | Сообщение # 6
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Цитата drigromanlol ()
Через task.time конечно можно, но как ограничить игрока от возможности нажатий на клавиш?


У тебя есть же переменная которая хранит состояния хода, это сути обозначает кому переходит контроль верно? Явно можно указать в функции которая назначена на кнопку
проверку этой переменной, если ходит игрок то выполняем код, ну если бот, то пасс. Просто же.


ООП  -  

Сообщение отредактировал serg-kkz - Понедельник, 08.04.2019, 08:03
 
drigromanlolДата: Среда, 10.04.2019, 06:21 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 0
Репутация: 2
Статус: Offline
Цитата serg-kkz ()
Вот как раз для очистки сообщений можно использовать задачу.которая будет следить за строкой текста, и запускать очистку через некоторое время. Время кстати можно получить внутри функции задачи через task.time.


Блиин нифига не получается. Я уже думал сделать свой собственный счетчик-переменную для этих целей. Серж можешь привести пример, как это сделать? Я не могу понять как мне сделать таймер, чтобы я мог после выполнять нужные функции (типа там очистки текста и прочее). Эх... Нуб я


Сообщение отредактировал drigromanlol - Среда, 10.04.2019, 06:21
 
serg-kkzДата: Среда, 10.04.2019, 19:56 | Сообщение # 8
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Мне казалось таймер был наглядно приведен здесь - http://panda3d.org.ru/publ/1-1-0-6

Если сделать как ты описал:

Цитата drigromanlol ()

1. Игрок выбрал действие
2. На экране высветился результат (в это время игрок не может взаимодействовать с кнопками. Прятать их не хочу)
3. Далее действует бот. А точнее высвечиваются на экране его действия (на этом моменте, игрок тоже не как не может повлиять на игровой процесс)
4. после возвращаемся к пункту 1. Игрок снова может взаимодействать с кнопками, выбирать действия. При условии если у оппонентов больше 1 хп.


То как то так можно запрограммировать:

Код
from direct.showbase.ShowBase import ShowBase
from direct.task import Task

from panda3d.core import TextNode
from direct.gui.DirectGui import DGG, DirectButton

class MyApp(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)
        
        font = loader.loadFont('Xarrovv.ttf')
        
        taskMgr.add(self.timer, 'MyTaskName')

        self.text = TextNode('Info')
        self.text.setFont(font)
        self.text.setAlign(TextNode.ACenter)
        self.text.setText("Ход игрока")
        
        textNodePath = aspect2d.attachNewNode(self.text)
        textNodePath.setScale(0.2)

        self.button = DirectButton(text = ("-make a move-", ">Make a move<", "<rolling over>", "disabled"), command = self.step)
        self.button.setScale(0.1)
        self.button.setPos(0, 0, -0.4)

        self.status_step = False
        self.status_clear_text = False
        self.save_time = None

    def step(self):
        self.text.setText("Ход бота")
        self.status_step = True
        self.button["state"] = DGG.DISABLED

    def timer(self, task):
        if self.status_step == True:
            if self.status_clear_text == False:
                self.save_time = task.time
                self.status_clear_text = True
            else:
                if self.save_time + 3.0 < task.time:
                    self.status_clear_text = False
                    self.text.setText("Ход игрока")
                    self.status_step = False
                    self.button["state"] = DGG.NORMAL
        return task.cont

app = MyApp()
app.run()


Если внимательно причитать это, то можно сделать как службу по очистки текста. То есть комбинировать обычную задачу и задачу с задержкой, которая запуститься через некоторое время чтоб очистить строку. Тут зависит от того что ты хочешь сделать.


ООП  -  
 
drigromanlolДата: Четверг, 11.04.2019, 08:13 | Сообщение # 9
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 0
Репутация: 2
Статус: Offline
serg-kkz, спасибо. Буду разбирать, хотя уже вижу как работает. Учиться мне еще и учиться =))

Добавлено (20.04.2019, 07:56)
---------------------------------------------
Ох неудобно использовать подобную конструкцию. Что если я мне надо выводить сообщения перед ходом игрока после хода игрока и после хода врага тоже? И сообщений может быть не одна, а несколько. И чтобы они выводились отведенному времени (ну для начала фиксировоного времени). Хм... . Я имею виду что если сообщений не сколько, они не будут пропускаться, а будут последовательно запускаться, по очереди. Получается на подобную тему, нужно подобную конструкцию делать... хм... короч я размышляю как это все провернуть.

 
Форум Panda3D - по русски » Panda3D » Для начинающих » Непонятная работа менеджера задач или как затаить дыхание?
  • Страница 1 из 1
  • 1
Поиск: