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

Board index Геймдев в Blender Игровой движок Blender

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

Post #1by Mihanik » 21.02.2015, 14:22

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

  • 1

Post #2by exooman » 21.02.2015, 14:27

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

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


Post #3by Mihanik » 21.02.2015, 15:43

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

  • 3

Post #4by Bibo » 21.02.2015, 15:47

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

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

Code: Select all
def Main(cont):
        pass

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

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

Code: Select all
Obj = bge.logic.getCurrentController().owner
X = 100.0
Y = 250.0

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

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

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

Code: Select all
X = 0

def Main():
        X += 1

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

Code: Select all
X = 0

def Main():
        global X
        X += 1

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

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

Тоже хотелось бы знать, но вряд ли.
Bibo
Avatar
Posts: 604

Post #5by Mihanik » 21.02.2015, 18:32

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

  • 1

Post #6by exooman » 21.02.2015, 18:53

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


  • 2

Post #7by Bibo » 21.02.2015, 19:26

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

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

P.S. Если не затруднит, большие скриншоты прячь пожалуйста под спойлер.
Bibo
Avatar
Posts: 604

Post #8by Mihanik » 22.02.2015, 13:02

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

  • 1

Post #9by Flogger-K » 22.02.2015, 14:40

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

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

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

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

Code: Select all
#Создаем словарь свойств - смотри сам, где лучше в конкретной функции после 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
авиатор
Avatar
Posts: 517

  • 1

Post #10by exooman » 22.02.2015, 14:50

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

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


Post #11by Mihanik » 22.02.2015, 15:37

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

Added after 8 minutes 25 seconds:
Хотя думаю ты прав, твой вариант оптимальней при любых раскладах, тем более если речь идёт о конкретно этом сенсоре.
Mihanik M
Avatar
Posts: 1571

Post #12by exooman » 22.02.2015, 15:52

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

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


Post #13by Mihanik » 22.02.2015, 15:59

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

Post #14by exooman » 22.02.2015, 16:10

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


Post #15by Mihanik » 22.02.2015, 16:43

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

Почему-то сегодня у меня такая фигня на этом сайте, сам там ковырялся :(
Mihanik M
Avatar
Posts: 1571

Post #16by andreymal » 22.02.2015, 16:57

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

  • 1

Post #17by denis8424 » 22.02.2015, 17:01

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

Post #18by Mihanik » 22.02.2015, 17:16

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

  • 1

Post #19by andreymal » 22.02.2015, 17:20

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

  • 1

Post #20by exooman » 22.02.2015, 17:21

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

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


Next

Return to Игровой движок Blender

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest

cron