ลองเขียน joy2key ด้วย python

สืบ​เนื่องจาก​​ได้​ไปทำ​การซื้อ joypad ของ dragon มา​ใช้ พบว่าสำ​หรับบาง​เกมที่มี​ใน ubuntu มัน​ใช้ joypad บังคับ​ไม่​ได้ หลาย​คนบอกว่า​ให้ลอง qjoypad ดูดิ ​แต่ qjoypad ​เลื่อน​เมาส์​​แบบกระ​ตุก ​และ​ ตั้ง axis ​เป็น wheel ​ไม่​ได้ จึงลอง​เขียน​ดู​เองด้วย​ python ต้องการ pygame ​และ​ python-xlib

Feature

  1. smooth mouse
  2. mouse force
  3. hold button

Next release

  1. GUI
  2. Profile
  3. Application detect
  4. Multikey command

import pygame
import math
from Xlib import X, XK, display
import Xlib.ext.xtest
from pygame import locals
display = display.Display()
pygame.init()
pygame.joystick.init()
try:
    j=pygame.joystick.Joystick(0)
    j.init()
    print "Enable joytick: ", j.get_name()
    print "Joy num axis: ", j.get_numaxes()
    print "Joy num button: ", j.get_numbuttons()
    print "Joy num hat: ", j.get_numhats()
    ButtonEvent = [0  ,0 ,0 ,0,0,0,0,1 ,0 ,0 ,0 ,0] #0 key 1 mouse click 2 mouse moveX 3 mouse move Y
    ButtonKey   = [25,40,39,38,37,64,65,2,9,36,124,129] #keycode or mosecode or direction
    ButtonHold  = [False,False,False,False,False,False,False,False,False,False,False,False]
    ButtonFlag = [1,1,1,1,1,1,1,1,1,1,1,1]
    AxisHold = [False,False,False,False,False]
    AxisEvent = [2,3,-1,1,1]
    AxisKeyP = [50,50,0,3,5]
    AxisKey = [50,50,0,3,4]
    AxisKeyM = [-50,-50,0,1,4]
    AxisHoldT = [0,0,0,0,0]
    AxisFlag = [1,1,1,1,2] #0 press 1 holdable 2 holduntil press again
    HatHold =[False,False,False,False]
    HatEvent = [0,0,0,0]
    HatKey = [98,104,100,102]
    HatFlag = [1,1,1,1]
    root = display.screen().root

except pygame.error:
    print "no joystick found."

def pressButton(key):
    Xlib.ext.xtest.fake_input(display, X.KeyPress, key)
    display.sync()
def releaseButton(key):
    Xlib.ext.xtest.fake_input(display, X.KeyRelease, key)
    display.sync()
def moveMouse(numX,numY,T):
    PointerData = display.screen().root.query_pointer()._data
    PointX = PointerData["root_x"]
    PointY = PointerData["root_y"]
    print "T",T
    if(numX > 0.00001):
        PointX += (numX<strong>13)*T
    elif(numX < -0.00001):
        PointX += (numX</strong>13)*T
    if(numY>0.00001):
        PointY += (numY<strong>13)*T
    if(numY<-0.00001):
        PointY += (numY</strong>13)*T
    root.warp_pointer(int(PointX),int(PointY))
    display.sync()
def clickMouse(button):
    Xlib.ext.xtest.fake_input(display, X.ButtonPress, button)
    display.sync()
def releaseMouse(button):
    Xlib.ext.xtest.fake_input(display, X.ButtonRelease, button)
    display.sync()
