ДеЦЦкий сад "ПандЁнок"
|
|
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()
ООП -
Сообщение отредактировал 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 слот. а текстуры меняются сами по себе. А визиульно это выглядит будто юниты поменялись местами.
Я пытался разобраться сам но пример с шахматами для меня слишком заумный(хотя визуально то что надо), а пример из документации даже не запустился и вывел ошибку
|
|
| |
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.
P. S.
startPos = self.replace[1].getPos(render) и startPos = self.replace[0].getPos(render) эти строчки можно удалить они не нужны.
ООП -
Сообщение отредактировал serg-kkz - Воскресенье, 23.05.2021, 18:55 |
|
| |