Отправить состояние Xinput другому контроллеру через сокеты и передать его программе

Так что, на самом деле, мне очень нравится играть в DS3 с друзьями всего одну игру, и каждый раз, когда кто-то умирает, контроллер переходит к следующей такой типичной кушетке. Но часто у нас нет времени посещать друг друга, поэтому единственным вариантом будет онлайн-депутат. Поскольку мне это не очень нравится, и у моих друзей в основном нет DS3, я хотел создать программу с XInput, которая постоянно получает состояние контроллеров и отражает его для другого через WinSockets, чтобы мои друзья могли управлять моей игрой через свой контроллер. Я уже написал небольшой код для класса контроллера с некоторыми базовыми функциями, чтобы лучше узнать XInput. Теперь мои вопросы: DS3 использует XInput или DInput? И так или иначе, как мне заставить DS3 интерпретировать мои данные? Я надеюсь, что этот опрос достаточно специфичен.

Если необходимо, вот мой код:

#pragma once

#include <iostream>
#include <Windows.h>
#include <Xinput.h>
#include <limits.h>
#include <time.h>

using namespace std;

class Ctimer
{
private:
clock_t cur_time;
clock_t last_time;

public:
Ctimer() {
cur_time = last_time = clock();
}
void update() {
cur_time = clock();
}
void reset() {
last_time = cur_time;
}
clock_t GetElapsed() {
return cur_time - last_time;
}
};class CPad
{
private:
int DevID = -1;
int dwPacketNumber_last;
int vibration_duration;
bool vibrate = 0;
Ctimer vibration_timer;
XINPUT_VIBRATION vibration;
public:
XINPUT_STATE state;

CPad();
bool CheckInput();
void SetVibration(int lMotor, int rMotor, int vibration_duration);
void ProcVibration();
void UpdateVibrationTimer();
};
#include "CPad.h"
CPad::CPad()
{
for (int i = 0; i < XUSER_MAX_COUNT; i++)
{
XINPUT_STATE tmp;
ZeroMemory(&tmp, sizeof(XINPUT_STATE));
if (XInputGetState(i, &tmp) == ERROR_SUCCESS)
{
DevID = i;
state = tmp;
}
}
if (DevID == -1)
{
cerr << "Error: couldn't find Controller" << endl;
delete(this);
exit(1);
}

dwPacketNumber_last = state.dwPacketNumber;
}

bool CPad::CheckInput()
{
dwPacketNumber_last = state.dwPacketNumber;
XInputGetState(DevID, &state);

if (dwPacketNumber_last != state.dwPacketNumber)
{
dwPacketNumber_last = state.dwPacketNumber;
return true;
}
else
{
return false;
}
}

void CPad::SetVibration(int lMotor, int rMotor, int vibration_duration)
{
this->vibration_duration = vibration_duration;
vibrate = true;

vibration.wLeftMotorSpeed = lMotor;
vibration.wRightMotorSpeed = rMotor;

XInputSetState(DevID, &vibration);
}

void CPad::ProcVibration()
{
if (vibrate)
{
if (vibration_timer.GetElapsed() > vibration_duration)
{
vibration_timer.reset();
vibrate = false;

vibration.wLeftMotorSpeed = 0;
vibration.wRightMotorSpeed = 0;

XInputSetState(DevID, &vibration);
}
}
}

void CPad::UpdateVibrationTimer()
{
vibration_timer.update();
}
#include "CPad.h"
int main(int argc, char **argv)
{
bool run = true;

CPad pad;

while (run)
{
pad.ProcVibration();
pad.UpdateVibrationTimer();

if (pad.CheckInput())
{
switch (pad.state.Gamepad.wButtons)
{
case(XINPUT_GAMEPAD_A):
{
cout << "Pressed A" << endl;
pad.SetVibration(INT_MAX, INT_MAX, 300);
break;
}
case(XINPUT_GAMEPAD_BACK):
{
run = false;
break;
}
}
}

}

return 0;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]