Jump to content
Korean Random
kharlashkin

[Заказ] Модернизация управления камерой

Recommended Posts

Попробовал не помогло - вот код:

import Keys
from AvatarInputHandler.control_modes import ArcadeControlMode
from debug_utils import *
orig_handleKeyEvent = ArcadeControlMode.handleKeyEvent

def mod_handleKeyEvent(self, isDown, key, mods, event = none):
    retVal = orig_handleKeyEvent(self, isDown, key, mods, event)
    if isDown:
        if key == Keys.KEY_NUMPAD4:
            dx = -4.0
        if key == Keys.KEY_NUMPAD6:
            dx = 4.0
        if key == Keys.KEY_NUMPAD8:
            dy = -4.0
        if key == Keys.KEY_NUMPAD2:
            dy = 4.0
        self._ArcadeControlMode__cam.update(dx, dy, 0, True, True, False if dx == dy == 0.0 else True)        
        return True 
    else:
        if key == Keys.KEY_NUMPAD4:
            dx = 0.0
        if key == Keys.KEY_NUMPAD6:
            dx = 0.0
        if key == Keys.KEY_NUMPAD8:
            dy = 0.0
        if key == Keys.KEY_NUMPAD2:
            dy = 0.0
        self._ArcadeControlMode__cam.update(dx, dy, 0, True, True, False if dx == dy == 0.0 else True)        
        return True 
    return retVal 

 

Заметил интересный глюк - перестает работать мышь когда нажата любая клавиша.

Share this post


Link to post

Short link
Share on other sites

в HandleKeyEvent

приходит key - название кнопки

isDown - тру или фальш всего два значения, когда какая то кнопка нажата приходит тру , когда какая то кнопка отпущена приходит фальш.

допустим KEY_NUMPAD4 пришло в key и в isDown пришло тру - говорит что кнопка нажата?

допустим KEY_NUMPAD4 пришло в key и в isDown пришло фальш - говорит что кнопку отпустили?

я правильно понимаю что в обработчик прерывания приходит и момент отпускания кнопки?

-----------------------

а если

orig_handleKeyEvent(self, isDown, key, mods, event)

вызывать после всех ваших манипуляций? типа если это по вашей части(ваши кнопки) то манипуляции с  камерой пройдут и произойдёт выход.

Share this post


Link to post

Short link
Share on other sites

лол)) Не обижайся, но тебе стоит почитать какую-нибудь литературу по программированию и попробовать написать с 0 что-нибудь свое, просто чтобы понять как "это" работает.

В том коде, что ты написал дело до return retVal никогда не дойдет, у тебя все время будет return True.

import Keys
from AvatarInputHandler.control_modes import ArcadeControlMode
from debug_utils import *
orig_handleKeyEvent = ArcadeControlMode.handleKeyEvent

def mod_handleKeyEvent(self, isDown, key, mods, event = none):
    retVal = orig_handleKeyEvent(self, isDown, key, mods, event)
    if isDown:
        if key == Keys.KEY_NUMPAD4:
            dx = -4.0
        if key == Keys.KEY_NUMPAD6:
            dx = 4.0
        if key == Keys.KEY_NUMPAD8:
            dy = -4.0
        if key == Keys.KEY_NUMPAD2:
            dy = 4.0       
    else:
        if key == Keys.KEY_NUMPAD4:
            dx = 0.0
        if key == Keys.KEY_NUMPAD6:
            dx = 0.0
        if key == Keys.KEY_NUMPAD8:
            dy = 0.0
        if key == Keys.KEY_NUMPAD2:
            dy = 0.0
    if key in (Keys.KEY_NUMPAD4,  Keys.KEY_NUMPAD2,  Keys.KEY_NUMPAD6,  Keys.KEY_NUMPAD8):      
        self._ArcadeControlMode__cam.update(dx, dy, 0, True, True, False if dx == dy == 0.0 else True) 
    return retVal 
Edited by DrWebber
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

def mod_handleKeyEvent(self, isDown, key, mods, event = none):

    i=0

    if isDown:
        if key == Keys.KEY_NUMPAD4:
            dx = -4.0

            i=1
        if key == Keys.KEY_NUMPAD6:
            dx = 4.0

             i=1
        if key == Keys.KEY_NUMPAD8:
            dy = -4.0

            i=1
        if key == Keys.KEY_NUMPAD2:
            dy = 4.0

            i=1
    else:
        if key == Keys.KEY_NUMPAD4:
            dx = 0.0

            i=1
        if key == Keys.KEY_NUMPAD6:
            dx = 0.0

            i=1
        if key == Keys.KEY_NUMPAD8:
            dy = 0.0

            i=1
        if key == Keys.KEY_NUMPAD2:
            dy = 0.0

            i=1
    if i==1:

      self._ArcadeControlMode__cam.update(dx, dy, 0, True, True, False if dx == dy == 0.0 else True) 

      тут думайте сами нужно ли вам чтоб вызывалась оригинальный метод, тогда сюда его добавте. ну или выше этого, хз...

    else:
       return orig_handleKeyEvent(self, isDown, key, mods, event)

вот вот человек верно написал у вас return True выход с обработчика и до низу то не доходит до return retVal.

Edited by yaotzinv
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

лол)) Не обижайся, но тебе стоит почитать какую-нибудь литературу по программированию и попробовать написать с 0 что-нибудь свое, просто чтобы понять как "это" работает.

В том коде, что ты написал дело до return retVal никогда не дойдет, у тебя все время будет return True.

Ну так я в самом начале и написал, что довольно с меня копошения на месте с python, проще заплатить 5-10-100 $ за нужный функционал, расковырять код - чтобы примерно понимать что к чему, дабы не доставать потом создателя с обновами и пользоваться.

Просто человеческое любопытство и постоянно новые советы дают толчки пробовать чего-то самому, хотя можно пойти х3 опыт посбивать вместо скриптов python :) За танки перед ТВ не садился уже дня 4-е... Хотя на постоянных пробах чего-то, на Т1 накатал 100к серебра.

вот вот человек верно написал у вас return True выход с обработчика и до низу то не доходит до return retVal.

Я как то на подсознательном уровне догадывался, что как-то так нужно или с отступами были ошибки - сейчас попробую.

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

не помню в какой книжке читал, но было написано что лучше садится и начинать кодить чем все время читать;) ну смысл где-то такой там был)

Share this post


Link to post

Short link
Share on other sites

Не работает код от уважаемого DrWebber... Если честно я и не ожидал - в оригинальном скрипте как-то интересно расположены отступы...

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

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

https://www.google.com.ua/search?q=%D0%BE%D1%82%D1%81%D1%82%D1%83%D0%BF%D1%8B+%D0%B2+python&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a&channel=np&source=hp&gfe_rd=cr&ei=yAT5U8DRDcnb8geS7YGgDQ


это при копировании и вставке у вас поломалось

Share this post


Link to post

Short link
Share on other sites

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

https://www.google.com.ua/search?q=%D0%BE%D1%82%D1%81%D1%82%D1%83%D0%BF%D1%8B+%D0%B2+python&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a&channel=np&source=hp&gfe_rd=cr&ei=yAT5U8DRDcnb8geS7YGgDQ

это при копировании и вставке у вас поломалось

Не-не-не, я смотрю оригинальные скрипты - которые нормально игрой кушаются. Про отступы в питоне - знаю, уже пару копей ломал...

Share this post


Link to post

Short link
Share on other sites

Не работает код от уважаемого DrWebber... Если честно я и не ожидал - в оригинальном скрипте как-то интересно расположены отступы...

Там в update передается dx и dy, один из них всегда неопределен, продумай логику того что надо. Я просто не хочу в этом разбираться.

Edited by DrWebber

Share this post


Link to post

Short link
Share on other sites
import Keys
from AvatarInputHandler.control_modes import ArcadeControlMode
from debug_utils import *
orig_handleKeyEvent = ArcadeControlMode.handleKeyEvent
def mod_handleKeyEvent(self, isDown, key, mods, event = none):
    retVal = orig_handleKeyEvent(self, isDown, key, mods, event)
    dx = None
    dy = None
    if isDown:
        if key == Keys.KEY_NUMPAD4:
            dx = -4.0
        if key == Keys.KEY_NUMPAD6:
            dx = 4.0
        if key == Keys.KEY_NUMPAD8:
            dy = -4.0
        if key == Keys.KEY_NUMPAD2:
            dy = 4.0      
    else:
        if key == Keys.KEY_NUMPAD4:
            dx = 0.0
        if key == Keys.KEY_NUMPAD6:
            dx = 0.0
        if key == Keys.KEY_NUMPAD8:
            dy = 0.0
        if key == Keys.KEY_NUMPAD2:
            dy = 0.0
    if key in (Keys.KEY_NUMPAD4, Keys.KEY_NUMPAD2, Keys.KEY_NUMPAD6,  Keys.KEY_NUMPAD8) and dx is not None and dy is not None:     
        self._ArcadeControlMode__cam.update(dx, dy, 0, True, True, False if dx == dy == 0.0 else True)
    return retVal

А так?

 

