[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
ninthДата: Среда, 21.03.2012, 10:07 | Сообщение # 256
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Хм. А ты все состояния ему проставил? Попробуй простой тест. У меня всё как положено работает.
Code
from direct.directbase.DirectStart import *
from pandac.PandaModules import *

nps = []

for i in xrange(4):
     tn = TextNode('tn'+str(i))
     tn.setText('button'+str(i))
     tn.setTextColor(0, 0, 0, 1)
     tn.setCardColor(1, 1, 0.5, 1)
     tn.setCardAsMargin(0.2, 0.2, 0.2, 0.2)
     nps.append(NodePath(tn.generate()))

btn = PGButton('my_btn')
btn.setup(nps[0], nps[1], nps[2], nps[3])
bn = aspect2d.attachNewNode(btn)
bn.setScale(0.2)

run()
 
KornivalДата: Среда, 21.03.2012, 14:10 | Сообщение # 257
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 1
Статус: Offline
Quote (ninth)
А ты все состояния ему проставил?

На сишном АПИ используется стили(PGFrameStyle), и я для всех состояний выставил один и тот же стиль. При наведении курсора текст, нарисованный на кнопке съезжает чуть вниз и вправо, красиво получается. Если нажать на кнопку и снова навести курсор, то текст уже не съезжает. Наверное придется для разных состояний ставить разные стили.
 
Aslan0Дата: Среда, 09.05.2012, 22:37 | Сообщение # 258
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
мне надо сделать так чтобы через время X выполнилась команда Y ()
 
serg-kkzДата: Четверг, 10.05.2012, 09:28 | Сообщение # 259
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Aslan0)
мне надо сделать так чтобы через время X выполнилась команда Y ()

А причем тут эта тема? Такие вопросы лучше задавать в разделе Python

Решение:

Code
import direct.directbase.DirectStart

def Y(task):
     print '5 sec'
      
taskMgr.doMethodLater(5, Y, "timer")

run()


ООП  -  
 
Aslan0Дата: Пятница, 11.05.2012, 21:27 | Сообщение # 260
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Quote
А причем тут эта тема? Такие вопросы лучше задавать в разделе

ну мне казалось время это функция движка happy , но ладно есть ещё вопрос . теперь надо сделать так что бы после нажатия enter выполнилась команда x . честно говоря я читал статью о работе с клавиатурой http://panda3d.org.ru/publ/1-1-0-18 , но появились вопросы с этой частью кода
Code
myDirectObject.accept('Event Name',myDirectObjectMethod)

правда это из статьи про события http://panda3d.org.ru/publ/1-1-0-14 , но как я понял код выше надо обязательно запускать для обработки события ? И спасибо serg-kkz за разъяснение на счёт времени .
 
serg-kkzДата: Пятница, 11.05.2012, 22:55 | Сообщение # 261
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Может это поймешь smile

Code
import direct.directbase.DirectStart

def X():  
      print 'input enter'
              
base.accept('enter',X)

run()


Где 'enter' имя события кнопки, если подставить 'space' будет выполняться по пробелу.

Вот имена клавиш:
"escape", "f"+"1-12" (e.g. "f1","f2",..."f12"), "print_screen" "scroll_lock"
"backspace", "insert", "home", "page_up", "num_lock"
"tab", "delete", "end", "page_down"
"caps_lock", "enter", "arrow_left", "arrow_up", "arrow_down", "arrow_right"
"shift", "lshift", "rshift",
"control", "alt", "lcontrol", "lalt", "space", "ralt", "rcontrol"


ООП  -  
 
Aslan0Дата: Пятница, 11.05.2012, 23:29 | Сообщение # 262
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Quote (serg-kkz)
Может это поймешь

view plainprint?
import direct.directbase.DirectStart

def X():
print 'input enter'

base.accept('enter',X)

run()

Где 'enter' имя события кнопки, если подставить 'space' будет выполняться по пробелу.

Вот имена клавиш:
"escape", "f"+"1-12" (e.g. "f1","f2",..."f12"), "print_screen" "scroll_lock"
"backspace", "insert", "home", "page_up", "num_lock"
"tab", "delete", "end", "page_down"
"caps_lock", "enter", "arrow_left", "arrow_up", "arrow_down", "arrow_right"
"shift", "lshift", "rshift",
"control", "alt", "lcontrol", "lalt", "space", "ralt", "rcontrol"

оказывается мой код работал , я неправильно дал путь к изображению wacko , забыл s в слове models , я думал что у меня в коде что то неправильно . ну основные вопросы исчерпаны .
ну пойду наделаю ещё гору ошибок а потом буду разбирать cheesygrin


Сообщение отредактировал Aslan0 - Пятница, 11.05.2012, 23:33
 