while 1:
    pygame.time.wait(10)
    focus = display.get_input_focus()
    nX =0
    nY =0
    cX = 0        
    cY = 0
    cT = 0
    for i in range(j.get_numaxes()):
        if AxisHold[i]:
            if AxisEvent[i]==2:
                nX += 1.0
                cX += j.get_axis(i)
                cT += AxisHoldT[i]
            elif AxisEvent[i]==3:
                nY += 1.0
                cY += j.get_axis(i)
                cT += AxisHoldT[i]
            if AxisEvent[i]==1 and AxisHold[i] == True and AxisFlag[i]==2:
                clickMouse(AxisKey[i]);
                releaseMouse(AxisKey[i]);
           
            AxisHoldT[i] +=1
           
    if cX != 0:
        cX /= nX
    if cY !=0:
        cY /= nY
    if cX!=0 or cY != 0:
        moveMouse(cX,cY,cT)
    for e in pygame.event.get():
        if e.type == pygame.locals.JOYAXISMOTION:
            for i in range(j.get_numaxes()):
                if(j.get_axis(i)!=0):
                    if j.get_axis(i)>0:
                        AxisKey[i] = AxisKeyP[i]
                    else:
                        AxisKey[i] = AxisKeyM[i]
                    if AxisHold[i]==False:
                        if AxisEvent[i]==0:
                            pressButton(AxisKey[i])
                        elif AxisEvent[i]==1:
                            clickMouse(AxisKey[i])
                            if AxisFlag[i]!=1:
                                releaseMouse(AxisKey[i])
                        AxisHoldT[i]=0
                        AxisHold[i]=True
                else:
                    if AxisHold[i]:
                        if AxisEvent[i]==0:
                            releaseButton(AxisKey[i])
                        elif AxisEvent[i]==1  and AxisFlag[i]==1:
                            releaseMouse(AxisKey[i])
                    AxisHold[i]=False
        elif e.type == pygame.locals.JOYBUTTONDOWN:
            for i in range(j.get_numbuttons()):
                if(j.get_button(i)):              
                    if ButtonEvent[i]==0:
                        pressButton(ButtonKey[i])
                        #releaseButton(ButtonKey[i])
                    elif ButtonEvent[i]==1:
                        clickMouse(ButtonKey[i])
                        #releaseMouse(ButtonKey[i])
                    ButtonHold[i]=True
        elif e.type == pygame.locals.JOYBUTTONUP:
            for i in range(j.get_numbuttons()):
                if((j.get_button(i)==0) and ButtonHold[i]):
                    if ButtonEvent[i]==0:
                        releaseButton(ButtonKey[i])
                    elif ButtonEvent[i]==1:
                        releaseMouse(ButtonKey[i])
                    ButtonHold[i]=False
        elif e.type == pygame.locals.JOYHATMOTION:
            if(j.get_hat(0)[0]>0):
                if(HatHold[0]==False):
                    if HatEvent[0]==0:
                        pressButton(HatKey[0])
                    elif HatEvent[0]==1:
                        clickMouse(HatKey[0])
                    HatHold[0]=True
                if(HatHold[1]==True):
                    if HatEvent[1]==0:
                        releaseButton(HatKey[1])
                    elif HatEvent[1]==1:
                        releaseMouse(HatKey[1])
                    HatHold[1]=False
            if(j.get_hat(0)[0]<0):
                if(HatHold[1]==False):
                    if HatEvent[1]==0:
                        pressButton(HatKey[1])
                    elif HatEvent[1]==1:
                        clickMouse(HatKey[1])
                    HatHold[1]=True
                if(HatHold[0]==True):
                    if HatEvent[0]==0:
                        releaseButton(HatKey[0])
                    elif HatEvent[0]==1:
                        releaseMouse(HatKey[0])
                    HatHold[0]=False
            if(j.get_hat(0)[0]==0):
                if(HatHold[0]==True):
                    if HatEvent[0]==0:
                        releaseButton(HatKey[0])
                    elif HatEvent[0]==1:
                        releaseMouse(HatKey[0])
                    HatHold[0]=False
                if(HatHold[1]==True):
                    if HatEvent[1]==0:
                        releaseButton(HatKey[1])
                    elif HatEvent[1]==1:
                        releaseMouse(HatKey[1])
                    HatHold[1]=False
            if(j.get_hat(0)[1]>0):
                if(HatHold[2]==False):
                    if HatEvent[2]==0:
                        pressButton(HatKey[2])
                    elif HatEvent[2]==1:
                        clickMouse(HatKey[2])
                    HatHold[2]=True
                if(HatHold[3]==True):
                    if HatEvent[3]==0:
                        releaseButton(HatKey[3])
                    elif HatEvent[3]==1:
                        releaseMouse(HatKey[3])
                    HatHold[1]=False
            if(j.get_hat(0)[1]<0):
                if(HatHold[3]==False):
                    if HatEvent[3]==0:
                        pressButton(HatKey[3])
                    elif HatEvent[3]==1:
                        clickMouse(HatKey[3])
                    HatHold[3]=True
                if(HatHold[2]==True):
                    if HatEvent[2]==0:
                        releaseButton(HatKey[2])
                    elif HatEvent[2]==1:
                        releaseMouse(HatKey[2])
                    HatHold[2]=False
            if(j.get_hat(0)[1]==0):
                if(HatHold[2]==True):
                    if HatEvent[2]==0:
                        releaseButton(HatKey[2])
                    elif HatEvent[2]==1:
                        releaseMouse(HatKey[2])
                    HatHold[2]=False
                if(HatHold[3]==True):
                    if HatEvent[3]==0:
                        releaseButton(HatKey[3])
                    elif HatEvent[3]==1:
                        releaseMouse(HatKey[3])
                    HatHold[3]=False

0
Your rating: None