Я пробовал задавать нулевые значения dx = dy = 0.0, но сейчас попробую именно Ваш код :) Я вот думаю может - просто я не там копаю? Тем более этот непонятный глюк с мышью...

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Успел до окончания боя - не-а, не работает, может у меня с игрой чего?

Зато серебро, заработанное на Т1 растет ;)

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Я написал выше почему.

Я не понял что там к чему, подробнее объяснили бы...

 

Я попробовал модифицировать оригинальный скрипт, вот так в принципе, то что мне нужно:

'control_modes.py'

        if BigWorld.isKeyDown(Keys.KEY_NUMPAD4) and cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
         CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
         CommandMapping.CMD_CM_INCREASE_ZOOM,
         CommandMapping.CMD_CM_DECREASE_ZOOM), key):
            dx = dy = dz = 0.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                dx = -0.25
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                dx = 0.25
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                dy = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                dy = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                dz = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                dz = -1.0
            self.__cam.update(dx, dy, dz, True, True, False if dx == dy == dz == 0.0 else True)
            return True
        if BigWorld.isKeyDown(Keys.KEY_NUMPAD6) and cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
         CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
         CommandMapping.CMD_CM_INCREASE_ZOOM,
         CommandMapping.CMD_CM_DECREASE_ZOOM), key):
            dx = dy = dz = 0.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                dx = -3.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                dx = 3.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                dy = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                dy = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                dz = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                dz = -1.0
            self.__cam.update(dx, dy, dz, True, True, False if dx == dy == dz == 0.0 else True)
            return True
        if BigWorld.isKeyDown(Keys.KEY_NUMPAD2) and cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
         CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
         CommandMapping.CMD_CM_INCREASE_ZOOM,
         CommandMapping.CMD_CM_DECREASE_ZOOM), key):
            dx = dy = dz = 0.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                dx = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                dx = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                dy = -0.25
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                dy = 0.25
            if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                dz = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                dz = -1.0
            self.__cam.update(dx, dy, dz, True, True, False if dx == dy == dz == 0.0 else True)
            return True
        if BigWorld.isKeyDown(Keys.KEY_NUMPAD8) and cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
         CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
         CommandMapping.CMD_CM_INCREASE_ZOOM,
         CommandMapping.CMD_CM_DECREASE_ZOOM), key):
            dx = dy = dz = 0.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                dx = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                dx = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                dy = -3.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                dy = 3.0
            if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                dz = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                dz = -1.0
            self.__cam.update(dx, dy, dz, True, True, False if dx == dy == dz == 0.0 else True)
            return True
        if cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
         CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
         CommandMapping.CMD_CM_INCREASE_ZOOM,
         CommandMapping.CMD_CM_DECREASE_ZOOM), key):
            dx = dy = dz = 0.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                dx = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                dx = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                dy = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                dy = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                dz = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                dz = -1.0
            self.__cam.update(dx, dy, dz, True, True, False if dx == dy == dz == 0.0 else True)
            return True 

Хотя проще и удобнее по нажатию кнопок ввести коэффициенты для dx/dy.

Попробовал через коэффициенты - намного лучше, потому как работает смешивание (например средне вправо и быстро вниз или медленно вниз и быстро вправо).

'control_modes.py'

        if cmdMap.isFiredList((CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT,
         CommandMapping.CMD_CM_CAMERA_ROTATE_UP,
         CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN,
         CommandMapping.CMD_CM_INCREASE_ZOOM,
         CommandMapping.CMD_CM_DECREASE_ZOOM), key):
            dx = dy = dz = 0.0
            kx = ky = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_LEFT):
                dx = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_RIGHT):
                dx = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_UP):
                dy = -1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_CAMERA_ROTATE_DOWN):
                dy = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_INCREASE_ZOOM):
                dz = 1.0
            if cmdMap.isActive(CommandMapping.CMD_CM_DECREASE_ZOOM):
                dz = -1.0
            if BigWorld.isKeyDown(Keys.KEY_NUMPAD4):
                kx = 0.2
            if BigWorld.isKeyDown(Keys.KEY_NUMPAD2):
                ky = 0.2
            if BigWorld.isKeyDown(Keys.KEY_NUMPAD6):
                kx = 3.0
            if BigWorld.isKeyDown(Keys.KEY_NUMPAD8):
                ky = 3.0
            self.__cam.update(dx * kx, dy * ky, dz, True, True, False if dx == dy == dz == 0.0 else True)
            return True 

 

Подсказал бы кто как этот код вставить вместо родного модом:)

Share this post


Link to post

Short link
Share on other sites

Вопрос решен, огромное спасибо всем участвовавшим! Отдельное огромное спасибо DrWebber!!!

Share this post


Link to post

Short link
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...