pupДата: Вторник, 22.01.2013, 09:24 | Сообщение # 263
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
Народ, подскажите плз как по другому считать местоположение гнома от точки а до точки б не используя его смещение относительно своих координат по оси У ?
 
ninthДата: Вторник, 22.01.2013, 09:54 | Сообщение # 264
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Не совсем понял вопрос - как понимать местоположение от точки а до точки б? Нужно расстояние между точками или нужно ставить гнома в конкретную точку или какой-то иной способ перемещения? Или что вообще имелось ввиду?
 
pupДата: Вторник, 22.01.2013, 10:01 | Сообщение # 265
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
В данный момент гном перемещаеться смещаясь относительно своих координат. Как сделать чтоб он с конкретной точки в которой находиться смещался постепенно в ту которую я в вейпоинте задаю. Короче чтоб координаты в update'е расчитывались и он двигался
 
ninthДата: Вторник, 22.01.2013, 10:20 | Сообщение # 266
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Можешь задать интервалом, как в примере Hello World, но тут есть проблема - не будет учитываться высота. Можешь построить mopath и двигать через MopathInterval, но тут придётся считать саму кривую так чтобы она огибала неровности рельефа. Ну а если двигать в апдейте, то нужно задать начальную точку, конечную точку, время за которое он должен переместиться из начальной в конечную, текущее время, а дальше считать примерно так:
Код
currentTime += globalClock.getDt()
dir = b - a
pos = a + dir * currentTime / duration
pos.setZ(height)


currentTime - счётчик текущего времени. Должен обнуляться когда ты отправляешь своего персонажа из а в б
duration - общее время за которое должно произойти перемещение
a и b - соотв. начальная и конечная точки
dir - вектор направленный из начальной точки в конечную. Чтобы получить положение персонажа в данный момент времени мы умножаем этот вектор на долю прошедшего времени от общего требуемого на перемещение и прибавляем к начальной точке и затем меняем высоту (Z) с учётом местности

Общее время требуемое на перемещение у тебя скорее всего должно будет зависеть от расстояния. Расстояние между двумя точками можно посчитать так (b - a).length() либо (b - a).lengthSquared(). Во втором случае - квадрат расстояния считается немного быстрее - актуально если будет выполняться много подсчётов каждый фрейм.
 
pupДата: Вторник, 22.01.2013, 11:42 | Сообщение # 267
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
Спасибо. щас попробую

Добавлено (22.01.2013, 11:42)
---------------------------------------------
чтото не получается

 

Код
def control(self,action,param):
         if action is 'add_wp':
             self.waypoints.append(Vec3(param[0],param[1],0))
         elif action is 'replace_wp':
             self.currentTime = 0
             self.currentTime += globalClock.getDt()
             self.a = Vec3(self.root.getPos())
             self.waypoints=[]
             self.waypoints.append(Vec3(param[0],param[1],0))
             self.v=self.waypoints[0]
             self.v.setZ(self.root.getZ())
             self.v=Vec3(self.v-self.root.getPos())
             if self.v.length()<0.3:
                 del self.waypoints[0]
             else:
                 self.duration = self.v/2
      
     def update(self,task):
         if len(self.waypoints)>0:
             v=self.waypoints[0]
             v.setZ(self.root.getZ())
             v=Vec3(v-self.root.getPos())
             if v.length()<0.3:
                 del self.waypoints[0]
             else:
                 self.v.normalize()
                 print self.v,self.a
                 self.root.setPos(self.a+self.v*(self.currentTime/self.duration))

ругается на эту строку self.root.setPos(self.a+self.v*(self.currentTime/self.duration))
unsupported operant type(s) for /: 'float' and 'libpanda.Vec3'
 
k0tДата: Вторник, 22.01.2013, 14:33 | Сообщение # 268
Подполковник
Группа: Пользователи
Сообщений: 104
Награды: 0
Репутация: 4
Статус: Offline
У тебя self.duration является вектором ( self.v=Vec3(self.v-self.root.getPos()) ; self.duration = self.v/2   ) 
На вектор делить нельзя )
 
pupДата: Вторник, 22.01.2013, 14:45 | Сообщение # 269
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
я уже и по отдельности делил координаты 
self.durationx = self.v[0]/2
self.durationy = self.v[1]/2
и по отдельности считал для х и игрика... дёргаеться как инвалид куда не нажми и перескакивает на другое место. причем постоянно в одном направлении
 
ninthДата: Вторник, 22.01.2013, 14:58 | Сообщение # 270
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
v=Vec3(v-self.root.getPos()) замени на v=Vec3(v-self.a)
self.currentTime += globalClock.getDt() должно быть в апдейте
с duration у тебя действительно что-то непонятное. Каким образом у тебя время от конечной позиции зависит? По - идее должно зависеть от расстояния а не от конечной точки.

Может лучше объяснишь чего ты хочешь добиться в итоге, а мы попробуем подсказать?
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
Поиск: