Вопросы по созданию игр.

Список разделов Геймдев в Blender Игровой движок Blender

Описание: Все вопросы и обсуждения, касающиеся BGE
Модераторы: exooman, denis8424

  • 1

Сообщение #1 exooman » 25.01.2014, 14:45

В этой теме помогаем друг-другу разбираться в игростроении на движке BGE.
Внимание, прежде чем задать вопрос, просмотрите темы:
Blender Game Engine FAQ
Blender Game Engine примеры
Полезные ресурсы по BGE


Пожалуйста, выкладывайте бленд-файлы, изображения и другие ресурсы на сторонних хостингах. Приветствуется упаковывание файлов в архив, желательно в формате .7z. По возможности старайтесь использовать изображения формата .jpeg.
exooman M
Аватара
Сообщения: 1449



  • 1

Сообщение #1361 Bibo » 06.06.2017, 16:30

Модератору бы в тему заглянуть, проверить дискуссию на релевантность.
Bibo
Аватара
Сообщения: 468

Сообщение #1362 dron » 06.06.2017, 16:57

Bibo писал(а):Модератору бы в тему заглянуть, проверить дискуссию на релевантность.
Плюсую!
Данный контент распространяется под лицензией "Creative Commons BY-SA" если не указанно иного.
http://creativecommons.org/licenses/?lang=ru
dron M
Аватара
Сообщения: 109

Сообщение #1363 jstas » 06.06.2017, 17:18

Август писал(а):jstas, что же так, сколько раз говорил чтобы я не обижался, а сам обиделся? Что так, и на что?
С чего вдруг такой глубокомысленный вывод? Мне уже за 40 перевалило, я такими глупостями, как обижаться, уже давно не занимаюсь. :)

Август писал(а):От моего последнего вопроса вы ушли, но у меня тут появилось предположение, что по оси Z не меняет своё положение, ни куб, ни плоскость, а дело в том, что в аксонометрии куб может оказываться ближе к камере, а плоскость дальше и потому создаётся впечатление, что куб лежит на плоскости, а не парит над ней.
подними куб над опорной точкой, он и будет парить над плоскостью.

Добавлено спустя 3 минуты 4 секунды:
Август писал(а):было бы совсем неплохо убедиться что куб парит над плоскостью, а не стоит на ней, например перемещая и вращая камеру но без логических кирпичиков, а с помощью скриптов.
если только для того, чтобы проверить, парит куб над плоскостью, или стоит на ней, то как раз кирпичиками это сделать гораздо проще.
Эх, как бы мне это бы тоже, по обмену премудростями?
jstas M
Аватара
Сообщения: 475


Сообщение #1364 exooman » 06.06.2017, 18:10

Bibo писал(а):Модератору бы в тему заглянуть, проверить дискуссию на релевантность.

уж точно не мне упрекать кого-то в написании простыней, но все-таки попрошу более строго блюсти порядок и не допускать флуд. В идеале, будет соблюдение формата общения в виде "вопрос-ответ". Все межличностные переживания либо в ЛС, либо одно из двух.
exooman M
Аватара
Сообщения: 1449


Сообщение #1365 Август » 07.06.2017, 06:34

jstas писал(а):С чего вдруг такой глубокомысленный вывод? Мне уже за 40 перевалило, я такими глупостями, как обижаться, уже давно не занимаюсь.
Извините, мне наверно показалось, всё-таки моя подсказка могла быть неправильно расценена.
Август писал(а):
От моего последнего вопроса вы ушли, но у меня тут появилось предположение, что по оси Z не меняет своё положение, ни куб, ни плоскость, а дело в том, что в аксонометрии куб может оказываться ближе к камере, а плоскость дальше и потому создаётся впечатление, что куб лежит на плоскости, а не парит над ней.
подними куб над опорной точкой, он и будет парить над плоскостью.
Такой цели у меня нет. Я теперь практически уверен, что куб появляется в том месте, в каком и должен, и дело не в координате Z, а именно из-за точки обозревания из камеры. Зрительный обман.
Август писал(а):
было бы совсем неплохо убедиться что куб парит над плоскостью, а не стоит на ней, например перемещая и вращая камеру но без логических кирпичиков, а с помощью скриптов.
если только для того, чтобы проверить, парит куб над плоскостью, или стоит на ней, то как раз кирпичиками это сделать гораздо проще.
Нет, параллельно тому, чтобы убедиться, ещё и ознакомиться со способом управления камерой. У меня была попытка, безуспешная, а потом перерыв, после которого что-то другое заинтересовало, и камерой я больше не занимался.

Добавлено спустя 1 час:
Вот ещё вопрос. Нашлёпал я объектов, а Blender как их различает, ведь у них у всех одно и тоже имя. Я в этом убеждаюсь в условии:
elif getCube == 1: # если активирован актуатор Edit Object и куб добавлен в сцену
print("getCube == 1 ", getCube)
cube = objList1["Cube"] # получить объект Cube
xcube = cube.position[0] # получить X позицию cube
ycube = cube.position[1] # получить Y позицию cube
getCube = 2
objEmpt["CubeIs"] = getCube # передать в значение свойства CubeIs 2 этап создания объекта куб
Получается, что создать объект могу, но не могу его активировать, не могу им управлять?
Кто-нибудь может поделиться своими соображениями по этому поводу? Как из десятка вновь добавленных объектов выбрать желаемый?
Август
Сообщения: 104

Сообщение #1366 andreymal » 07.06.2017, 09:39

Питоновый метод addObject возвращает свежесозданный объект, который можно положить в какую-нибудь переменную и управлять через неё
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1073

Сообщение #1367 Август » 07.06.2017, 13:46

andreymal писал(а):Питоновый метод addObject возвращает свежесозданный объект, который можно положить в какую-нибудь переменную и управлять через неё
Примером не поделитесь как это может выглядеть, хотя бы в фрагменте условия, который я привёл? Буду очень признателен.

Добавлено спустя 1 час 41 минуту:
А вообще можно в Python каким-либо образом добавлять в название объекта символы в процессе работы (отображения сцены)? Например, для переменной cube, чтобы её название изменялось принимая названия Куб1, Куб2, и т.д.? Именно само название переменной, а не значение.
Август
Сообщения: 104

Сообщение #1368 denis8424 » 08.06.2017, 13:27

Август писал(а):Вот ещё вопрос. Нашлёпал я объектов, а Blender как их различает, ведь у них у всех одно и тоже имя. Я в этом убеждаюсь в условии:
elif getCube == 1: # если активирован актуатор Edit Object и куб добавлен в сцену
Август писал(а):Кто-нибудь может поделиться своими соображениями по этому поводу? Как из десятка вновь добавленных объектов выбрать желаемый?

Добавление объекта в сцену Питоном, с помощью KX_Scene.addObject:

Код: Выделить всё
import bge

cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()

cube = cont.owner
sens = cont.sensors['Keyboard']

if sens.positive:
    newOb = scene.addObject('Circle', cube, 0)
    # смотрим идентификатор свежесозданного объекта
    print(id(newOb))

ID можно сохранить, например в глобальном словаре, а потом найти конкретный объект по нему, как тут показано:
bge.types.CListValue.from_id

Август писал(а):А вообще можно в Python каким-либо образом добавлять в название объекта символы в процессе работы (отображения сцены)? Например, для переменной cube, чтобы её название изменялось принимая названия Куб1, Куб2, и т.д.? Именно само название переменной, а не значение.

Имя объекта в BGE атрибут только для чтения, тем более что когда ты добавляешь объект со скрытого слоя, то у всех добавляемых объектов это получается не имя, а название типа. Теоретически, можно создать словарь с целой кучей имен, указывающих на одну переменную, вот только зачем такие сложности? Если тебе нужно выковыривать объект по порядковому номеру, то воспользуйся списком.
https://www.ibm.com/developerworks/ru/library/l-python_part_3/index.html
https://pythonworld.ru/tipy-dannyx-v-python/spiski-list-funkcii-i-metody-spiskov.html
denis8424
Аватара
Сообщения: 705

Сообщение #1369 dron » 08.06.2017, 14:53

denis8424 писал(а):Август писал(а):
А вообще можно в Python каким-либо образом добавлять в название объекта символы в процессе работы (отображения сцены)? Например, для переменной cube, чтобы её название изменялось принимая названия Куб1, Куб2, и т.д.? Именно само название переменной, а не значение.

Имя объекта в BGE атрибут только для чтения
если взять пример "мутации" экземпляров из доков KX_GameObject
Код: Выделить всё
class CustomGameObject(bge.types.KX_GameObject): тра-ла-ла
и поиграться с ним подставляя туда разные типы и передавая разные объекты можно докопаться до того, что данный принцип реализует класс PyObjectPlus который является родителем почти всех объектов из пакета bge.types) Дальше уже изучаем доки и включаем фантазию которая приведет к тому, что можно "мутировать" своим классом свойство сцены KX_Scene.objects (это экземпляр класса CListValue потомок PyObjectPlus) в котором уже реализовать что душе угодно (подмена имен и поиск объектов по новым именам и тп а так же изменить поведение свойств или методов экземпляра сцены)

зы я все забываю что некоторые очевидные (для меня) вещи для кого то будут открытием
Последний раз редактировалось dron 08.06.2017, 15:38, всего редактировалось 2 раз(а).
Данный контент распространяется под лицензией "Creative Commons BY-SA" если не указанно иного.
http://creativecommons.org/licenses/?lang=ru
dron M
Аватара
Сообщения: 109

Сообщение #1370 Август » 08.06.2017, 15:12

dron писал(а):если взять пример из доков KX_GameObject
КОД: ВЫДЕЛИТЬ ВСЁ
class CustomGameObject(bge.types.KX_GameObject): тра-ла-ла
и поиграться с ним подставляя туда разные типы и передавая разные объекты можно докопаться до того, что данный принцип реализует класс PyObjectPlus который является родителем почти всех объектов из пакета bge.types) Дальше уже изучаем доки и включаем фантазию которая приведет к тому, что можно "мутировать" своим классом свойство сцены KX_Scene.objects (это экземпляр класса CListValue потомок PyObjectPlus) в котором уже реализовать что душе угодно (подмена имен и поиск объектов по новым именам и тп а так же изменить поведение свойств или методов экземпляра сцены)
У-у-у, dron, это для начинающего уж очень круто. Мне с месяц потребуется, только для того чтобы заучить то, что вы написали, а понять...
Однако спасибо вам большое за пояснение из которого я понял, что в этот "огород" лесть мне не стоит. denis8424 вроде предлагает что-то более реальное. Освобожусь маленько и непременно попытаюсь разобраться в том, что он предлагает. В любом случае, я вам обоим благодарен.

Добавлено спустя 15 часов 41 минуту:
denis8424 писал(а):Если тебе нужно выковыривать объект по порядковому номеру, то воспользуйся списком.
denis8424, прежде чем "выковыривать объект по порядковому номеру" мне необходимо определить этот номер, конкретного, из созданного ранее десятка объектов, объекта. Здесь у меня получился "затык". Выделил я необходимый мне объект, а вот как получить его номер никак не соображу. На сколько я понимаю, строка cube = objList["Cube"] мне выведет название первого, мною добавленного объекта, а не выделенного.

Добавлено спустя 28 минут 16 секунд:
И не его id.
Август
Сообщения: 104

  • 1

Сообщение #1371 denis8424 » 09.06.2017, 21:28

Август,
Спойлер
Можно из списка доставать объекты по их индексу. Не cube = objList["Cube"], а
Код: Выделить всё
cube = objList[num - 1]
# где num - порядковый номер.
Если же ты уже каким-то образом выделил объект(как? интересно), то можно узнать его индекс в списке с помощью
Код: Выделить всё
cube = currentObj # типа конкретный, выделенный объект
num = objList.index[currentObj] + 1
Правда если ты удалишь пару элементов из списка, или наоборот добавишь в начало, то индекс тебе не поможет. Тут возможны решения проблемы:
1) Писать в список не объекты, а вложенные списки, например:
Код: Выделить всё
newOb = scene.addObject('Circle', cube, 0)
objList.append([newOb, num])
Здесь во вложенном списке первое - это добавленный объект, а num - его порядковый номер. Но доставать объект будет несколько неудобно, придется просматривать список циклом c распаковкой:
Код: Выделить всё
for obj, num in objList:
    print(obj, num) # просто посмотреть список
2) Более простой вариант - писать в проперти объекта при его создании порядковый номер. Правда всё равно придется добавляемые объекты писать в отдельный список, потому что если у тебя в сцене под тысячу разнообразных объектов с копейками, то устанешь их сортировать.
Код: Выделить всё
# Добавление объекта и создание проперти с порядковым номером
# понятно, что и список и номер откуда-то нужно брать, а не создавать снова каждый раз
newOb = scene.addObject('Circle', cube, 0)
newOb['prop'] = num
objList.append(newOb)

#Поиск объекта с нужным порядковым номером с помощью цикла:
currentObj = None # создаем объект - пустышку
for obj in objList:
    if obj['prop'] = currentNum:  # currentNum - это порядковый номер
        currentObj = obj #записываем на место пустышки объект с нужным порядковым номером
3) Есть еще один вариант, использовать словарь, наверное он будет ближе всего к тому, что ты хочешь:
Код: Выделить всё
# создаем пустой словарь или достаем его откуда-то.
objDict = {}
# добавляем объект со скрытого слоя
obName = 'Cube'
newOb = scene.addObject(obName, cube)
# Создаем в словаре новую пару ключ- значение:
objDict[num] = newOb # словарь может использовать в качестве ключа переменную типа INT, то есть нужный
# объект можно извлечь просто по номеру
objDict[obName + str(num') = newOb # а можно в качестве ключа использовать строку из имени и порядкового номера объекта

# теперь достаем объект из словаря ( не совсем верно, в словаре всё же хранятся ссылки на объект)
# по номеру
num = 2 # например
cube = objDict[num]
# по имени и номеру
cube = objDict['Cube' + str(num)]

Но есть и сложность(а где их нет?)- например желательно проверять, существеует ли такой ключ в словаре, это можно сделать с помощью оператора проверки вхождения in и функции keys()
Код: Выделить всё
if 'Cube100500' in objDict.keys() == True:
    cube = objDict['Cube100500']
Или использовать функцию .get()
denis8424
Аватара
Сообщения: 705

  • 1

Сообщение #1372 andreymal » 09.06.2017, 22:18

denis8424 писал(а):objList.index[currentObj]
(Думаю, скобки всё-таки круглые?)
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1073

Сообщение #1373 Август » 10.06.2017, 06:30

denis8424 писал(а):Август,
Спойлер
denis8424, спасибо вам БОЛЬШУЩЕЕ за столь подробный и ёмкий ответ. Знаний у меня в Python маловато, потому потребуется некоторое время для усвоения, но даже поверхностный взгляд на ответ очень радует вашей отзывчивостью. Ещё раз спасибо большое - приступаю к освоению.

Добавлено спустя 1 минуту 57 секунд:
andreymal писал(а):(Думаю, скобки всё-таки круглые?)
andreymal, спасибо за подсказку - проверю.

Добавлено спустя 6 часов 34 минуты:
Похоже, что у меня объекты создаются дважды, на нажатие правой клавиши мышки и на её отпуск. Если такой финт в Blender возможен, то как от него можно избавиться? Кнопка "Разово" в сенсоре мыши не помогает почему-то.
Август
Сообщения: 104

Сообщение #1374 Bibo » 10.06.2017, 15:59

Сенсоры ввода имеют 4 основных события с соответствующим кодом

0 - нет сигнала, кнопка не нажата
1 - первый положительный сигнал, кнопку нажали
2 - положительный сигнал, кнопка зажата
3 - первый отрицательный сигнал, кнопка отпущена

Пример
Код: Выделить всё
from bge.events import LEFTMOUSE

def main(cont):
    sens = cont.sensors['ИмяСенсораМыши']
    if sens.getButtonStatus(LEFTMOUSE) == 1:
        # Добавление объекта
Bibo
Аватара
Сообщения: 468

Сообщение #1375 denis8424 » 10.06.2017, 17:19

andreymal, точно, не обратил внимания. :suicid:


Bibo, подход правильный, но можно проще, использовать #bge.types.SCA_ISensor.positive
Код: Выделить всё
sens = cont.sensors['Mouse']
if sens.positive:
     # добавляем объект

Разница наверное будет в импульсном режиме работы сенсора...
denis8424
Аватара
Сообщения: 705

Сообщение #1376 Август » 10.06.2017, 18:12

Bibo писал(а):if sens.getButtonStatus(LEFTMOUSE) == 1:
Bibo, за эту строку меня Blender отматюгал:
File "Coordinaty cursora", line 17, in <module>
NameError: name 'LEFTMOUSE' is not defined
Я изменил на правую кнопку (сенсор правой кнопки активируется), получил такие же матюги.
Убрал из скобок указание - опять получил порцию.
Python script error - object 'Empty', controller 'PythonOver':
Traceback (most recent call last):
File "Coordinaty cursora", line 17, in <module>
TypeError: getButtonStatus() takes exactly one argument (0 given)
Написал условие:
if mouseR.positive and getCube == 0 and mouseR.getButtonStatus == 3: # если нажата правая клавиша мышки и свойство пустышки getCube имеет значение 0 - этап готовности к добавлению куба и клавиша отпущена
print("emp.worldPosition - 0 = ", emp.worldPosition)
При mouseR.positive с getCube == 0 статусом отпущенной клавиши (и другими статусами) на строку
print("emp.worldPosition - 0 = ", emp.worldPosition)
так попасть и не удалось.
Bibo, я перепробовал то, что очевидно, но пока результата нет. Может ссылку какую дадите толковую. Написали-то вы очевидно верно о статусах, а вот с условием, я видно что-то перемудрил.
Код: Выделить всё
emp = objList1["Empty"]             # получить объект пустышка
mouseMove = emp.sensors ["MouseMove"]   # получить сенсор MouseMove
mouseL = emp.sensors ["MouseL"]   # получить сенсор MouseL
mouseR = emp.sensors ["MouseR"]   # получить сенсор MouseR
if mouseMove.positive:
    emp.worldPosition = mouseMove.hitPosition
    if mouseR.positive and getCube == 0 and mouseR.getButtonStatus == 3:    # если нажата правая клавиша мышки и свойство пустышки getCube имеет значение 0 - этап готовности к добавлению куба и клавиша отпущена
        print("emp.worldPosition - 0  = ", emp.worldPosition)
Август
Сообщения: 104

Сообщение #1377 jstas » 10.06.2017, 18:41

Август писал(а):if sens.getButtonStatus(LEFTMOUSE) == 1:

Bibo, за эту строку меня Blender отматюгал:
File "Coordinaty cursora", line 17, in <module>
NameError: name 'LEFTMOUSE' is not defined

Август, Ты случаем про эту строку не забыл?
Код: Выделить всё
from bge.events import LEFTMOUSE
Эх, как бы мне это бы тоже, по обмену премудростями?
jstas M
Аватара
Сообщения: 475


Сообщение #1378 Bibo » 10.06.2017, 18:56

Август писал(а):Bibo, за эту строку меня Blender отматюгал:
File "Coordinaty cursora", line 17, in <module>
NameError: name 'LEFTMOUSE' is not defined
Попыток прочитать и осознать сообщение об ошибке не было совсем?
denis8424 писал(а):Разница наверное будет в импульсном режиме работы сенсора...
В этом кроется заковыка, на первый взгляд несущественная - приходится держать в уме настройки сенсора.
Bibo
Аватара
Сообщения: 468

Сообщение #1379 Август » 11.06.2017, 06:34

Bibo писал(а):Август писал(а):
Bibo, за эту строку меня Blender отматюгал:
File "Coordinaty cursora", line 17, in <module>
NameError: name 'LEFTMOUSE' is not defined
Это вы о ключе левой клавиши? Я же писал что сменил ключ, как увидел эту ошибку, так и сменил. Ошибки не стало, но и легче от этого тоже.
Вот очерёдность импортирования:
from bge import logic as G
from bge.events import RIGHTMOUSE
import Rasterizer
Думаю, что очерёдность вряд ли послужит причиной, но может быть причина в способе вызова модулей? Ну, это так, предположение и существующее сомнение.
Изображение
Я ожидал что получу, после нажатия правой клавиши - mouseR.positive = True и mouseR.getButtonStatus == 1 = True, может моя логика здесь хромает и у меня к статусу не таким должен быть подход? Ведь, точно блуждаю меж трёх сосен и солнца не вижу.
Август
Сообщения: 104

Сообщение #1380 jstas » 11.06.2017, 09:17

Август, выложи файл
Эх, как бы мне это бы тоже, по обмену премудростями?
jstas M
Аватара
Сообщения: 475


Пред.След.

Вернуться в Игровой движок Blender

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость