| 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 | Её-маё)) спасибо! Я забыл, что у менеджера задержка есть) |  |  |  |  |