Hit points
|
|
Гонкилод | Дата: Вторник, 09.08.2011, 10:34 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Статус: Offline
| Помогите пожалуйста. Я только новичок. Что у меня не правильно? Я хочу сделать пх и линию хп, чтобы она соответственно уменьшалась, либо увеличивалась. Всё вроде получилось, значения хп уменьшаются, при нажатии на "damage", а вот линия остаётся та же. Я поставил resetFrameSize, но ничего не изменилось. Hprama - это рамка для линии хп. 0.7 - это размер линии.
Вод код:
Code import direct.directbase.DirectStart from direct.gui.DirectGui import * from direct.showbase.DirectObject import DirectObject from direct.gui.DirectGui import DirectFrame from direct.task.Task import Task
hp = 100 hp_hp = 0 damage = 8 one_hp = 0.7/hp bat = 0
class Hp(DirectObject):
def damager(self): global hp_hp global damage global one_hp global bat bat = 1 hp_hp = hp_hp - damage self.gameTask = taskMgr.add(self.hpbar, 'hpbar') print hp_hp
def __init__(self): hprama = OnscreenImage(image="hpres/hprama.png", pos=(0,0,0), scale = (0.362,0,0.03)) button = DirectButton(pos = (.7,0,.7), text = "Damage", scale = .1, pad = (.5, .5), rolloverSound = None, clickSound = None, command = self.damager) global hp global hp_hp hp_hp = hp self.gameTask = taskMgr.add(self.hpbar, 'hpbar')
def hpbar(self, task): global hp_hp global one_hp global damage global bat bar_size = hp_hp * one_hp bar_damage = damage * one_hp myFrame = DirectFrame(frameColor=(1, 0, 0, 1), frameSize = (0, bar_size, -0.02, 0.02)) myFrame.setPos(-0.35, 0, 0) if bat != 0: myFrame.resetFrameSize() bat = 0 print "xa" return task.cont hp = Hp() run()
Сообщение отредактировал Гонкилод - Вторник, 09.08.2011, 10:36 |
|
| |
serg-kkz | Дата: Вторник, 09.08.2011, 11:58 | Сообщение # 2 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Гонкилод, не совсем понял что ты хотишь сделать. Полоску жизни?
ООП -
|
|
| |
Гонкилод | Дата: Вторник, 09.08.2011, 12:10 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Статус: Offline
| Да, именно)
|
|
| |
serg-kkz | Дата: Вторник, 09.08.2011, 12:15 | Сообщение # 4 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Держи, пример-каркас. Для этого нужно использовать DirectWaitBar.
Code # -*- coding: utf-8 -*- import direct.directbase.DirectStart from direct.gui.DirectGui import * from direct.showbase.DirectObject import DirectObject from direct.gui.DirectGui import DirectFrame class Hp(DirectObject):
def __init__(self):
button = DirectButton(pos = (.7,0,.7), text = "Damage", scale = .1, pad = (.5, .5), command = self.damager) # Кнопка self.bar = DirectWaitBar(pos=(0,0,-0.7)) # Полоска жизни self.bar['range'] = 100 # Максимальное значение self.bar['value'] = 100 # Начальное значение def damager(self): self.bar['value'] -= 1 # Уменьшаем print self.bar['value'] hp = Hp() run()
ООП -
Сообщение отредактировал serg-kkz - Вторник, 09.08.2011, 12:17 |
|
| |
Гонкилод | Дата: Вторник, 09.08.2011, 12:19 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Статус: Offline
| serg-kkz, Спасибо БОЛЬШОЕ! Блин, а я сидел парился) Вот что значит опыт есть)) Всё легче, чем я думал
|
|
| |
soos | Дата: Вторник, 09.08.2011, 13:19 | Сообщение # 6 |
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
| Фрейм не надо создавать каждый раз в hpbar(). hpbar() вызывается каждый кадр. Его нужно создать только один раз при инициализации. А затем менять размер методом setSx(). Логику работы этой кучи переменных я не понял, но вот рабочий пример:
Code class Hp(DirectObject): def __init__(self): self.hp = 100 self.hp_hp = 0 self.damage = 8 self.one_hp = 0.7/self.hp self.bat = 0 button = DirectButton(pos = (.7,0,.7), text = "Damage", scale = .1, pad = (.5, .5), rolloverSound = None, clickSound = None, command = self.damager) self.myFrame = DirectFrame(frameColor=(1, 0, 0, 1), frameSize = (0, 0.7, -0.02, 0.02)) self.myFrame.setPos(-0.35, 0, 0) self.hp_hp = self.hp self.gameTask = taskMgr.add(self.hpbar, 'hpbar')
def damager(self): self.bat = 1 self.hp_hp = self.hp_hp - self.damage
def hpbar(self, task): bar_size = self.hp_hp * self.one_hp bar_damage = self.damage * self.one_hp self.myFrame.setSx(bar_size) if self.bat != 0: self.myFrame.resetFrameSize() self.bat = 0 return task.cont
Могу ошибаться, но рамку полоски в виде изображения загружать не обязательно, потому что у элементов GUI есть рамка со своими параметрами ([borderWidth], setBorder())
|
|
| |
Гонкилод | Дата: Вторник, 09.08.2011, 16:15 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Статус: Offline
| Спасибо всем! Ещё вопрос, где в падне таймер? Допустим, чтобы жизни востанавливались: каждую секудну 1 жизнь.
|
|
| |
serg-kkz | Дата: Вторник, 09.08.2011, 17:04 | Сообщение # 8 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Гонкилод, так пробовал?
Code # -*- coding: utf-8 -*- import direct.directbase.DirectStart from direct.gui.DirectGui import * from direct.showbase.DirectObject import DirectObject from direct.task import Task class Hp(DirectObject):
def __init__(self):
button = DirectButton(pos = (.7,0,.7), text = "Damage", scale = .1, pad = (.5, .5), command = self.damager) # Кнопка self.bar = DirectWaitBar(pos=(0,0,-0.7)) # Полоска жизни self.bar['range'] = 100 # Максимальное значение self.bar['value'] = 100 # Начальное значение taskMgr.doMethodLater(1, self.life, "life+") # запускаем задачу с задержкой def damager(self): self.bar['value'] -= 1 # уменьшаем print self.bar['value'] def life(self, task): if (self.bar['value'] != self.bar['range']): # Сравниваем значение жизней с максимальным значением, если не равно прибавляем. self.bar['value'] += 1 # прибавляем по 1 print self.bar['value'] return task.again # возращаем менеджеру задачу, для запуска с такой же задержкой
hp = Hp() run()
ООП -
Сообщение отредактировал serg-kkz - Вторник, 09.08.2011, 17:11 |
|
| |
Гонкилод | Дата: Вторник, 09.08.2011, 21:13 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Статус: Offline
| Её-маё)) спасибо! Я забыл, что у менеджера задержка есть)
|
|
| |