[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Общие вопросы » Hit points (Ошибка с FrameSize)
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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Гонкилод, не совсем понял что ты хотишь сделать. Полоску жизни?

ООП  -  
 
ГонкилодДата: Вторник, 09.08.2011, 12:10 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 10
Награды: 0
Репутация: 0
Статус: Offline
Да, именно)
 
serg-kkzДата: Вторник, 09.08.2011, 12:15 | Сообщение # 4
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: 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, Спасибо БОЛЬШОЕ! Блин, а я сидел парился) Вот что значит опыт есть)) Всё легче, чем я думал biggrin
 
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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: 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
Её-маё)) спасибо! Я забыл, что у менеджера задержка есть)
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Hit points (Ошибка с FrameSize)
Страница 1 из 11
Поиск: