[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Примеры кода » Простой настраиваемый инвентарь.
Простой настраиваемый инвентарь.
ninthДата: Вторник, 30.08.2011, 17:02 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline


Пример использования (копия примера в архиве)

Code
# -*- coding: utf-8 -*-   
from panda3d.core import *
import direct.directbase.DirectStart
from inventory import Inventory

inv_settings = {'background-size':      (-base.getAspectRatio(),   
                     base.getAspectRatio(),    
                     -1, 1),
                  'background-image':     'res/back.png',
                  'slot-size':            (0.34, 0.34),
                  'item-size':            (0.32, 0.32),
                  'slot-margin':           0.001,
                  'informer-popup-delay':  0.5,
                  'default-slot-image':   'res/base_slot.png',
                  'informer-font':        'res/arial.ttf',
                  'informer-bg-color':    (0.15, 0.067, 0.035, 0.92),
                  'informer-text-color':  (1, 1, 1, 1),
                  'use-transparency':     True
                  }

slot_info = [('HAND1', (-1.1, 0, 0.15), u'Hand', 'res/base_slot.png'),   
               ('HAND2', (-0.4, 0, 0.05), u'Hand', 'res/base_slot.png'),   
               ('HEAD', (-0.74, 0, 0.7), u'Head', 'res/head_slot.png'),   
               ('BODY', (-0.74, 0, 0.32), u'Body', 'res/body_slot.png'),
               ('LEGS', (-0.74, 0, -0.65), u'Legs', 'res/leg_slot.png'),
               ('TRASH', (-0.2, 0, -0.6), u'Trash', 'res/trash_slot.png')]
                 
items = [(('INVENTORY', 'TRASH', 'HAND1', 'HAND2'), 'weapon',   
             'res/glok.png', 'Glok 17', 1, 1, 0, 8),   
           (('INVENTORY', 'TRASH', 'BODY'), 'armor',   
             'res/armor.png', 'Light armor', 1, 1, 10),   
           (('INVENTORY', 'TRASH', 'HEAD'), 'armor',   
             'res/helmet.png', 'Helmet', 1, 1, 5),   
           (('INVENTORY', 'TRASH', 'LEGS'), 'armor',   
             'res/boots.png', 'Boots', 1, 1, 2),
           (('INVENTORY', 'TRASH'), '9x19lu',   
             'res/bullets.png', '9x19 luger', 20, 30),
           (('INVENTORY', 'TRASH'), '9x19lu',   
             'res/bullets.png', '9x19 luger', 6, 30)]
             
class Item():
      """ Класс, описывающий предмет инвентаря. Легко переделывается под
      ваши нужды, но обязательно должен содержать следующие вещи:
      slot_id: поле - ID слота, в котором находится предмет
      count: поле - количество предметов в слоте
      get_icon: функция - должна вернуть имя файла-картинки
      get_info: функция - должна вернуть текст для всплывающей подсказки
      get_slots: функция - должна вернуть список с типами слотов в которых   
      можно размещать предмет
      get_max_count: функция - должна вернуть максимальное количество   
      предметов данного типа, которые можно разместить в одном слоте
      get_type: функция - должна вернуть тип предмета. Предметы с   
      одинаковым типом могут совмещаться в ячейках инвентаря, если   
      get_max_count возвращает кол-во больше 1.
      """
      def __init__(self, data):
          self.slot_id = -1
          self.count = data[4]
          self.data = data
        
      def get_icon(self):
          return self.data[2]
            
      def get_info(self):
          txt = ''
          if self.data[1] == 'armor':
              txt = '%s\nArmor: %i' % (self.data[3], self.data[6])
          elif self.data[1] == 'weapon':
              txt = '%s\nDamage: %i' % (self.data[3], self.data[7])
          else:
              txt = self.data[3]
          return txt
                
      def get_slots(self):
          return self.data[0]
            
      def get_max_count(self):
          return self.data[5]
            
      def get_type(self):
          return self.data[1]
            
inv = Inventory(inv_settings)           # Инициализация класса
inv.custom_inv_slots(slot_info)         # Создаём нестандартные слоты
inv.fill_inv_slots(3, 3, 0.35, 0.5)     # Стандартные слоты - поле 3х3, левый верхний угол (0.35;0.5)
for item in items:
      inv.add_item(Item(item))            # Добавляем предметы
inv.make()                    # Генерируем визуальное представление инвентаря
base.accept('mouse3-up', inv.stop_drag) # Вешаем на правую кнопку отмену перетаскивания
base.accept('i', inv.switch)            # По клавише I - показать/скрыть инвентарь

# Обработка генерируемого классом события   
# в нашем случае мы будем удалять предмет, помещённый в слот с типом
# 'TRASH'
def on_item_move(*args):
      iid, s_from, s_to = args
      if inv.slots[s_to].type == 'TRASH':
          inv.remove_item(iid)
        
base.accept('inventory-item-move', on_item_move)

# Добавление предмета в уже созданный инвентарь
item = (('INVENTORY', 'TRASH'), '9x19lu', 'res/bullets.png', '9x19 luger', 15, 30)
inv.add_item(Item(item))
inv.refresh_items()

run()
Прикрепления: inventory.7z(1291Kb) · 5584734.jpg(61Kb) · 0906947.jpg(50Kb)
 
Dimon3DДата: Среда, 31.08.2011, 08:17 | Сообщение # 2
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 1
Репутация: 4
Статус: Offline
Здорово !
Полезнейшая весч. Ее прям в двиг надо вставить.

зы. А как бы теперь звуки добавить.
 
Dimon3DДата: Среда, 31.08.2011, 08:46 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 1
Репутация: 4
Статус: Offline
При переходе с ячейки на ячейку, например.
Есче бы ячейку, на которой находится курсор, подсветить
 
ninthДата: Четверг, 01.09.2011, 11:38 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Ога, попробую привинтить.
 
Форум Panda3D - по русски » Panda3D » Примеры кода » Простой настраиваемый инвентарь.
Страница 1 из 11
Поиск: