Понедельник, 18 Ноября 2024, 17:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
BGEM
SStrelokДата: Вторник, 01 Мая 2018, 15:02 | Сообщение # 1
был не раз
Сейчас нет на сайте
Можно ли сделать так чтобы отправлялись не только координаты, но и угол(orientation)??
server
Код
   
def send(self):
        scene = logic.getCurrentScene()
      
        statp= {(gobj.name, gobj["user"].name): list(Vector(gobj.worldPosition))
            for gobj in scene.objects
            if gobj.name== "pl"}   
                            
        for addr in self.addr_user:
            self.socket.sendto(pickle.dumps(statp), addr)

client
Код

    def receive(self):
        while True:
            try:
                data, addr= self.socket.recvfrom(1024)
                state = pickle.loads(data)

                for k in state:
                    if not k in self.entities:
                        scene= logic.getCurrentScene()
                        spawner = scene.objects["Spawner"]
                        smap = scene.objects["Smap"]
                        entity = scene.addObject("pl", spawner)
                        entity.children[0]["Text"] = k[1]
                        self.entities[k] = entity
                    else:
                        entity = self.entities[k]
                    entity.worldPosition = Vector(state[k])
                   


Сообщение отредактировал SStrelok - Вторник, 01 Мая 2018, 15:03
DivESДата: Вторник, 01 Мая 2018, 16:40 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Код
statp= {(gobj.name, gobj["user"].name): list(Vector(gobj.worldPosition))
            for gobj in scene.objects
            if gobj.name== "pl"}

Тут же мы заполняем словарь для всех объектов на сцене? На выходе получается что-то вроде "имя_объекта : позиция".
Однако последние две строчки с циклом мне не ясны :D
Ну и вот. Дополнить конструкцию таким образом - "имя_объекта : [позиция, ориентация]".
И тогда клиент принимал бы worldPosition как Vector(state[0][k]), а ориентацию как Vector(state[1][k]).
SStrelokДата: Вторник, 01 Мая 2018, 17:22 | Сообщение # 3
был не раз
Сейчас нет на сайте
DivES, делал уже так :D
Выдает ошибку:
Код
_pickle.PicklingError: Can't pickle <class 'Vector'>: attribute lookup Vector on builtins failed

Где то читал что нужно Vector в список превратить, c этим я малость туплю :D :D :D
Хотя он становиться списком в этой строчке
Код
statp= {(gobj.name, gobj["user"].name): list(Vector(gobj.worldPosition))


Сообщение отредактировал SStrelok - Вторник, 01 Мая 2018, 17:27
DivESДата: Вторник, 01 Мая 2018, 17:27 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
SStrelok, ну вот эта функция превращает в список же)
Код
list(Vector(gobj.worldPosition))


UPD: А то же самое для ориентации проделывал? ^_^


Сообщение отредактировал DivES - Вторник, 01 Мая 2018, 17:31
SStrelokДата: Вторник, 01 Мая 2018, 17:35 | Сообщение # 5
был не раз
Сейчас нет на сайте
DivES, Да ,делал там нужно матрицу в вектор превратить :)

добавил функцию list в
Код
self.socket.sendto(pickle.dumps(list(statp)), addr)

и потенцивал с бубном сервер запустился без ошибки :D :D :D :D

UPD: Нужно теперь с clientom потенцевать

Ошибка клиента:
Код
tuple indices must be integers or slices, not tuple


Сообщение отредактировал SStrelok - Вторник, 01 Мая 2018, 18:09
DivESДата: Вторник, 01 Мая 2018, 19:14 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
SStrelok,
Цитата SStrelok ()
Ошибка клиента:

Это на что такое реакция?
SStrelokДата: Вторник, 01 Мая 2018, 19:18 | Сообщение # 7
был не раз
Сейчас нет на сайте
DivES, Вот на это
Код
state= {(gobj.name, gobj["user"].name): [Vector(gobj.worldPosition),Vector(gobj.orientation.to_euler())]

Нужно теперь правильно обратиться.
Print выводит так :
{('Player', 'Name'): [Vector((-11.0, -7.0, 3.0)), Vector((0.0, 0.0, -3.141592264175415))]}
DivESДата: Вторник, 01 Мая 2018, 19:32 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
SStrelok,
Цитата SStrelok ()
Код
{('Player', 'Name'): [Vector((-11.0, -7.0, 3.0)), Vector((0.0, 0.0, -3.141592264175415))]}

Ну если обращаться к объектам словаря через k, то положение это state[k][0], ориентация - state[k][1]
SStrelokДата: Вторник, 01 Мая 2018, 19:35 | Сообщение # 9
был не раз
Сейчас нет на сайте
DivES, попрыгав с print :D :D
я обнаружил что на клиент не идут координаты...
Код
state= {(gobj.name, gobj["user"].name): [Vector(gobj.worldPosition),Vector(gobj.orientation.to_euler())]

[('Avatar', 'Textd'), ('Avatar', 'Text')]
Код
statp= {(gobj.name, gobj["user"].name): list(Vector(gobj.worldPosition))

{('Avatar', 'Textd'): [-11.0, -7.0, 3.0]}
DivESДата: Вторник, 01 Мая 2018, 19:41 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
SStrelok,
Код
state= {(gobj.name, gobj["user"].name): [list(Vector(gobj.worldPosition)), list(Vector(gobj.orientation.to_euler()))]

А если так? То есть, сначала формируем список из вектора, а уже потом создаём общий список позиции и ориентации)


Сообщение отредактировал DivES - Вторник, 01 Мая 2018, 19:45
SStrelokДата: Вторник, 01 Мая 2018, 19:47 | Сообщение # 11
был не раз
Сейчас нет на сайте
DivES, Век благодарен буду, наконец то заработала :D :D :D :D :D :D :D
DivESДата: Вторник, 01 Мая 2018, 19:49 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
SStrelok, в смысле полноценно работает сервер-клиент?) :o
SStrelokДата: Вторник, 01 Мая 2018, 19:51 | Сообщение # 13
был не раз
Сейчас нет на сайте
DivES, Да, теперь он ходит и поворачивает )))
1GTVДата: Среда, 02 Мая 2018, 16:33 | Сообщение # 14
был не раз
Сейчас нет на сайте
Хммм))) вот ещё вариантик как это можно было сделать
Код
packet = {}
for obj in scene.objects:
    if obj.name == "pl": 
        data = {}
        data["pos"] = list(obj.worldPosition)
        data["rot"] = list(obj.worldOrientation.to_euler())
        packet[obj.name] = data

for addr in self.addr_user:
    self.socket.sendto(pickle.dumps(packet), addr)


Сообщение отредактировал 1GTV - Среда, 02 Мая 2018, 16:33
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг