BGE, Python , опыты дилетанта.

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

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

Сообщение #1 Mihanik » 21.02.2015, 14:22

Ну я почитал конечно немного про питон вообще и про использование его в BGE в частности. Но начиная с некоторого момента перестаю понимать о чём там написано (особенно если по английски) и процесс обучения плавно переходит в "метод тыка". Во по сему и создаю эту ветку, спрашивать на конкретных примерах, что недопонимаю. (Получится если выхлоп из простеньких игрулек, хорошо но не главное.)
Вот простенькая игруля: катаем шарик по доске с препятствиями, наклоняя её мышкой.
Спойлер
Изображение
Из скрина всё видно, как сделано. В принципе всё работает, но если кто видит где я поступаю не верно или не рационально, прошу критики.
Меня лично смущает, что кажется движок читает и интерпретирует весь скрипт целиком каждый кадр, в то время как установить курсор в центр надо всего один раз при старте игры.
Mihanik M
Аватара
Сообщения: 1553

  • 1

Сообщение #2 exooman » 21.02.2015, 14:27

Меня лично смущает, что кажется движок читает и интерпретирует весь скрипит целиком каждый кадр, в то время как установить курсор в центр надо всего один раз при старте игры.

используй модуль и обращайся к нему, а не к всему скрипту.
exooman
Сообщения: 1864


Сообщение #3 Mihanik » 21.02.2015, 15:43

Както у меня корявенько получается... А нет ли другого способа выполнить скрипт (С описанием начала игры), один раз на момент старта игры, не цепляя его к конкретному контроллеру, конкретного объекта?
Mihanik M
Аватара
Сообщения: 1553

  • 3

Сообщение #4 Bibo » 21.02.2015, 15:47

Если поблудить по форуму, можно найти достаточное кол-во информации. Но увы, она будет слишком разрозненна, а процесс ее систематизации очень болезнен.
Есть даже целая статья, но увы, очень плохо оформленная и описанная довольно скомкано.

По теме, как уже сказал exooman, используй обращение к модулю, а не скрипту. Измени установку в контроллере со скрипта на модуль. Например:
Изображение
где Name это имя модуля Name.py, а Main это имя функции внутри модуля, которую следует вызывать.
При обращении к модулю, вызываемая функция может принимать 1 аргумент (но не обязательно):

Код: Выделить всё
def Main(cont):
        pass

Этот аргумент будет являться текущим контроллером.

При первом вызове, будет выполнен весь код внутри модуля, а при каждом последующем вызове - только указанная функция. Это дает хорошую возможность объявить глобальные переменные один единственный раз и использовать их в течении всей игры. Например:

Код: Выделить всё
Obj = bge.logic.getCurrentController().owner
X = 100.0
Y = 250.0

def Main():
        Obj.worldPosition.x += X
        Obj.worldPosition.y += Y

Так как мы обращаемся к модулю, а не скрипту и объявляем переменные Obj, X, Y глобально, они будут существовать в течении всего времени существования контроллера или до перезагрузки модуля, их не придется объявлять заново.

Есть одно но. Питон обладает причудой запрещать изменение глобальных переменных (переменных объявленных вне какой либо области видимости окромя самого модуля) внутри функций. Например:

Код: Выделить всё
X = 0

def Main():
        X += 1

Вызовет сообщение об ошибке: local variable 'X' referenced before assignment.
Чтобы этого избежать, внутри функции следует использовать ключевое слово global, которое укажет интерпретатору в какой области видимости искать переменную.

Код: Выделить всё
X = 0

def Main():
        global X
        X += 1

~Как-то так :-/

Mihanik писал(а):Както у меня корявенько получается... А нет ли другого способа выполнить скрипт (С описанием начала игры), один раз на момент старта игры, не цепляя его к конкретному контроллеру, конкретного объекта?

Тоже хотелось бы знать, но вряд ли.
Bibo
Аватара
Сообщения: 595

Сообщение #5 Mihanik » 21.02.2015, 18:32

Bibo Чёт не получается... Он читает всё каждый раз как сенсор обращается к контроллеру.
И где я не прав?
Спойлер
Изображение
Mihanik M
Аватара
Сообщения: 1553

  • 1

Сообщение #6 exooman » 21.02.2015, 18:53

ну дык ты кнопку пульсации у сенсора включил. Это значит, что каждый кадр будет читать(или логический шаг). Нужно ставить один сенсор на разовое срабатывание(для принудительной инициализации при запуске), а второй делать "mouse movement" и уже его использовать для обращения к модулю. По запросу, так сказать. То есть шевелим мышкой - модуль работает, не шевелим - не работает.
exooman
Сообщения: 1864


  • 2

Сообщение #7 Bibo » 21.02.2015, 19:26

Mihanik писал(а):И где я не прав?
Здесь:
Изображение
Эта установка вынуждает загружать модуль заново при каждом к нему обращении. Отпусти.

Для чего эта кнопка вообще может быть нужна? Если модуль хранится не в бленд-файле, а на диске в текстовом документе, это позволяет редактировать код модуля и наблюдать изменения в режиме реального времени не перезапуская каждый раз игровой процесс.

P.S. Если не затруднит, большие скриншоты прячь пожалуйста под спойлер.
Bibo
Аватара
Сообщения: 595

Сообщение #8 Mihanik » 22.02.2015, 13:02

Bibo писал(а):Mihanik писал(а):
И где я не прав?
Здесь:
:-D
Bibo, Спасибо, вот так всёгда, нажму чего ни будь, не знамо зачем, забуду про это, и убиваюсь полдня, "Почему не выходит?"
(Странненько, кнопка вроде как, всего лишь для удобства редактирования скриптов, а работает с ней всё по другому.)
exooman, Понятно. То есть да, нет движения мыши - нет чтения функции, это правильно, но наличие лишнего сенсора не даёт дополнительной нагрузку на движок? Сенсоры тож видимо как-то опрашиваются...
Mihanik M
Аватара
Сообщения: 1553

  • 1

Сообщение #9 Flogger-K » 22.02.2015, 14:40

Насчет опроса сенсоров

Код: Выделить всё
#толкновение с чем либо                     
def crash():
    cont = bge.logic.getCurrentController()
    own = cont.owner
    sensor = cont.sensors["crash"]    #В квадратных скобках - название сенсора - у меня там Near

    if sensor.positive:
            own.endObject()               #Если сенсор активен - то объект, на котором он висит - убираем.
                                                   #Но можно и другое действие сделать, какое надо. Если сенсор нужно
                                                   #отследить, когда он неактивирован (иногда и так надо, то пишем
                                                   #if not sensor.positive

А если тебе надо, чтоб меньше жрало при проверке проперти, то:

Код: Выделить всё
#Создаем словарь свойств - смотри сам, где лучше в конкретной функции после def и тд или после импорт бге
if 'localMessage' not in own:
        own['localMessage'] = {}                             #Создание самого словаря
        own['localMessage']['prop'] = own['prop']      #Запись в словарь                                                                 
        own['localMessage']['prop1'] = own['prop1']  #значений нужных свойств

if own['localMessage']['prop1'] != own['prop1']  #Если значение свойства поменялось (сравнение со словарем
    blablabla                                                   #какое-то действие - реакция на изменение проперти
    own['localMessage']['prop1'] = own['prop1']  #Записываем в словарь изменившееся значение проперти (если надо)
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 501

  • 1

Сообщение #10 exooman » 22.02.2015, 14:50

но наличие лишнего сенсора не даёт дополнительной нагрузку на движок?

а разница? Always один раз при запуске сработает и всё. А мышиный сенсор только "по востребованию". А в твоем случае Always вместо мышиного работает, причем постоянно.
exooman
Сообщения: 1864


Сообщение #11 Mihanik » 22.02.2015, 15:37

Flogger-K , я не то имел ввиду, но всё равно спасибо за дополнительную информацию. Я имел ввиду, что наличие сенсора может нагружать движок. Не мой скрипт опрашивает сенсор, а сам движок должен опрашивать сенсор постоянно, что бы знать сработал он или нет. exooman Я к тому, что сенсор сам по себе может жрать производительность, не зависимо от частоты срабатывания. Или нет?

Добавлено спустя 8 минут 25 секунд:
Хотя думаю ты прав, твой вариант оптимальней при любых раскладах, тем более если речь идёт о конкретно этом сенсоре.
Mihanik M
Аватара
Сообщения: 1553

Сообщение #12 exooman » 22.02.2015, 15:52

Я имел ввиду, что наличие сенсора может нагружать движок.

разница, с ним или без, будет минимальна. Если игра не для 133mhz процессора :)
exooman
Сообщения: 1864


Сообщение #13 Mihanik » 22.02.2015, 15:59

Тут другой вопрос назрел применительно к этой игруле. Доска вращается вокруг своего центра. Если шарик находится на краю доски, то он даже подпрыгивает при резких движениях. От сюда следует, что доску лучше вращать вокруг центра шарика. Вот и вопрос, Как? Есть ли какая переменная или функция, или свойство, определяющая центр трансформации? Или надо городить тригонометрический огород, что бы эту доску ещё и двигать, чтобы она не подбрасывала шарик при вращении?
Mihanik M
Аватара
Сообщения: 1553

Сообщение #14 exooman » 22.02.2015, 16:10

если тут нет, то придётся городить http://www.blender.org/api/blender_python_api_2_70a_release/
exooman
Сообщения: 1864


Сообщение #15 Mihanik » 22.02.2015, 16:43

Блин,
Страница недоступна
Невозможно выполнить поиск на www.blender.org

Почему-то сегодня у меня такая фигня на этом сайте, сам там ковырялся :(
Mihanik M
Аватара
Сообщения: 1553

Сообщение #16 andreymal » 22.02.2015, 16:57

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

  • 1

Сообщение #17 denis8424 » 22.02.2015, 17:01

у меня тоже не открывается, однако
умвр
насчет доски - можно в момент поворота парентить доску к объекту с координатами шарика.
и вообще, шарик может быть неподвижным, а двигаться может доска.
denis8424
Аватара
Сообщения: 724

Сообщение #18 Mihanik » 22.02.2015, 17:16

denis8424 писал(а):насчет доски - можно в момент поворота парентить доску к объекту с координатами шарика.
Сомневаюсь, дело в том что в момент поворота доски шарик катится. Как припарентить, чтоб доска не не двигалась за объектом с координатами шарика? Хотя... Прицеплять, поворачивать и сразу отцеплять, на одном кадре.. надо пробовать...
Mihanik M
Аватара
Сообщения: 1553

  • 1

Сообщение #19 andreymal » 22.02.2015, 17:20

Мне кажется, вместо такого лучше будет тригонометрический огород нагородить)
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1193

  • 1

Сообщение #20 exooman » 22.02.2015, 17:21

Прицеплять, поворачивать и сразу отцеплять, на одном кадре.. надо пробовать...

а ты еще о добавлении второго сенсора беспокоился - данный костыль куда больше ресурсов пожрёт...
exooman
Сообщения: 1864


След.

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

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

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