[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
pupДата: Пятница, 25.01.2013, 19:05 | Сообщение # 286
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
Про ссылку на экземпляр класса это я знаю. я в коде сервера так делал. при получении вейпоинта создавался отдельный поток в который передавалась ссылка. там просчитывались координаты и получается изменялись во внешнем классе. Но т.к. в питоне нет такой штуки как getDt() пришлось сделать так:

создал
Код
def getDt(self, dt):  
         dt = time.clock() - dt
         return dt


и в апдейте:

Код
dt = time.clock()
dir = b - a    
pos = a + dir * currentTime / duration
currentTime += self.getDt(dt)

но по запарке вместо currentTime я делил dt =))) и накрутил себе что это изза того что я через ссылку изменяю координаты.. а теперь лень назад все переделывать
 
ninthДата: Пятница, 25.01.2013, 20:33 | Сообщение # 287
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Ну в питоне нет дт, потому что нет рендеринга фрейма, хотя если у тебя имеется общий постоянный цикл, то можно эмулировать в нём считая разницу времени от последнего прохода цикла - как я понимаю, ты так и сделал.
 
pupДата: Воскресенье, 27.01.2013, 18:59 | Сообщение # 288
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
почему если в character.py импортировать globals.py то переменные с глобалс не доступны?
 
ninthДата: Понедельник, 28.01.2013, 01:36 | Сообщение # 289
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
А ты как импортировал? import globals или from globals import * ?
 
pupДата: Понедельник, 28.01.2013, 02:52 | Сообщение # 290
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
from modules.globals import * так же как и в маин.ру также как и контролс.ру. но там виден экземпляр класса созданного в глобалс.ру а в characters.py пишет глобал нейм из нот дефайнед

Добавлено (28.01.2013, 02:52)
---------------------------------------------
даже в скачаный урок вставить в character вставить from modules.globals import * и попробовать в нем обратиться к объекту player...

 
ninthДата: Понедельник, 28.01.2013, 08:13 | Сообщение # 291
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
А, ну в characters там получается рекурсивный импорт - globals импортирует characters, а он в свою очередь - globals. Думаю из-за этого. В общем я на схему, которую выше описывал и перешёл в итоге чтобы не иметь таких заморочек.
 
pupДата: Понедельник, 28.01.2013, 16:08 | Сообщение # 292
Рядовой
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Статус: Offline
я не очень понял как там реализовано
 
ninthДата: Понедельник, 28.01.2013, 16:23 | Сообщение # 293
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Ну смотри, у тебя есть некоторый класс "верхнего уровня", назовём его Диспетчер, этот класс содержит ссылки на все твои остальные классы - сцена, игрок, монстры, эффекты, звук. Соответственно к любому объекту кода можно добраться через ссылку на диспетчер.

Код
# -*- coding: utf_8 -*-

class MyApp():
      
     def __init__(self):
         self.my_val = 100500
         self.c1 = Class1(self)
         self.c2 = Class2(self)

class Class1():
     def __init__(self, app):
         self.base = app
         self.name = 'CLASS 1'
         print 'Base value =', self.base.my_val

class Class2():
     def __init__(self, app):
         self.base = app
         self.name = 'CLASS 2'
         print 'Class 1 name is', self.base.c1.name

MyApp()
 
Ps3ZwerДата: Вторник, 04.06.2013, 17:04 | Сообщение # 294
Рядовой
Группа: Пользователи
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
У меня вот это вылезает: 
Что делать??? я вводил все правильно.
 
ninthДата: Вторник, 04.06.2013, 18:36 | Сообщение # 295
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Раз вылезло - значит что-то не правильно. Я, например не помню чтобы в файле __init__.py вообще что-то было, так что пока не увижу полностью код - чего-то конкретного не смогу сказать
 
donidenis55Дата: Суббота, 24.04.2021, 10:37 | Сообщение # 296
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Привет. А что игру будем доделывать?)

Добавлено (24.04.2021, 10:39)
---------------------------------------------
Ребят посмотрите мой код. Управление от лица. Учусь ходить пока.
Нужно что бы не проваливался мой глаз сквозь горы.

from direct.showbase.ShowBase import ShowBase

from panda3d.core import CollisionTraverser, CollisionNode, CollisionSphere
from panda3d.core import CollisionHandlerQueue, CollisionRay, CollisionHandlerFloor
from panda3d.core import Filename, AmbientLight, DirectionalLight
from panda3d.core import PandaNode, NodePath, Camera, TextNode

from panda3d.core import PandaNode, NodePath, Camera, TextNode
from panda3d.core import CollideMask
from direct.task import Task
from math import pi, sin, cos

from panda3d.core import CollisionHandlerPusher

# Класс контроллера мыши и клавы
class Controller():
# Конструктор
def __init__(self):

self.cTrav = CollisionTraverser()
self.pusher = CollisionHandlerPusher()
# Значение шага перемещения клавы
self.key_step = 0.2
# Значение шага поворота мыши
self.mouse_step = 0.2
# Координаты ценра экрана
self.x_center = base.win.getXSize()//2
self.y_center = base.win.getYSize()//2
# Перемещаем указатель мыши в цетре экрана
base.win.movePointer(0, self.x_center, self.y_center)
# Отключаем стандарное управление мышкой
base.disableMouse()
# Устанавливает поле зрения обьекта
base.camLens.setFov(30)


# Устанавливает текущее значение ориентациии камеры
self.heading = 0
self.pitch = 0

# Запускаем задачу контроля камеры
taskMgr.doMethodLater(0.02, self.controlCamera, "camera-task")

# Регистрируем на нажатие клавиши "Esc"
# Событие закрытия приложения
base.accept("escape", base.userExit)

# Устанавливаем клавиши управления перемещения камеры
# Словарь хранящий флаги нажатия клавиш
self.keys = dict()

# Заполняем словарь
for key in ['a', 'd', 'w', 's', 'e', 'q']:
# Создаем запись в словаре
self.keys [key]= 0
# Регестрируем событие на нажатие клавиш
base.accept(key, self.setKey, [key, 1])
# Регестрируем событие на отжатие клавиш
base.accept(key+'-up', self.setKey, [key, 0])

# Метод установки состояния клавиш
def setKey(self, key, value):
self.keys [key]= value

# Метод управления положением и ориентации камеры
def controlCamera(self, task):
# Расчитывем управлением и ориентации камерры
move_x = self.key_step * (self.keys['d'] - self.keys['a'])
# Добавьте перемещение камеры вперед, назад, вверх, вниз
move_y = self.key_step * (self.keys['w'] - self.keys['s'])
move_z = self.key_step * (self.keys['e'] - self.keys['q'])

# Смещаем позицию камеры относительно предыдущего положения камеры
base.camera.setPos(base.camera, move_x, move_y, move_z)

fromObject = camera.attachNewNode(CollisionNode('colNode'))
fromObject.node().addSolid(CollisionRay(0, 0, 0, 0, 0, -1))
lifter = CollisionHandlerFloor()
lifter.addCollider(fromObject, camera)





#collisionNode = base.camera.attachNewNode(collisionNode)
# Получаем новое положение курсора мыши
new_mouse_pos = base.win.getPointer(0)
new_x = new_mouse_pos.getX()
new_y = new_mouse_pos.getY()
# Пробуем установить курсор в цетре экрана
if base.win.movePointer(0, self.x_center, self.y_center):
# Расчитайте поворот камеры по горизонтали
self.heading = self.heading - (new_x - self.x_center) * self.mouse_step
# Расчитайте поворот камеры по диагонали
self.pitch = self.pitch - (new_y - self.y_center) * self.mouse_step
# Устанавливаем новую ориентацию камеры
base.camera.setHpr(self.heading, self.pitch, 0)

# Сообщаем о необходимости повторного запуска камеры
return task.again

if __name__ == '__main__':
class MyApp(ShowBase):

def __init__(self):
ShowBase.__init__(self)

# Load the environment model.
self.scene = self.loader.loadModel("models/world")
# Reparent the model to render.
self.scene.reparentTo(self.render)
# Apply scale and position transforms on the model.

self.scene.setScale(0.25, 0.25, 0.25)
#self.scene.setPos(0, 0, -4)

colliderNode = CollisionNode("player")
# Add a collision-sphere centred on (0, 0, 0), and with a radius of 0.3
colliderNode.addSolid(CollisionSphere(0, 0, 0, 0.3))
collider = self.camera.attachNewNode(colliderNode)

#base.pusher.addCollider(collider, self.camera)
# The traverser wants a collider, and a handler
# that responds to that collider's collisions
#base.cTrav.addCollider(collider, self.pusher)

# Создаем контроллер ьыши и клав
self.controller = Controller()

app = MyApp()
app.run()

 
serg-kkzДата: Суббота, 24.04.2021, 11:57 | Сообщение # 297
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Я как то не вижу метода обновления, для поиска точки пересечения луча с поверхностью.

Когда добавляешь код, выдели его  и нажми на кнопку код <>


ООП  -  
 
serg-kkzДата: Суббота, 24.04.2021, 12:12 | Сообщение # 298
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Простой пример.

Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionNode, CollisionRay, CollisionHandlerQueue

from direct.showbase.ShowBase import ShowBase

class Game(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        terrain = loader.loadModel("colltest")
        terrain.reparentTo(render)
        terrain.setCollideMask(1)

        player = loader.loadModel("panda")
        player.reparentTo(render)

        fromObject = player.attachNewNode(CollisionNode('colNode'))
        fromObject.node().addSolid(CollisionRay(0, 0, 0, 0, 0, -1))
        fromObject.node().setFromCollideMask(1)
        fromObject.show()

        self.queue = CollisionHandlerQueue()

        collTrav = CollisionTraverser()
        collTrav.showCollisions(render)
        collTrav.addCollider(fromObject, self.queue)
        collTrav.traverse(render)

        taskMgr.add(self.update, 'update')

    def update(self, task):
        entry = self.queue.getEntry(0)
        print (entry)
        return task.cont

game = Game()
game.run()
Прикрепления: colltest.egg (432.2 Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Суббота, 24.04.2021, 12:16
 
fron_de_befДата: Воскресенье, 23.05.2021, 17:20 | Сообщение # 299
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
Здрасте будьте любезны рассталкуйте мне про щелконье мышью на 3D модельки(в моем случае просто плоскость).  Особенно хорошо для понимания, чего я хочу достичь, если вы играли в серию игр Disciples ну или Времена раздора. Что пытался сделать я - небольшой прототип найма существ. Нажимаешь кнопку нанять, в массиве котоырй отвечает за слоты прописываются характеристики этого воина и спрайт меняет текстуру с пустого места на воина. Теперь я хочу, поменять/ переставить их местами. Как я себе это представлял в теории, за каждым слотом невидимая коллизия(плокскость) которая реагирует на мышь и выдает номер слота. Типо так щелкаешь по 1 слоту он копирует значения из массива под тем же номером, в дополнительную переменную. ты двигаешь мышь на 5(или любой другой слот) отжимаешь мышь и данные из 5 слота копируются в 1, а данные из дополнителньой переменной копируются в в 5 слот. а текстуры меняются сами по себе. А визиульно это выглядит будто юниты поменялись местами.



Я пытался разобраться сам но пример с шахматами для меня слишком заумный(хотя визуально то что надо), а пример из документации даже не запустился и вывел ошибку
Прикрепления: 8080767.zip (315.7 Kb)
 
serg-kkzДата: Воскресенье, 23.05.2021, 18:50 | Сообщение # 300
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Не знаю понравиться ли вам мое решение, но оно такое.

Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionHandlerQueue, CollisionNode, CollisionRay, BitMask32
from direct.interval.LerpInterval import LerpPosInterval

class Game(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        self.replace = []

        node = loader.loadModel("a")
        node.reparentTo(render)
        node.setPos(-1.1, 1, 0)
        node.setCollideMask(BitMask32.bit(1))
        
        node1 = loader.loadModel("b")
        node1.reparentTo(render)
        node1.setPos(1.1, 0, 0)
        node1.setCollideMask(BitMask32.bit(1))

        base.accept('mouse1', self.pick)

        self.CurPicker = CollisionTraverser()
        #self.CurPicker.showCollisions(render)
        self.CurPickerOr = CollisionHandlerQueue()
        CurPickerNod = CollisionNode('mouseRay')
        CurPickerCam = camera.attachNewNode(CurPickerNod)
        CurPickerNod.setFromCollideMask(BitMask32.bit(1))
        self.CurPickerRay = CollisionRay()
        CurPickerNod.addSolid(self.CurPickerRay)
        self.CurPicker.addCollider(CurPickerCam, self.CurPickerOr)

    def pick(self):
       if base.mouseWatcherNode.hasMouse():
           mpos = base.mouseWatcherNode.getMouse()
           self.CurPickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
           self.CurPicker.traverse(render)
           self.CurPickerOr.sortEntries()
           
           if (self.CurPickerOr.getNumEntries() > 0):
            info = self.CurPickerOr.getEntry(0)

            self.replace.append(info.getIntoNodePath())

            if len(self.replace) >=2:
                LerpPosInterval(nodePath = self.replace[0], other = render, blendType = 'easeInOut', startPos = self.replace[0].getPos(render), duration = 1, bakeInStart = 1, pos = self.replace[1].getPos(render)).start()
                LerpPosInterval(nodePath = self.replace[1], other = render, blendType = 'easeInOut', startPos = self.replace[1].getPos(render), duration = 1, bakeInStart = 1, pos = (self.replace[0].getPos(render))).start()
                self.replace = []

game = Game()
game.run()

Не забудьте поиграться с типом анимации - blendType.  wink

P. S.

startPos = self.replace[1].getPos(render) и startPos = self.replace[0].getPos(render)  эти строчки можно удалить они не нужны.
Прикрепления: pick.zip (30.9 Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Воскресенье, 23.05.2021, 18:55
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
Поиск: