Jump to content
Korean Random
kharlashkin

[Заказ] Обратная связь или ForceFeedback

Recommended Posts

 

 

from ctypes import *

Прошу прощения за "ламерский вопрос", а почему не просто "import ctypes", как в найденном мною скрипте?

Share this post


Link to post

Short link
Share on other sites

sirmax, помоги пожалуйста подключить ctypes в танки, если это вообще реально?

Практически не реально. Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию.

Share this post


Link to post

Short link
Share on other sites

Прошу прощения за "ламерский вопрос", а почему не просто "import ctypes", как в найденном мною скрипте?

Видимо модуля ctypes нет в сборке клиента WoT. А просто добавить его не получается, потому что он не .pyc а .pyd=dll. Примерно так. Попробуй поискать альтернативный способ подключения геймпада в питоне без использования Xinput.dll и соответственно ctypes. Может существуют другие библиотеки.

Share this post


Link to post

Short link
Share on other sites

 

 

Видимо модуля ctypes нет в сборке клиента WoT. А просто добавить его не получается, потому что он не .pyc а .pyd=dll. Примерно так. Попробуй поискать альтернативный способ подключения геймпада в питоне без использования Xinput.dll и соответственно ctypes. Может существуют другие библиотеки.
 

 

Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не поможет (или поможет)?

 

Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? Буду смотреть сейчас.

Share this post


Link to post

Short link
Share on other sites

 

Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не поможет (или поможет)?

 

Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? Буду смотреть сейчас.

 

 

Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не помогло

 

Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия?

А что это даст??

Нужно каким то образом подключить _ctypes.pyd который не является py(compiled) а является py(dll) и который игра в упор не видит

Edited by inj3ct0r

Share this post


Link to post

Short link
Share on other sites

Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не помогло

 

Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия?

А что это даст??

Нужно каким то образом подключить _ctypes.pyd который не является py(compiled) а является py(dll) и который игра в упор не видит

Не тратьте время, не получится все равно.

Я раньше писал как можно сделать: "Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию."

Обычный прокси сервис, на том же питоне, или на IIS+WCF. Пока этого будет достаточно, а далее уже можно будет думать над красивым решением.

Share this post


Link to post

Short link
Share on other sites

Давайте по порядку, у меня квалификации не хватает чтобы "на лету", подобно Вам, понимать происходящее (sirmax так умеет).

 

1. Написанный GamePadVibration, использует ресурсы WoT для выполнения скриптов?

2. Если установить дополнительно python нужной версии и отправить выполнение именно скрипта вибрации в него (sirmax наверное об этом говорил), так будет получатся?


Не тратьте время, не получится все равно.

Я раньше писал как можно сделать: "Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию."

Обычный прокси сервис, на том же питоне, или на IIS+WCF. Пока этого будет достаточно, а далее уже можно будет думать над красивым решением.

 

Чуть опоздал :)

 

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


Мне кажется ответ где-то на поверхности. Прихожу вот к какому выводу - скрипт же отрабатывается в python без проблем. Делаем два скрипта StarVibration.py и StopVibration.py, с соответствующим кодом. Кладем их в папку где надо с игрой, и вместо добавления и компилирования скриптов в GamePadVibration, сделать их вызов. Код в таком случае будет отрабатываться уже не игрой, а установленным в ОС python?

 

(заранее прошу прощения за столь глупые высказывания)

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Общее направление правильное. Гугли в сторону Python REST. Вешаешь на системном питоне веб сервис с необходимыми методами, для этой задаче самый простой HTTP GET подойдет. Из игрового питона просто дергаешь нужные URL.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Попробовал создать сервис через Flask. Направление очень интересное. Такой сервис без проблем позволит нам подключить ctypes. Единственный минус - будет висеть окошко системного питона. Далее. Вероятно, если создать такой сервис на игровом питоне, то из системного можно будет выполнять произвольный код на игровом прямо во время игры с выводом лога в системный питон. Такой своего рода shell получится.

ps. Сейчас пишу диплом, буду помогать по мере наличия свободного времени.

Edited by inj3ct0r

Share this post


Link to post

Short link
Share on other sites

Ок. Давай с этой прикрепленной штукой проверим работоспособность. Распакуешь в World_of_Tanks\ далее в архиве все пути созданы. Там есть xml-ка, в ней нужно будет прописать путь к системному питону. Сейчас там стоит c:/python26/python.exe. Если изменить python.exe на pythonw.exe, то окошко системного питона будет скрыто. Сейчас пока должна включаться только примитивная вибрация при выстреле. В GPService.py увидишь свой код с stackoverflow.com - этот файл я не стал компилить. Возможно будут какие-то ошибки или вообще не будет работать - все еще сырое сам понимаешь делал по-быстрому.

gp_wot_v01.zip

Share this post


Link to post

Short link
Share on other sites
Ок. Давай с этой прикрепленной штукой проверим работоспособность. Распакуешь в World_of_Tanks\ далее в архиве все пути созданы. Там есть xml-ка, в ней нужно будет прописать путь к системному питону. Сейчас там стоит c:/python26/python.exe. Если изменить python.exe на pythonw.exe, то окошко системного питона будет скрыто. Сейчас пока должна включаться только примитивная вибрация при выстреле. В GPService.py увидишь свой код с stackoverflow.com - этот файл я не стал компилить. Возможно будут какие-то ошибки или вообще не будет работать - все еще сырое сам понимаешь делал по-быстрому.

1. Наверное надо все таки скомпилисть GPService.py? Или так должен отрабатывать, потому как у меня окошко python не выскакивает. (чуть позже дочитал, исправлять не стал, скомпилю сейчас)

2. Исправил немного код, поставил нужную dll, добавил номер геймпада, добавил import time.

ENABLE_LOG = False
d = dict()
from flask import Flask
from flask import request
import ctypes
import time

# Define necessary structures
class XINPUT_VIBRATION(ctypes.Structure):
_fields_ = [("wLeftMotorSpeed", ctypes.c_ushort),
("wRightMotorSpeed", ctypes.c_ushort)]

xinput = ctypes.windll.xinput1_3 # Load Xinput.dll

# Set up function argument types and return type
XInputSetState = xinput.XInputSetState
XInputSetState.argtypes = [ctypes.c_uint, ctypes.POINTER(XINPUT_VIBRATION)]
XInputSetState.restype = ctypes.c_uint

# You can also create a helper function like this:
def set_vibration(left_motor, right_motor, controller = 0):
vibration = XINPUT_VIBRATION(int(left_motor * 65535), int(right_motor * 65535))
XInputSetState(controller, ctypes.byref(vibration))


if not ENABLE_LOG:
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

app = Flask(__name__)

@app.route('/connect')
def connect():
print 'Connection checked - Ok.'
return 'True'

@app.route('/loadEffectFromFile')
def loadEffectFromFile():
effectHandle = request.args.get('effectHandle')
fileName = request.args.get('fileName')
#print
#print 'loadEffectFromFile'
#print 'effectHandle =', request.args.get('effectHandle')
#print 'fileName =', request.args.get('fileName')
if not effectHandle in d:
d[effectHandle] = fileName
return ''

@app.route('/getEffectLength')
def getEffectLength():
#print
#print 'getEffectLength'
#print 'effectHandle =', request.args.get('effectHandle')
#print 'returnedLength =', request.args.get('returnedLength')
return ''

import threading, time
def shot():
set_vibration(0, 250/250.0, 250/500.0)
time.sleep(0.15)
set_vibration(0, 20/250.0, 20/500.0)
time.sleep(0.80)
set_vibration(0, 0.0, 0.0)


@app.route('/startEffect')
def startEffect():
handle = request.args.get('handle')
count = request.args.get('count')

if handle in d:
print 'startEffect: '+ d[handle]
if 'shot_main' in d[handle] or 'shot_large' in d[handle] or 'shot_medium' in d[handle] or 'shot_small' in d[handle]:
print 'shot'
# init thread
t1 = threading.Thread(target=shot)
# start threads
t1.start()

# print
# print 'startEffect'
# print 'handle =', handle
# print 'count =', count

return ''

if __name__ == "__main__":
app.debug = True
app.run()

3. При попытке запустить скрипт - выдает сообщение про отсутствие Flask, наверное надо его куда-то положить? 

Traceback (most recent call last):
  File "D:\Games\World_of_Tanks\res_mods\0.8.10\scripts\client\gui\mods\gpvibromanager\GPService.py", line 3, in <module>
    from flask import Flask
ImportError: No module named flask

Вроде получилось установить Flask, по крайней появилась "C:\Python27\Scripts\flask\". В ней лежит свой python, может в xml надо указать путь к нему?

 

Не отрабатывает мод. Не выскакивает окошко системного питона и все.

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Да забыл, flask нужно установить сначала. Либо скачай с сайта (ссылка выше) и запусти "python.exe setup.py install", но там по-моему сначала нужно также установить easy-setup. Если не получится, попробуй распаковать себе прикрепленный flask. 

 

set_vibration - Здесь все было правильно. Потому что код я немного подправил.

def set_vibration(left_motor, right_motor, controller = 0):

Т.е. для вызова достаточно указать (левый, правый). Если третий параметр (контроллер) не указан при вызове, он принимает значение по умолчанию (0). А у тебя в коде сейчас левый всегда 0, а контроллер - число с плавающей точкой.

Что dll исправил хорошо. Всегда в первую очередь смотри что пишется в python.log

Share this post


Link to post

Short link
Share on other sites

 

 

Да забыл, flask нужно установить сначала. Либо скачай с сайта (ссылка выше) и запусти "python.exe setup.py install", но там по-моему сначала нужно также установить easy-setup. Если не получится, попробуй распаковать себе прикрепленный flask. 

Подскажи пожалуйста версия Python какая нужна, под 2.7 поставил не отрабатывает, под 2.6 не могу поставить и все. 

Share this post


Link to post

Short link
Share on other sites

Итак, наверное стоит по щагово описать процесс инсталляции тестовых вибраций для геймпада.

 

1. Необходимо установить Python (я ставил последнюю версию), папка пусть будет по-умолчанию "C:\Python27".

 

2. Необходимо установить Flask, я делал по этой инструкции. Качаем файл distribute_setup.py в папку "C:\temp" (например), запускаем консоль "Win+R" - cmd и выполняем команду "C:\Python27\python.exe C:\temp\distribute_setup.py" наблюдаем процесс загрузки нужных файлов в папку "C:\Python27\Scripts", далее в консоли запускаем команды по очереди и наблюдаем их выполнение:

C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Flask

C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Jinja2
C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Werkzeug
C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Virtualenv

 

3. Распаковываем архив из вложения в папку с игрой "X:\Games\World_of_Tanks" (запаковал из своей игры).

 

После запуска Игры появляется окошко консоли Python, которая будет говорить нам о правильности запуска. В самое игре при выстреле будет работать вибрация на Xinput геймпадах следующим образом - 0,25 сек правый двигатель на максимум, левый на 50%, 0,3 сек правый двигатель на 8%, левый на 4%.

 

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

res_mods.7z

Edited by kharlashkin
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

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

Share this post


Link to post

Short link
Share on other sites

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

Интересно, что игра как бы видит вибронакидку (появились её настройки, в настройках WoT), inj3ct0r заметил данный факт. Я пока разбираю все родные эффекты на составляющие (зона/время/сила вибрации), чтобы можно было проверить реальность ощущений и брать данные из родных файлов .uwv..

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

 

 

умножать на 2 8 раз
= умножить на 256 :)

Share this post


Link to post

Short link
Share on other sites

= умножить на 256 :)

Надо спать идти ;) Всё гораздо прозаичнее - значения вибронакидки делим на 255 и умножаем на 65535

Share this post


Link to post

Short link
Share on other sites

Утро вечера мудренее. Запросил у разработчиков схему режимов работы двухмотороной вибронакидки или же разъяснений каким образом ээффекты делят на два мотора, накидка из первого поста.

 

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

Share this post


Link to post

Short link
Share on other sites

Я себе представляю так. Выбираем коэффициенты передачи в левый и правый мотор для каждой из 6 зон накидки и производим нормировку в соответствии с этими коэффициентами.

Например можно выбрать такие (в квадратных скобках указаны коэффициенты передачи в левый и правый моторы соответственно)

K_SIT_LEFT       = [0.333, 0.000]
K_SIT_RIGHT      = [0.333, 0.000]
K_BACK_LOW_LEFT  = [0.167, 0.167]
K_BACK_LOW_RIGHT = [0.167, 0.167]
K_BACK_MID_LEFT  = [0.000, 0.333]
K_BACK_MID_RIGHT = [0.000, 0.333] 

И затем, для этих коэффициентов в процессе тестов подобрать наиболее оптимальные значения

Edited by inj3ct0r

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...