Jump to content
Oovee® Games
MarijnS95

[tutorial]Using/customizing multiple controllers

Recommended Posts

What is this?
In this topic I will cover the setup and usage of vJoy and FreePIE. vJoy is a virtual controller, which we will have to feed with data (eg, its X and Y position). We will feed this data with another program that's called FreePIE. FreePIE supports a large number of input devices, which you can all route to one joystick, to control spintires.
 
Installation:
So first you want to download and install those. First get vJoy, and then FreePIE. You can also find the list of supported input hardware on that page.
 
Setting up vJoy:
So now you have both installed, go to your start menu and start a program called Configure vJoy. Start this. Here you can set all kinds of stuff for vJoy. Just leave it at what it is right now and click ok. You should hear the windows 'device connected' sound.
 
Writing your feeder application:
This is the most difficult step. You now actually need to code your program. Before we start, take a look at the 'FreePIE wiki'. Here you can find basic information about programming your feeder.
Now we need a place to put our code. This is FreePIE. Start it from your start menu. You will see an empty menu. you first need to 'make' a new file. Therefore, press ctrl+N on your keyboard or click file->new... That should do.
freepie.png
Some basic tips on the program: You can start and stop your program by pressing F5 and Shift+F5 respectively. When your program is being executed, you will not be able to edit the code. It will be greyed out.
Another tip: you can log variables (more on that later), the output will be in the Watch tab below. Errors will be in the errors tab. You can also print variables and text to the console screen.
Third tip: While writing your program, make sure you have vJoy monitor running in the background. You will be able to see exactly all values of every axis and button. This makes debugging and seeing if your program works so much more easy.
 
You will write the feeder in a programming language called python. This is wide known, so you will be able to find a lot of (syntax) examples on the internet. I repeat: Google is your best friend!

Now we know that, lets start with a little info on arrays. Every device will be in an array. The first element of an array will be number 0. So if we want to access the first vJoy device (you can see this in the monitor as vJoy device #1), this will be under vJoy[0].
 
You might be asking yourself, when will we start to write something? Well, right now:



if starting:
    variable = 1;

The code will work in blocks. These blocks are created by using indentation (tab characters). Everything having a one more indentation after an if statement will be exectuted when the condition is true. The if starting: is only executed when you start your program. Thus, you will be using if starting  for defining variables. You might want to put your device variables here, and your sensitivity constants.
Below is a piece of code to let your mouse left and right movements be steering, and up and down be throttle/brake:

if starting:
    dev = 0# fill in your device number here (but make sure you do it -1. So if you have vJoy device #1 enter 0)
    sensX = 40#sensitivity
    sensY = 40
    x = 0
    y = 0
    mouse.update += update
 
x += mouse.deltaX * sensX
y -= mouse.deltaY * sensY
vJoy[dev].x = x
vJoy[dev].y = y
 

So how does this work? On the bottom we define our variables, and set the starting positions for our x and y coordinates. You want the x coordinate to be at the center, so your steer is centered. The y coordinate needs be in the center too. Making it a negative value, your truck will brake, and making it positive will do the throttle.
Below, we define the code that will run every cycle:
mouse.deltaX is the difference in x position between now and the previous time this code ran. As these values are pretty low, we multiply it by our sensitivity variable, so you don't need 10 meters of mouse movement to have your truck steer to the left or right. As this value is just a difference, we want to add it up to our original x position variable. The same is for y, but we substract it to invert the behaviour.
Then last but not least, we set the x and y positions of the joystick to the variables we calculated.
Now, this code is still missing a little bit. What if you get to the maximum of the virtual joystick? For this we will use the following piece of code:

if starting:
dev = 0 # fill in your device number here (but make sure you do it -1. So if you have vJoy device #1 enter 0)
sensX = 40 #sensitivity
sensY = 40
max = vJoy[0].axisMax
min = -vJoy[0].axisMax
x = 0
y = min

x += mouse.deltaX * sensX
y -= mouse.deltaY * sensY

if (x > max):
x = max
elif (x < min):
x = min

if (y > max):
y = max
elif (y < min):
y = min

vJoy[dev].x = x
vJoy[dev].y = y

This is it for now. Homework is figuring out what above code does ;)

Setting up SpinTires:
Start spintires, and go to controls. There, on the top, click on wheel and then select vJoy virtual joystick (iirc) from the right list. Now define all your axes and buttons like you normally would.
 
Finding out axes and buttons:
Sadly we can't just iterate through these values. Even making a simple loop to watch each button doesn't work. So the easiest is to copy the following piece of code, where dev is the id of your device, and x is the button number. Paste this line multiple times (and change the x) to get multiple buttons.

diagnostics.watch(joystick[dev].getDown(x));

Then on the bottom of the program go to the tab 'watch' and you should see al the output there.
Same is for the axes. However these work with names. All the names are below:

diagnostics.watch(joystick[dev].x);
diagnostics.watch(joystick[dev].xRotation);
diagnostics.watch(joystick[dev].y);
diagnostics.watch(joystick[dev].yRotation);
diagnostics.watch(joystick[dev].z);
diagnostics.watch(joystick[dev].zRotation);

All the other axes are in the sliders. You can find how many sliders you have with this:

diagnostics.watch(len(joystick[dev].sliders));

... and watch them like this:

diagnostics.watch(joystick[dev].sliders[x]);

... where x is the slider you want to watch. (remember this is an array, like I explained on top).

Setting ranges:
Not all devices have the same range. For instance, one device will output values between -100 and 100, some will between -1000 and 1000. To make this easy, use the following piece of code:

 joystick[dev].setRange(-vJoy[0].axisMax, vJoy[0].axisMax);

This will make FreePIE automatically calculate this for you, so that when your axis is on min or max, it will output the minimum or maximum VJoy is capable of. of course you can fiddle with this, and make one of the values 0 and such.

Force feedback:
... is currently not supported. However the developer of vJoy got it to work about a week ago: http://vjoystick.sourceforge.net/site/index.php/forum/5-Discussion/863-vjoy-force-feedback-is-ready-for-testing
Now we just need to wait for it to stabilize, and for FreePIE to support this (or you guys need to write your own feeder application).
 
I hope you enjoyed this tutorial. Let me know if you miss something or need clarification.
 
This list is for myself, to remember what I still need to add to this tutorial:

  • Buttons
  • Input controllers in general (and using multiple of them, detecting which input corresponds to which number, etc)
  • FreePIE filters

Scripts:
In this section I'll put some ready-to-use scripts.

Control crane with joystick:


You can only use the crane when the advanced menu is open and the crane (.3) is selected.
It will use the standard vehicle keyboard controls. Using FreePIE I made my joystick control these keys:






if starting:
	lim = 1000;
	i=2;
	joystick[i].setRange(-lim,lim)
	
keyboard.setKey(Key.Q, joystick[i].x > lim/2); #crane down (move left)
keyboard.setKey(Key.E, joystick[i].x < -lim/2); #crane up (move right)

keyboard.setKey(Key.S, joystick[i].y > lim/2); #crane closer (move backward)
keyboard.setKey(Key.W, joystick[i].y < -lim/2); #crane further (move forward)

keyboard.setKey(Key.A, joystick[i].zRotation < -lim/2); #rotate left
keyboard.setKey(Key.D, joystick[i].zRotation > lim/2); #rotate right

keyboard.setKey(Key.D4, joystick[i].getDown(0)); #grappler

It will activate a key when the axis is halfway. (actually, a quarter). Of course you can also 'map' your joystick buttons to the keyboard and such. The above example does not have the grappler rotate in it (which are the buttons R and T).



Sequential shift on keyboard:


You need to map buttons ingame. The sequential shift will activate these buttons. Button 7 corresponds to -1, and so on. (you can open the 'watch' tab on FreePIE to see the gear it is in) To do this easily, shift up once (default key is A), to tell FreePIE to put it in gear 0. Now in on the controller options, Check manual gearbox with clutch, and click on 'reverse'. Now shift down (key Z). Button 7 should now be mapped to 'reverse'. Now shift up once, and click 1st gear, then shift up another time. Button 9 should be assigned to 1st gear. Click second gear, shift up, and repeat this process.
Now for the clutch, click on clutch and press shift. Now clutch should be set. If you're done it should look like this:
Ar4jKl5.png
You can change the variable autoclutch to true, to change gears without the use of shift...

Don't forget to set the maximum button in vJoy configure to 15![/i]

import time
if starting:
	dev = 0;
	gear = 0;
	AutoClutch  = False;
	max	=  vJoy[0].axisMax;
	min	= -vJoy[0].axisMax;
	GearOffset = 8; # 7 = reverse, 8 = neutral, 9 = 1 etc

