アナログゲームパッドの動作確認プログラム(HSP)を作ってみた。
ミユ「角度(ラジアン2π)と速度(スティックの傾け具合)のベクトルにアナコンのXY座標を変換するサンプルがこちら。
実際のプログラムはもう少しスマートです!
追記:2013-03-14
という事なのでプログラムの方を、式を分断したり余分な代入を加えるなどして対応。実際のプログラムはもう少しスマートです!
#module "analogjoy" #const global JOYINFOEX_SIZE 13 #const JOYINFOEX_SIZEOF 4*JOYINFOEX_SIZE #const JOYINFOEX_FLAG $ff #uselib "winmm.dll" #func _joyGetPosEx "joyGetPosEx" int,var #deffunc joyGetPosEx array JOYINFOEX,int JoyID JOYINFOEX(0)=JOYINFOEX_SIZEOF,JOYINFOEX_FLAG _joyGetPosEx JoyID,JOYINFOEX return #enum global ANALOG_LX =2 #enum global ANALOG_LY #enum global ANALOG_RX #enum global ANALOG_RY #const global ANALOG_CENTER 32767 #enum global ANALOG_BUTTON =8 #enum global ANALOG_NKEY #enum global ANALOG_POV #global #const TRUE (1+1=2) #const FALSE (2+2=5) #enum WINID_MAIN =0 #enum WINID_BUFF #const MAIN_W 512 #const MAIN_H 256 #const CIRCLE_RAD MAIN_H/3 dim joydata,JOYINFOEX_SIZE ddim analogx,2: ddim analogy,2: ddim analogc,2: ddim analogr,2 rad=0.0 dim threeposx,2: threeposx(0)= MAIN_W/3*1,MAIN_W/3*2 dim threeposy,2: threeposy(0)= MAIN_H/2 ,MAIN_H/2 dim mesposy,2: mesposy(0) = 0 ,MAIN_H-20 dim mesposx,2: mesposx(0) = 0 ,MAIN_W-50 dim kanamap,2: sdim kanamapstr,2: ddim kanamaplen,2 dim kanalog,2: kanalog(0)=0,0 kanamap(0)="abcdefghijklnopqrstuvwxyz" kanamap(1)="ABDEGHJKLMNOPSTWY" repeat 2 kanamaplen(cnt)=strlen(kanamap(cnt))/2.0+1.0 kanamapstr(cnt)=strmid(kanamap(cnt),kanalog(cnt)*2,2) loop screen WINID_MAIN,MAIN_W,MAIN_H: gmode gmode_mem,MAIN_W,MAIN_H title "analogjoy test" buffer WINID_BUFF,MAIN_W,MAIN_H: gmode gmode_mem,MAIN_W,MAIN_H *main gsel WINID_BUFF: color 255,255,255: boxf: color 1,1,1 joyGetPosEx joydata,0 analogx(0)=joydata(ANALOG_LX)-ANALOG_CENTER analogy(0)=joydata(ANALOG_LY)-ANALOG_CENTER analogx(1)=joydata(ANALOG_RX)-ANALOG_CENTER analogy(1)=joydata(ANALOG_RY)-ANALOG_CENTER repeat 2 analogc(cnt)=atan(analogx(cnt),analogy(cnt)) analogr(cnt)=sqrt(powf(analogx(cnt),2)+powf(analogy(cnt),2)) if( analogr(cnt)>0 ){ if( absf(analogy(cnt))<absf(analogx(cnt)) ){ rad=analogy(cnt)/analogx(cnt) } else{ rad=analogx(cnt)/analogy(cnt) } analogr(cnt)=sqrt(powf(analogx(cnt),2)+powf(analogy(cnt),2)) analogr(cnt)/=sqrt(1.0+powf(rad,2)) analogr(cnt)=limitf(analogr(cnt),0,ANALOG_CENTER) rad=CIRCLE_RAD*analogr(cnt)/ANALOG_CENTER x=threeposx(cnt): y=threeposy(cnt) pos x,y line x+sin(analogc(cnt))*rad,y+cos(analogc(cnt))*rad kanalog(cnt)=abs((analogc(cnt)-M_PI)*kanamaplen(cnt)/M_PI/2.0) kanalog(cnt)=limit(kanalog(cnt),0,strlen(kanamap(cnt))/2-1) kanamapstr(cnt)=strmid(kanamap(cnt),kanalog(cnt)*2,2) } x=threeposx(cnt)-CIRCLE_RAD: y=threeposy(cnt)-CIRCLE_RAD circle x,y,x+CIRCLE_RAD*2,y+CIRCLE_RAD*2,FALSE pos 0,mesposy(cnt) // mes strf("X%+06d,Y%+06d θ%+3.6f,S%+06d") xycs= strf("X%+06d",analogx(cnt)) xycs+=strf("Y%+06d ",analogy(cnt)) xycs+=strf("θ%+3.6f",analogc(cnt)) xycs+=strf("S%+06d",analogr(cnt)) mes xycs pos mesposx(cnt),MAIN_H/2 mes strf("%s(%d)",kanamapstr(cnt),kanalog(cnt)+1) loop pos 0,mesposy(0)+20 mes strf("POV=%05d",joydata(ANALOG_POV)) pos 0,mesposy(1)-20 // mes strf("BUTTON=%05d[%02d]") xycs= strf("BUTTON=%05d",joydata(ANALOG_BUTTON)) xycs+=strf("[%02d]",joydata(ANALOG_NKEY)) mes xycs gsel WINID_MAIN: pos 0,0: gcopy WINID_BUFF redraw 1: redraw 0: wait 2 goto *main
はてな記法上cppでシンタックスハイライトですがHSPのソースコードです。
実行するとこんな感じ。四角いXY軸を円く収めまっせ的な。
」