ДеЦЦкий сад "ПандЁнок"
|
|
ninth | Дата: Среда, 09.11.2011, 11:09 | Сообщение # 226 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| По-моему никак. Разве что вручную установить нужный масштаб уже после привязки узла.
Quote (soos) Есть перемещающийся и поворачивающийся персонаж, к нему привязан пустой Node, Именно поэтому я говорил, что лучше делать в качестве корня объекта пустой узел единичного масштаба, а на него уже вешать модельку и крутить/масштабировать как хочешь, чтобы потом не заморачиваться подобными проблемами.
|
|
| |
soos | Дата: Среда, 09.11.2011, 18:25 | Сообщение # 227 |
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
| Quote (ninth) Именно поэтому я говорил, что лучше делать в качестве корня объекта пустой узел единичного масштаба, а на него уже вешать модельку и крутить/масштабировать как хочешь, чтобы потом не заморачиваться подобными проблемами. Не совсем понял какую иерархию объектов ты предлагаешь. Мой вариант на данный момент такой:
render <--- персонаж <--- пустой нод <--- камера
Cтрелочки это reparent. Дополнительно на пустой нод повешен CompassEffect для того чтобы не наследовать поворот от персонажа. В результате работает всё (удаление/приближение от/к объекту, вращение вокруг объекта) кроме масштабирования. При масштабировании персонажа масштабируется и камера. Эффект компаса должен по идее влиять и на масштаб, но панда ругается и вылетает при попытке повесить CompassEffect с включённым PScale.
|
|
| |
ninth | Дата: Четверг, 10.11.2011, 00:35 | Сообщение # 228 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| как-то так Code render |_ root_character_node (empty, scale = 1.0) |_ compass_node (empty, compass) | |_ camera |_ character_model (Actor, scale = ??, rotation = ??)
|
|
| |
soos | Дата: Четверг, 10.11.2011, 22:43 | Сообщение # 229 |
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
| Такой вариант то что надо. Но неужели нет способа привязать только Pos или только Rot? Хотя, это вряд ли нужно, потому что с пустым корнем удобно: можно, например, на персонажа доспехи вешать и прочие вещи. Спасибо, использую такую иерархию.Добавлено (10.11.2011, 22:43) --------------------------------------------- Собственно, результат.
Сообщение отредактировал soos - Четверг, 10.11.2011, 16:45 |
|
| |
ninth | Дата: Пятница, 11.11.2011, 00:07 | Сообщение # 230 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Может как-то и можно , но я не знаю как. Можно попробовать использовать wrtReparentTo вместо reparentTo - но это сработает только при первичном привинчивании к родителю.
|
|
| |
Rivermacaroon0 | Дата: Воскресенье, 13.11.2011, 17:00 | Сообщение # 231 |
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
| Добрый день. Подскажите пожалуйста как сделать систему диалогов. Я никак не могу сообразить как сделать что бы было разветвление диалога и он не сразу выскакивал на конечный результат и не знаю как сделать что бы при нажатии на модель второй раз моя система диалога не запускалась второй раз и не накладывалась друг на друга пробовал добавить suppressMouse=1 выдает ошибку как ни крутил.
Code # -*- coding: utf_8 -*- from direct.gui.OnscreenText import OnscreenText from direct.gui.DirectGui import * from pandac.PandaModules import TextNode from direct.showbase.DirectObject import DirectObject
class dialog(DirectObject): def __init__(self): bk_text = "This is my Demo" textObject = OnscreenText(text = bk_text, pos = (0.95,-0.95), scale = 0.07,fg=(1,0.5,0.5,1),align=TextNode.ACenter,mayChange=1) def setText(arg): bk_text = (arg) textObject.setText(bk_text) def button(text, pos, comm): a = DirectButton(text = (text),scale=0.12,pos= (pos),command=(comm)) def but1(): b=setText('button1') def but2(): b=setText('button2') def but3(): b=setText('button3') def but4(): b=setText('button4') button('but1',(-0.8,0.1,-0.65),but1) button('but2',(-0.1,0.1,-0.65),but2) button('but3',(-0.8,0.1,-0.8),but3) button('but4',(-0.1,0.1,-0.8),but4)
|
|
| |
serg-kkz | Дата: Воскресенье, 13.11.2011, 20:13 | Сообщение # 232 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Rivermacaroon0, не совсем тебя понял, но вот пример.
Code # -*- coding: utf_8 -*- import direct.directbase.DirectStart from direct.gui.DirectGui import * from pandac.PandaModules import *
textObject = OnscreenText(text = "This is my Demo", pos = (0, 0.5), scale = 0.07, fg=(1,0.5,0.5,1), align=TextNode.ACenter,mayChange=1) shiper = {'Torgovat':['Pistolet', 'Avtomat'], 'Razgovor':['Zdorova', 'Kakie ludi', 'Idi na...']}
buff = []
def deist(arg): ot = 'Idi sam kozel' ot1 = 'Zdorovei vidali' ot2 = 'Da, ny' textObject.setText(arg) if (arg == 'Idi na...'): textObject.setText(ot) if (arg == 'Zdorova'): textObject.setText(ot1) if (arg == 'Kakie ludi'): textObject.setText(ot2) def Select(arg): if (arg == 'exit'): Frame.hide() pers.show() Magazin.hide() if (arg == 'active'): pers.hide() Frame.show() ########################################### if (arg == 'Torgovat'): Frame.hide() Magazin.show() nn = 0.1 for list in shiper['Torgovat']: slot = DirectButton(text = list, pos = (0, 0, nn), scale=0.1, command=deist, extraArgs = [list], relief=0) buff.append(slot) nn += 0.1 if (arg == 'Torgovat_exit'): Frame.show() Magazin.hide() for i in xrange(len(buff)): buff[i].remove() ########################################### if (arg == 'Razgovor'): Frame.hide() Razgovor.show() nn = 0 for list in shiper['Razgovor']: slot = DirectButton(text = list, pos = (0, 0, nn), scale=0.1, command=deist, extraArgs = [list], relief=0) buff.append(slot) nn += 0.1 if (arg == 'Razgovor_exit'): Frame.show() Razgovor.hide() for i in xrange(len(buff)): buff[i].remove() pers = DirectButton(text = 'shiper', pos = (0, 0, 0), scale=0.1, command=Select, extraArgs = ['active'])
Frame = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5), frameSize=(-0.25, 0.25, -0.25, 0.25), pos=(0, 0, 0)) Frame.hide()
rp1 = DirectButton(text = 'Razgovor', pos = (0, 0, 0.1), scale=0.1, command=Select, extraArgs = ['Razgovor'], relief=0) rp1.reparentTo(Frame)
rp2 = DirectButton(text = 'Torgovat', pos = (0, 0, 0), scale=0.1, command=Select, extraArgs = ['Torgovat'], relief=0) rp2.reparentTo(Frame)
rp3 = DirectButton(text = 'Poka', pos = (0, 0, -0.1), scale=0.1, command=Select, extraArgs = ['exit'], relief=0) rp3.reparentTo(Frame)
Magazin = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5), frameSize=(-0.35, 0.35, -0.35, 0.35), pos=(0, 0, 0)) Magazin.hide()
Magazin_rp1 = DirectButton(text = 'Vihod', pos = (0, 0, -0.2), scale=0.1, command=Select, extraArgs = ['Torgovat_exit'], relief=1) Magazin_rp1.reparentTo(Magazin)
Razgovor = DirectFrame(frameColor=(0.1, 0.1, 0.7, 0.5), frameSize=(-0.35, 0.35, -0.35, 0.35), pos=(0, 0, 0)) Razgovor.hide()
Razgovor_rp1 = DirectButton(text = 'Vihod', pos = (0, 0, -0.2), scale=0.1, command=Select, extraArgs = ['Razgovor_exit'], relief=1) Razgovor_rp1.reparentTo(Razgovor)
run()
Тут надо получше подумать головой. Для разветвлений, думаю хорошо, подойдут словари, а на основе их значений можно генерировать диалоги. А словари могут содержать много вложенностей.
P.S. У меня глюки что ли, я этот пост прочел, пошел сочинять решение. Пришел а его нет, несколько раз заходил... а его тютю. А не давно появился... Это еще что, я не давно видел около 140 гостей.
ООП -
|
|
| |
serg-kkz | Дата: Воскресенье, 13.11.2011, 20:52 | Сообщение # 233 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (Rivermacaroon0) textObject.setText(arg) в 17 строчке говорит global name 'arg' is not defined Скопировал от сюда, ошибки нет. Прикрепляю файл.
ООП -
|
|
| |
Rivermacaroon0 | Дата: Воскресенье, 13.11.2011, 20:58 | Сообщение # 234 |
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
| Спасибо большое, думаю вряд ли бы я сам такое сделал Еще один вопрос, как сделать что бы при повторном нажатии допустим на модель не появлялся второй раз диалог если он уже открыт?
Сообщение отредактировал Rivermacaroon0 - Воскресенье, 13.11.2011, 21:03 |
|
| |
serg-kkz | Дата: Воскресенье, 13.11.2011, 21:07 | Сообщение # 235 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (Rivermacaroon0) Еще один вопрос, как сделать что бы при повторном нажатии допустим на модель не появлялся второй раз диалог если он уже открыт? создай пременную например:
self.flag_dialog = 0
и перед открытием проверяй его, если ноль открывем диалог и меняем:
self.flag_dialog = 1
и при повторном открытии(тыкании по модели) если равен 1 пусти по else: т.е. pass
ООП -
Сообщение отредактировал serg-kkz - Воскресенье, 13.11.2011, 21:10 |
|
| |
serg-kkz | Дата: Воскресенье, 13.11.2011, 21:32 | Сообщение # 236 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Вот пример:
Code import direct.directbase.DirectStart from direct.gui.DirectGui import * from pandac.PandaModules import *
textObject = OnscreenText(text = "status", pos = (0, 0.5), scale = 0.07, fg=(1,0.5,0.5,1), align=TextNode.ACenter,mayChange=1)
buff = []
flag_dialog = 0
def Open(): global flag_dialog if (flag_dialog == 0): textObject.setText('Open') slot = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5), frameSize=(-0.25, 0.25, -0.25, 0.25), pos=(0, 0, 0)) buff.append(slot) flag_dialog = 1 print 'proverka' def Close(): global flag_dialog for i in xrange(len(buff)): buff[i].remove() textObject.setText('Close') flag_dialog = 0 Open = DirectButton(text = 'Open', pos = (0, 0, 0), scale=0.1, command=Open) Close = DirectButton(text = 'Close', pos = (0, 0, -0.13), scale=0.1, command=Close)
run()
ООП -
Сообщение отредактировал serg-kkz - Воскресенье, 13.11.2011, 21:40 |
|
| |
Rivermacaroon0 | Дата: Понедельник, 14.11.2011, 12:27 | Сообщение # 237 |
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
| Спасибо большое ты очень помог. Столкнулся с непонятной проблемой. При добавление модели бокс из примера модель реагирует все хорошо, меняю модель на другую и она перестает работать не могу понять почему
Code def actor(pos1,pos2,pos3,bitmask,settag,model): #функция загрузки актеров actor=loader.loadModel(model) #модель актера actor.reparentTo(render) actor.setScale(0.3) #Размер актера actor.setPos(pos1,pos2,pos3) #позиция актера actor.find("*").node().setIntoCollideMask(BitMask32.bit(bitmask)) #маска актера actor.find("*").node().setTag('obj', settag) #Тег актера
actor(35,35,loc.terrain.getElevation(35,35)*30,2,str(10),'res/geometry/box') actor(35,50,loc.terrain.getElevation(35,35)*30,2,str(9),'res/geometry/gnum')
т.е. здесь актер с моделью бокс реагирует на клацанье мышью а с моделью гном нет.Добавлено (14.11.2011, 12:27) --------------------------------------------- Починил путем замены Code actor.find("*").node().setIntoCollideMask(BitMask32.bit(bitmask)) #маска актера actor.find("*").node().setTag('obj', settag) #Тег актера
Code actor.find('**/+GeomNode').node().setIntoCollideMask(BitMask32.bit(bitmask)) #маска актера actor.find('**/+GeomNode').node().setTag('obj', settag) #Тег актера
Сообщение отредактировал Rivermacaroon0 - Понедельник, 14.11.2011, 11:55 |
|
| |
ninth | Дата: Понедельник, 14.11.2011, 15:25 | Сообщение # 238 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Не всё так просто - актёр не является геометрией, а ты ищешь геометрию find('**/+GeomNode'). Самый простой и эффективный способ - повесить вокруг актёра какой-нить Collision Solid и детектить его.
|
|
| |
Alexbis | Дата: Понедельник, 14.11.2011, 17:00 | Сообщение # 239 |
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
| Всем привет. Хочу задать несколько вопросов. MMORPG Как лучше реализовать игровой мир? И как разделить игровой мир на локации. Если есть в 3d max 3 локации можно ли слепить их в панде?\ Пример допустим arena online. Спасибо заранее)
|
|
| |
serg-kkz | Дата: Понедельник, 14.11.2011, 18:36 | Сообщение # 240 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (Alexbis) Как лучше реализовать игровой мир? Что? Quote (Alexbis) И как разделить игровой мир на локации Э... а, Что? Quote (Alexbis) Если есть в 3d max 3 локации можно ли слепить их в панде? Хм... что под понятием слепить ты подразумеваешь, что?
ООП -
|
|
| |