#sequential shift part
if(keyboard.getPressed(Key.A)): #shift up
	if(gear != 6):
		change(gear, 1);
		gear = gear + 1;

if(keyboard.getPressed(Key.Z)): #shift down
	if(gear != -1):
		change(gear, -1);
		gear = gear - 1;
		
diagnostics.watch(gear)
if(gear != 0):
	vJoy[dev].setButton(GearOffset+gear, True)

if(AutoClutch):
	time.sleep(0.1)
vJoy[dev].z = min + 2*max*int((keyboard.getKeyDown(Key.LeftShift) or (gear == 0 and AutoClutch))) #Z is the clutch key

def change(x, add):
	if(AutoClutch):
		vJoy[dev].z = max
		time.sleep(0.1+0.2*int((x+add==0)))
	vJoy[dev].setButton(GearOffset+x, False)

 



Xbox with sequential shift:


You want to set this up exactly the same like the keyboard sequential shift, but then using the buttons described here. Left thumb is for clutch, D-pad up is for upshift and D-pad down is for downshift.
You need to map the other buttons yourself. Feel free to ask any question.

if starting:
	dev = 0;
	xdev = 0;
	gear = 0;
	max	=  vJoy[0].axisMax
	min	= -vJoy[0].axisMax
	GearOffset = 7;
	up = False;
	down = False;
	
vJoy[dev].x = xbox360[xdev].rightTrigger; #accelerate
vJoy[dev].z = xbox360[xdev].leftTrigger;	#brake
vJoy[dev].y = xbox360[xdev].leftStickY; #steering

#buttons, feel free to map them yourself
vJoy[dev].setButton(0, xbox360[xdev].a);
vJoy[dev].setButton(1, xbox360[xdev].B);
vJoy[dev].setButton(2, xbox360[xdev].x);
vJoy[dev].setButton(3, xbox360[xdev].y);
vJoy[dev].setButton(4, xbox360[xdev].leftShoulder);
vJoy[dev].setButton(5, xbox360[xdev].rightShoulder);

#sequential shift part
if(xbox360[xdev].up): #shift up
	up = True;
elif(up):
	up = False;
	if(gear != 6):
		vJoy[dev].setButton(GearOffset+gear, False)
		gear = gear + 1;

if(xbox360[xdev].down): #shift down
	down = True;
elif(down):
	down = False;
	if(gear != -1):
		vJoy[dev].setButton(GearOffset+gear, False)
		gear = gear - 1;

if(gear != 0):
	vJoy[dev].setButton(GearOffset+gear, True) 

if(AutoClutch):
	time.sleep(0.1)
vJoy[dev].z = min + 2*max*int((xbox360[xdev].leftThumb or (gear == 0 and AutoClutch))) #left thumb to activate clutch

def change(x, add):
	if(AutoClutch):
		vJoy[dev].z = max
		vJoy[dev].y = min
		time.sleep(0.1+0.2*int((x+add==0)))
	vJoy[dev].setButton(GearOffset+x, False)

 

 

 

Disclaimer:

I wrote this tutorial in my free time, to help you guys out. Don't see this as an official fix for controller issues/missing features in the game, we don't ask players to fix this themselves by writing Python (some users at the Steam forums think we do). Anyway, this tutorial was written by me before I was a moderator.

Edited by MarijnS95
Added disclaimer, had to do this a long long time ago
  • Like 7

Share this post


Link to post
Share on other sites

Thanks for this, I greatly appreciate you doing the legwork to find this workaround.

 

Stupid question: haven't worked with any of this before, so not sure how to actually find the appropriate axis names from assorted DirectInput devices. The second bullet note you wrote for yourself would help me greatly.

 

In my case, I have a wheel with one rotational axis and 17 buttons, pedals with 3 axes, and a shifter with 8 buttons that I want to combine into one vJoy device. Not sure how to say 

vJoy[dev].x = (joystick[<device number>].<axis>)

or

vJoy[dev].button1 = (joystick[<device number>].<button>) 

 since I'm not sure the name of, say, the steering axis on the wheel, or which button corresponds to which number. I can figure out the device numbers through trial and error easily enough, but how to determine the names of axes/buttons?

 

Also I'm able to successfully map pedal axes, but they only move the corresponding bars in the monitor a small amount. How do I define 0/100% of the movement?

 

Last question, will doing this affect FFB?

 

Thanks again for your help!

Edited by rwb

Share this post


Link to post
Share on other sites

Thanks for this, I greatly appreciate you doing the legwork to find this workaround.

 

Stupid question: haven't worked with any of this before, so not sure how to actually find the appropriate axis names from assorted DirectInput devices. The second bullet note you wrote for yourself would help me greatly.

 

In my case, I have a wheel with one rotational axis and 17 buttons, pedals with 3 axes, and a shifter with 8 buttons that I want to combine into one vJoy device. Not sure how to say 

vJoy[dev].x = (joystick[<device number>].<axis>)

or

vJoy[dev].button1 = (joystick[<device number>].<button>) 
 since I'm not sure the name of, say, the steering axis on the wheel, or which button corresponds to which number. I can figure out the device numbers through trial and error easily enough, but how to determine the names of axes/buttons?

 

Also I'm able to successfully map pedal axes, but they only move the corresponding bars in the monitor a small amount. How do I define 0/100% of the movement?

 

Last question, will doing this affect FFB?

 

Thanks again for your help!

 

You're welcome!

And hey, forgot to say to you that I updated the post with some more info.

I already fiddled some with a workaround for FFB. Sadly I have not yet figured it out.

Share this post


Link to post
Share on other sites

Thx Hein :)

Actually had fun researching and writing it, with the potential of stopping people asking how to use multiple controllers. I should probably include another post on how I used my joystick to control the crane...

  • Like 1

Share this post


Link to post
Share on other sites

Thanks for the updates Marjin!

 

I will admit I cannot get the syntax right to map the buttons I discovered using your instruction, but honestly the urgency is lessened knowing that FFB won't work through this yet.

 

Still hoping they can implement multiple input devices natively; so far I've spent a couple evenings working in a programming language I don't know when I just wanted to play Spintires!  :D Haven't put this much effort into getting a game working in a long time. Unfortunately it doesn't look like I'll be able to play for a while as I just don't have the time to learn how to build an FFB feeder from scratch, and without FFB, feel like I may as well use a gamepad.

 

That said, might still hammer away anyway just for the sake of learning a little python, if you feel like explaining how to map buttons. Trying 

vJoy[dev].setButton(0, joystick[1].0)

but this is wrong. I've probably missed several steps as working with the boolean values doesn't seem as simple as axis state integers...

Edited by rwb

Share this post


Link to post
Share on other sites

Thanks for the updates Marjin.

 

I will admit I cannot get the syntax right to map the buttons I discovered using your instruction, but honestly the urgency is lessened knowing that FFB won't work through this yet.

 

Still hoping they can implement multiple input devices natively; so far I've spent a couple evenings working in a programming language I don't know when I just wanted to play Spintires!  :D Haven't put this much effort into getting a game working in a long time. Unfortunately it doesn't look like I'll be able to play for a while as I just don't have the time to learn how to build an FFB feeder from scratch, and without FFB, feel like I may as well use a gamepad.

 

That said, might still hammer away anyway just for the sake of learning a little python, if you feel like explaining how to map buttons. Trying 

vJoy[dev].setButton(0, joystick[1].0)

but this is wrong. I've probably missed several steps as working with the boolean values doesn't seem as simple as axis state integers...

Yesh, I don't have that time too. Probably waiting for updates.

Change the .0 to .getDown(0). That will return true when button0 is pressed, and false when button0 is depressed.

Share this post


Link to post
Share on other sites

OMG ! if i am reading correctly and did not misunderstand this i can actually have a Clutch now on my controller for Spintires ?

 

 

Thanks for this MArijn ! Awesome info and instructions i will be trying this out as soon as i restore my PC.

Share this post


Link to post
Share on other sites

Correct, you can use the clutch :)

Be aware though that the high customizability makes it hard to use. If you have an Xbox controller you can easily copy paste the script to FreePIE, set AutoClutch to False, adapt the controls to your liking and play. If you use another controller, it probably utilizes the joystick interface.

If you're having trouble figuring out, feel free to ask. Don't forget to mention how you want your controller to be set up :)

  • Like 2

Share this post


Link to post
Share on other sites

Amazing ! I am so excited that we can use clutch, the more complicated things are for me the more fun i find it to be :) .

 

I will be trying this very very soon and will post update for the test you asked about in the other thread. 

 

Thanks so much Marijn.

 

Regards :)

Share this post


Link to post
Share on other sites

zenon plz remember you will lose FFB if using a wheel- personally this is why I have not done this and am waiting for multiple controller support to be confirmed by Oovee.

 

Not to sound bitter, but I'd think the hardcore sim fans who would buy customized simulator setups would be a primary audience for this game.

Edited by rwb

Share this post


Link to post
Share on other sites

Yes i understand and i love FFB but not as much as Clutch , i would trade FFB for clutch anyday :) however my PC situation has not gotten better idk if my HDD is going bad or what but this is my 3rd reformat. Something i install or download maybe even an update im thinking is messing up my PC when it connects to the internet.

 

I already ordered another TB HDD from WD so i will see if it is my HDD or something else. 

 

Because of these problems i have to postpone the installation of this software till i can get my PC fixed.

Share this post


Link to post
Share on other sites

Checked S.M.A.R.T. disk info? Probably a bad sector...

 

Will do , and if it helps after initial format it is running superb. then i do all the windows updates and regular installation of my other software antivirus etc that i usually run and it gets all laggy only when i connect to the internet, if i am offline it is superb again flawless no lag at all. 

 

Now on this reformat i am going to document every install and update so maybe i can find the culprit.

Share this post


Link to post
Share on other sites

I can't figure out how to disable AutoClutch, and it's tossing an error too saying it's not defined. Help?

 

Also, throttle seems to be stuck and nothing works.

Edited by billbertking1

Share this post


Link to post
Share on other sites

I can't figure out how to disable AutoClutch, and it's tossing an error too saying it's not defined. Help?

 

Also, throttle seems to be stuck and nothing works.

Set AutoClutch to false, eg AutoClutch = False;

 

however I'm not sure if the whole autoclutch thingy still works, with 'recent' changes to the mechanism. you'd better use this one:

 

import time
if starting:
	dev = 0;
	gear = 0;
	max	=  vJoy[0].axisMax;
	min	= -vJoy[0].axisMax;
	vJoy[dev].x = 0;
	vJoy[dev].y = min;
	vJoy[dev].ry = min; #brake
	vJoy[dev].rx = 0;
	GearOffset = 7;
	clutch = min;
	steer = 0;

#sequential shift part
if(keyboard.getPressed(Key.A)): #shift up
	if(gear != 6):
		vJoy[dev].setButton(GearOffset+gear, False)
		gear = gear + 1;

if(keyboard.getPressed(Key.Z)): #shift down
	if(gear != -1):
		vJoy[dev].setButton(GearOffset+gear, False)
		gear = gear - 1;
		

if(gear != 0):
	vJoy[dev].setButton(GearOffset+gear, True)

if(keyboard.getKeyDown(Key.LeftShift)):
	clutch = clutch + 200;
	if(clutch > max):
		clutch = max;
else:
	clutch = clutch - 200;
	if(clutch < min):
		clutch = min;
		
vJoy[dev].z = clutch
diagnostics.watch(clutch)

if(keyboard.getKeyDown(Key.RightArrow)):
	steer = steer - 200;
	if(steer < min):
		steer = min;
elif(keyboard.getKeyDown(Key.LeftArrow)):
	steer = steer + 200;
	if(steer > max):
		steer = max;
else:
	if(steer > 0):
		steer = steer - 200;
		if(steer < 0):
			steer = 0;
	elif(steer < 0):
		steer = steer + 200;
		if(steer > 0):
			steer = 0;
		
vJoy[dev].x = steer;
vJoy[dev].y = min + 2*max*int(keyboard.getKeyDown(Key.UpArrow)) #gas
vJoy[dev].ry = min + 2*max*int(keyboard.getKeyDown(Key.DownArrow)) #brake
vJoy[dev].rx = 0 + max*int(keyboard.getKeyDown(Key.LeftAlt));
diagnostics.watch(gear)
diagnostics.watch(steer)

Share this post


Link to post
Share on other sites

 

Set AutoClutch to false, eg AutoClutch = False;

 

however I'm not sure if the whole autoclutch thingy still works, with 'recent' changes to the mechanism. you'd better use this one:

 

 

if starting:
dev = 0;
gear = 0;
max =  vJoy[0].axisMax;
min = -vJoy[0].axisMax;
vJoy[dev].x = 0;
vJoy[dev].y = min;
vJoy[dev].ry = min; #brake
vJoy[dev].rx = 0;
GearOffset = 7;
clutch = min;
steer = 0;
 
#sequential shift part
if(keyboard.getPressed(Key.A)): #shift up
if(gear != 6):
vJoy[dev].setButton(GearOffset+gear, False)
gear = gear + 1;
 
if(keyboard.getPressed(Key.Z)): #shift down
if(gear != -1):
vJoy[dev].setButton(GearOffset+gear, False)
gear = gear - 1;
 
 
if(gear != 0):
vJoy[dev].setButton(GearOffset+gear, True)
 
if(keyboard.getKeyDown(Key.LeftShift)):
clutch = clutch + 200;
if(clutch > max):
clutch = max;
else:
clutch = clutch - 200;
if(clutch < min):
clutch = min;
 
vJoy[dev].z = clutch
diagnostics.watch(clutch)
 
if(keyboard.getKeyDown(Key.RightArrow)):
steer = steer - 200;
if(steer < min):
steer = min;
elif(keyboard.getKeyDown(Key.LeftArrow)):
steer = steer + 200;
if(steer > max):
steer = max;
else:
if(steer > 0):
steer = steer - 200;
if(steer < 0):
steer = 0;
elif(steer < 0):
steer = steer + 200;
if(steer > 0):
steer = 0;
 
vJoy[dev].x = steer;
vJoy[dev].y = min + 2*max*int(keyboard.getKeyDown(Key.UpArrow)) #gas
vJoy[dev].ry = min + 2*max*int(keyboard.getKeyDown(Key.DownArrow)) #brake
vJoy[dev].rx = 0 + max*int(keyboard.getKeyDown(Key.LeftAlt));
diagnostics.watch(gear)
diagnostics.watch(steer)

 

 

"Expected an indented block" with that one. Also, I'm trying to use Xbox controller on it, and it's missing AutoClutch = Off in xbox version

Edited by billbertking1

Share this post


Link to post
Share on other sites

"Expected an indented block" with that one. Also, I'm trying to use Xbox controller on it, and it's missing AutoClutch = Off in xbox version

Thanks forum, messed up the indentation. Should be good now (edited post).

Share this post


Link to post
Share on other sites

Thanks forum, messed up the indentation. Should be good now (edited post).

 

Alright, got that in. Would it be possible to get the 360 controller version?

Share this post


Link to post
Share on other sites

Alright, got that in. Would it be possible to get the 360 controller version?

Ah I see, the xbox controller code is missing the same line. You'll need to add it somewhere below "is starting:", with 1 tab in front if it. Can't fix it now, on the phone.

Share this post


Link to post
Share on other sites

Ah I see, the xbox controller code is missing the same line. You'll need to add it somewhere below "is starting:", with 1 tab in front if it. Can't fix it now, on the phone.

Did it, no error now. Now, to set it up. Thank you.

Share this post


Link to post
Share on other sites

Hi

 

I have recently got an new shifter, the Trustmaster TH8A to go along with my Logitech G25 because the G25 shifter was broken.
I was really disappointed to find out that I could not use the two of them together.

I would consider myself to be a poweruser and never afraid to do what it takes to get something to work. But the hacks described here and elsewhere is really out of my skill level to implement and also somewhat disruptive if you have other racing sims installed.

 

So I really hope that the developers natively implement the ability to use two separate peripherals together.

  • Like 1

Share this post


Link to post
Share on other sites

Hi

 

I have recently got an new shifter, the Trustmaster TH8A to go along with my Logitech G25 because the G25 shifter was broken.

I was really disappointed to find out that I could not use the two of them together.

I would consider myself to be a poweruser and never afraid to do what it takes to get something to work. But the hacks described here and elsewhere is really out of my skill level to implement and also somewhat disruptive if you have other racing sims installed.

 

So I really hope that the developers natively implement the ability to use two separate peripherals together.

I think most of us hope multiple controllers will be usable simultaneously, though I guess it won't be coming soon.

 

That said, these tricks are no hacks, and simply require one to install 2 programs and copy-paste some code (and alter it to your own liking, but that shouldn't be hard, just telling the program which axes and buttons to use).

Share this post


Link to post
Share on other sites

Bumping this thread because I see vJoy has implemented support for ffb in 2.16.

 

I plan to see if it's easy to just add to the virtual device I already put together a while back, it looks like it might be if vjoy can pass data directly to a device, but want to see if Marjin has tested this out yet?

Edited by rwb

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...