Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
5
Task/Joystick-position/00-META.yaml
Normal file
5
Task/Joystick-position/00-META.yaml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
category:
|
||||
- Hardware
|
||||
from: http://rosettacode.org/wiki/Joystick_position
|
||||
note: Joystick
|
||||
21
Task/Joystick-position/00-TASK.txt
Normal file
21
Task/Joystick-position/00-TASK.txt
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
The task is to determine the joystick position and represent this on the display via a crosshair.
|
||||
For a centred joystick, the crosshair should appear in the centre of the screen.
|
||||
If the joystick is pushed left or right, then the cross hair should move left or right according to the extent that the joystick is pushed.
|
||||
|
||||
If the joystick is pushed forward or pulled back, then the crosshair should move up or down according to the extent that that joystick is pushed or pulled.
|
||||
The edges of the display represent maximum extents for joystick movement.
|
||||
|
||||
For example, a joystick pushed fully forward would raise the crosshair to the top centre of the screen.
|
||||
|
||||
A joystick pulled backwards and to the right would move the crosshair to the bottom right of the screen (except for a small area reserved to show joystick status). Implementations can use a graphical display method to produce the crosshair, or alternatively represent the crosshair using a plus symbol on
|
||||
a terminal, and move the plus symbol position according to the joystick.
|
||||
The bottom part of the display can hide or show an alphanumeric sequence to represent the buttons pressed.
|
||||
|
||||
For example, if pushbuttons 1,4 and 10 are depressed, we could display "1 4 A".
|
||||
|
||||
The implemented code should continue to redraw the crosshair according to the joystick position and show the current pushbutton statuses until the task is terminated.
|
||||
Digital joysticks that produce no extent data, should have their position indicated as full extent movement of the crosshair.
|
||||
|
||||
For the purpose of this task, we assume that the joystick is calibrated and that the first joystick is being used. <br>
|
||||
The task implementer could at their option provide a solution that includes a joystick selection facility, enabling the user to choose which joystick is to be used for this task.
|
||||
|
||||
68
Task/Joystick-position/Action-/joystick-position.action
Normal file
68
Task/Joystick-position/Action-/joystick-position.action
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
BYTE lastStick=[255]
|
||||
BYTE lastTrig=[255]
|
||||
|
||||
PROC DrawCross(BYTE s)
|
||||
BYTE size=[5]
|
||||
CARD x
|
||||
BYTE y
|
||||
|
||||
IF s>=9 AND s<=11 THEN
|
||||
x=size
|
||||
ELSEIF s>=5 AND s<=7 THEN
|
||||
x=159-size
|
||||
ELSE
|
||||
x=79
|
||||
FI
|
||||
|
||||
IF s=6 OR s=10 OR s=14 THEN
|
||||
y=size
|
||||
ELSEIF s=5 OR s=9 OR s=13 THEN
|
||||
y=79-size
|
||||
ELSE
|
||||
y=39
|
||||
FI
|
||||
|
||||
Plot(x-size,y)
|
||||
DrawTo(x+size,y)
|
||||
Plot(x,y-size)
|
||||
DrawTo(x,y+size)
|
||||
RETURN
|
||||
|
||||
PROC UpdateStatus(BYTE currStick,currTrig)
|
||||
IF currStick#lastStick THEN
|
||||
Color=0 DrawCross(lastStick)
|
||||
Color=1 DrawCross(currStick)
|
||||
lastStick=currStick
|
||||
FI
|
||||
|
||||
IF currTrig#lastTrig THEN
|
||||
Print("Button pressed: ")
|
||||
IF currTrig THEN
|
||||
PrintE("no ")
|
||||
ELSE
|
||||
PrintE("yes")
|
||||
FI
|
||||
Put(28) ;move cursor up
|
||||
lastTrig=currTrig
|
||||
FI
|
||||
RETURN
|
||||
|
||||
PROC Main()
|
||||
BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6,
|
||||
CRSINH=$02F0 ;Controls visibility of cursor
|
||||
BYTE currStick,currTrig
|
||||
|
||||
Graphics(7)
|
||||
Color=1
|
||||
COLOR1=$0C
|
||||
COLOR2=$02
|
||||
CRSINH=1 ;hide cursor
|
||||
|
||||
DO
|
||||
currStick=Stick(0)
|
||||
currTrig=STrig(0)
|
||||
UpdateStatus(currStick,currTrig)
|
||||
UNTIL CH#$FF
|
||||
OD
|
||||
CH=$FF
|
||||
RETURN
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
100 GOSUB 400
|
||||
110 P2 = PDL(2) : IF P2 <> O2 THEN O2 = P2 : VTAB 23 : HTAB 33 : PRINT P2; TAB(37);
|
||||
120 B2 = FNB(2) : IF B2 <> N2 THEN N2 = B2 : VTAB 24 : HTAB 15 : PRINT P$(B2);
|
||||
130 P3 = PDL(3) : IF P3 <> O3 THEN O3 = P3 : VTAB 23 : HTAB 37 : PRINT P3; : CALL -868
|
||||
140 X = INT(P3 * RX) : Y = INT(P2 * RY(F))
|
||||
150 O = (X1 = X2 AND Y1 = Y2) + 1
|
||||
160 N = (X = X1 AND Y = Y1) + 1
|
||||
170 IF X <> X2 OR Y <> Y2 THEN XDRAW N AT X, Y : XDRAW O AT X2, Y2 : X2 = X : Y2 = Y : O = N
|
||||
200 P0 = PDL(0) : IF P0 <> O0 THEN O0 = P0 : VTAB 22 : HTAB 33 : PRINT P0; TAB(37);
|
||||
210 B0 = FNB(0) : IF B0 <> N0 THEN N0 = B0 : VTAB 22 : HTAB 15 : PRINT P$(B0);
|
||||
220 P1 = PDL(1) : IF P1 <> O1 THEN O1 = P1 : VTAB 22 : HTAB 37 : PRINT P1; : CALL -868
|
||||
230 B1 = FNB(1) : IF B1 <> N1 THEN N1 = B1 : VTAB 23 : HTAB 15 : PRINT P$(B1);
|
||||
240 X = INT(P0 * RX) : Y = INT(P1 * RY(F))
|
||||
250 O = (X1 = X2 AND Y1 = Y2) + 1
|
||||
260 N = (X = X2 AND Y = Y2) + 1
|
||||
270 IF X <> X1 OR Y <> Y1 THEN XDRAW N AT X, Y : XDRAW O AT X1, Y1 : X1 = X : Y1 = Y
|
||||
300 K = PEEK(-16384) : IF K < 128 THEN 110
|
||||
310 POKE-16368,0
|
||||
320 IF K = 198 OR K = 200 THEN F = PEEK(-16302) ^ 0 : GOTO 110HIDE
|
||||
330 IF K = 155 OR K = 211 THEN F = PEEK(-16301) * 0 : GOTO 110SHOW
|
||||
340 TEXT : END
|
||||
400 HOME : HGR
|
||||
410 DEF FN B(B) = PEEK(49249 + B) > 127
|
||||
420 P$(0) = "NOT PRESSED" : P$(1) = "PRESSED "
|
||||
430 VTAB 21 : PRINT "BUTTON:";
|
||||
440 PRINT TAB(28); "JOYSTICK:"
|
||||
450 PRINT " OPEN APPLE "P$(0);
|
||||
460 PRINT TAB(29); "ONE"
|
||||
470 PRINT " CLOSED APPLE "P$(0);
|
||||
480 PRINT TAB(29); "TWO"
|
||||
490 PRINT TAB(9); "SHIFT "P$(0);
|
||||
500 RX = 35 / 32 : RY(0) = 5 / 8 : RY(1) = 3 / 4
|
||||
510 DATA2,0,6,0,3,0,29,15,20,6,0
|
||||
520 FOR I = 768 TO 778 : READ B
|
||||
530 POKE I, B : NEXT : POKE 232, 0 : POKE 233, 3
|
||||
550 ROT = 0 : SCALE = 7 : XDRAW 1 AT X1, Y1
|
||||
560 O0 = -1 : O1 = O0 : O2 = O0 : O3 = O0
|
||||
570 RETURN
|
||||
219
Task/Joystick-position/AutoHotkey/joystick-position.ahk
Normal file
219
Task/Joystick-position/AutoHotkey/joystick-position.ahk
Normal file
|
|
@ -0,0 +1,219 @@
|
|||
; Uncomment if Gdip.ahk is not in your standard library
|
||||
; #Include, Gdip.ahk
|
||||
|
||||
; Comment for lower CPU usage
|
||||
SetBatchLines, -1
|
||||
|
||||
JoystickNumber := 0 ; (1-16) or (0 = Auto-detect)
|
||||
CrosshairSize := 100
|
||||
BarWidth := 50
|
||||
BarSpacing := BarWidth + 8
|
||||
Color1 := 0x99000000
|
||||
Color2 := 0x99ffffff
|
||||
Color3 := 0x99ff6600
|
||||
Color4 := 0xff0066ff
|
||||
Color5 := 0xffff6600
|
||||
Font := "Arial"
|
||||
FontSize1 := 20
|
||||
FontSize2 := 30
|
||||
Lineweight1 := 8
|
||||
Lineweight2 := 3
|
||||
Lineweight3 := 2
|
||||
Lineweight4 := 4
|
||||
Show2ndCrosshair := true
|
||||
AxisLabelHeight := 47
|
||||
|
||||
#SingleInstance, Force
|
||||
#NoEnv
|
||||
OnExit, Exit
|
||||
SysGet, MWA, MonitorWorkArea
|
||||
CrosshairOffset := CrosshairSize // 2
|
||||
, CircleOffset := CrosshairOffset - 5
|
||||
, CircleSize := CrosshairSize - 10
|
||||
, TaskBarHeight := A_ScreenHeight - MWABottom + Lineweight1 // 2
|
||||
, ScaleX := A_ScreenWidth / 100
|
||||
, ScaleY1 := (A_ScreenHeight - TaskBarHeight - AxisLabelHeight) / 100
|
||||
, ScaleY2 := A_ScreenHeight / 100
|
||||
, BarCenter := (MWABottom - AxisLabelHeight) // 2 + AxisLabelHeight
|
||||
, BorderBot := MWABottom - Lineweight1 // 2 + 2
|
||||
, PieSize := 400
|
||||
, PieX := (A_ScreenWidth - PieSize) // 2
|
||||
, PieY := (A_ScreenHeight - PieSize) // 2
|
||||
, BarHeight := A_ScreenHeight - AxisLabelHeight - TaskBarHeight
|
||||
, AxisTextOffset := BarWidth > 32 ? (BarWidth - 32) // 2 : 0
|
||||
, Axis_Array := {"X": "X", "Y": "Y"}
|
||||
, MaxI := 2
|
||||
|
||||
; Auto-detect the joystick number if called for
|
||||
if (JoystickNumber < 1) {
|
||||
Loop, 16 {
|
||||
GetKeyState, Joy_Name, %A_Index%JoyName
|
||||
if (Joy_Name) {
|
||||
JoystickNumber := A_Index
|
||||
break
|
||||
}
|
||||
}
|
||||
if (!JoystickNumber) {
|
||||
MsgBox The system does not appear to have any joysticks.
|
||||
ExitApp
|
||||
}
|
||||
}
|
||||
else {
|
||||
GetKeyState, Joy_Name, %JoystickNumber%JoyName
|
||||
if (!Joy_Name) {
|
||||
MsgBox The system does not appear to have a joystick number %JoystickNumber%.
|
||||
ExitApp
|
||||
}
|
||||
}
|
||||
|
||||
if (!pToken := Gdip_Startup()) {
|
||||
MsgBox, 48, Gdiplus error!, Gdiplus failed to start. Please ensure you have Gdiplus on your system.
|
||||
ExitApp
|
||||
}
|
||||
|
||||
If (!Gdip_FontFamilyCreate(Font)) {
|
||||
MsgBox, 48, Font error!, The font you have specified does not exist on your system.
|
||||
ExitApp
|
||||
}
|
||||
|
||||
; Get joystick information
|
||||
SetFormat, FloatFast, 03.2
|
||||
GetKeyState, Joy_Buttons, % JoystickNumber "JoyButtons"
|
||||
GetKeyState, Joy_Info, % JoystickNumber "JoyInfo"
|
||||
Loop, Parse, Joy_Info
|
||||
if (A_LoopField != "C" && A_LoopField != "D" && A_LoopField != "P")
|
||||
Axis_Array[A_LoopField] := A_LoopField
|
||||
, %A_LoopField% := true
|
||||
, MaxI++
|
||||
else
|
||||
%A_LoopField% := true
|
||||
|
||||
; Setup Gdip
|
||||
Gui, 1: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
|
||||
Gui, 1: Show, NA
|
||||
hwnd1 := WinExist()
|
||||
, hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
|
||||
, hdc := CreateCompatibleDC()
|
||||
, obm := SelectObject(hdc, hbm)
|
||||
, G1 := Gdip_GraphicsFromHDC(hdc)
|
||||
, Gdip_SetSmoothingMode(G1, 4)
|
||||
, pPen1 := Gdip_CreatePen(Color1, Lineweight1)
|
||||
, pPen2 := Gdip_CreatePen(Color2, Lineweight2)
|
||||
, pPen3 := Gdip_CreatePen(Color4, Lineweight3)
|
||||
, pPen4 := Gdip_CreatePen(Color5, Lineweight4)
|
||||
, pBrush1 := Gdip_BrushCreateSolid(Color1)
|
||||
, pBrush2 := Gdip_BrushCreateSolid(Color3)
|
||||
|
||||
; Crosshair 2
|
||||
if ((R || U) && Show2ndCrosshair) {
|
||||
pPen5 := Gdip_CreatePen(Color5, Lineweight3)
|
||||
, pPen6 := Gdip_CreatePen(Color4, Lineweight4)
|
||||
, joy_r := joy_u := 50
|
||||
}
|
||||
|
||||
; Bar X-offsets
|
||||
for key, val in Axis_Array
|
||||
%val%X := A_ScreenWidth - MaxI * BarSpacing + BarSpacing * (A_Index - 1) + 3
|
||||
|
||||
; Info box
|
||||
IBH1 := 150
|
||||
, IBW1 := 450
|
||||
, IBX1 := A_ScreenWidth - MaxI * BarSpacing - IBW1
|
||||
, IBY1 := A_ScreenHeight - TaskBarHeight - IBH1 + Lineweight1 // 2
|
||||
, IBH2 := IBH1 - 8
|
||||
, IBW2 := IBW1 - 8
|
||||
, IBX2 := IBX1 + 4
|
||||
, IBY2 := IBY1 + 4
|
||||
, FontOptions1 := "x" (IBX1 + 8) " y" (IBY1 + 8) " w" IBW1 - 20 " Left c" SubStr(Color2, 3) " r4 s" FontSize1 " Bold"
|
||||
|
||||
; Axis box
|
||||
ABH1 := AxisLabelHeight + 4
|
||||
, ABW1 := MaxI * BarSpacing
|
||||
, ABX1 := A_ScreenWidth - MaxI * BarSpacing
|
||||
, ABY1 := 0
|
||||
, ABH2 := ABH1 - 16
|
||||
, ABW2 := ABW1 - 8
|
||||
, ABX2 := ABX1 + 4
|
||||
, ABY2 := ABY1 + 4
|
||||
, FontOptions2 := " y" ABY1 + AxisLabelHeight - 40 " w" ABW1 - 10 " Left c" SubStr(Color2, 3) " r4 s" FontSize2 " Bold"
|
||||
|
||||
; Update graphics
|
||||
Loop, {
|
||||
Buttons_Down := ""
|
||||
Loop, %Joy_Buttons% {
|
||||
GetKeyState, joy%A_Index%, %JoystickNumber%joy%A_Index%
|
||||
if (joy%A_Index% = "D")
|
||||
Buttons_Down .= " " A_Index
|
||||
}
|
||||
|
||||
; Info & axis boxes
|
||||
InfoText := Joy_Name " (#" JoystickNumber "):`n" Axis_Info "`nButtons Down: " Buttons_Down "`n`n(Ctrl+Esc to exit)"
|
||||
, Gdip_FillRoundedRectangle(G1, pBrush1, IBX1, IBY1, IBW1, IBH1, 5)
|
||||
, Gdip_DrawRoundedRectangle(G1, pPen2, IBX2, IBY2, IBW2, IBH2, 5)
|
||||
, Gdip_TextToGraphics(G1, InfoText, FontOptions1, Font, A_ScreenWidth, A_ScreenHeight)
|
||||
, Gdip_FillRoundedRectangle(G1, pBrush1, ABX1, ABY1, ABW1, ABH1, 5)
|
||||
, Gdip_DrawRoundedRectangle(G1, pPen2, ABX2, ABY2, ABW2, ABH2, 5)
|
||||
|
||||
; Axis bars
|
||||
Axis_Info := ""
|
||||
for key, val in Axis_Array {
|
||||
GetKeyState, joy_%val%, % JoystickNumber "Joy" val
|
||||
Axis_Info .= val joy_%val% " "
|
||||
if (joy_%val% > 50)
|
||||
%val%Y := BarCenter
|
||||
, %val%h1 := (joy_%val% - 50) * ScaleY1
|
||||
else
|
||||
%val%Y := AxisLabelHeight + joy_%val% * ScaleY1 ;
|
||||
, Sc - (joy_%val% - 50) * ScaleY1
|
||||
, %val%h1 := BarCenter - %val%Y
|
||||
Gdip_FillRoundedRectangle(G1, pBrush2, %val%X, %val%Y, BarWidth, %val%h1, 2)
|
||||
, Gdip_DrawRoundedRectangle(G1, pPen1, %val%X, AxisLabelHeight, BarWidth, BarHeight, 5)
|
||||
, Gdip_DrawRoundedRectangle(G1, pPen2, %val%X, AxisLabelHeight, BarWidth, BarHeight, 5)
|
||||
, Gdip_TextToGraphics(G1, val, "x" (%val%X + AxisTextOffset) FontOptions2, Font, A_ScreenWidth, A_ScreenHeight)
|
||||
}
|
||||
|
||||
; POV hat
|
||||
If (P) {
|
||||
GetKeyState, Joy_P, %JoystickNumber%JoyPOV
|
||||
Axis_Info .= " POV" Joy_P
|
||||
if (Joy_P > -1) {
|
||||
StartAngle := (Joy_P > 33750 || Joy_P <= 2250) ? 247.5 ; up
|
||||
: Joy_P > 29250 ? 202.5 ; up left
|
||||
: Joy_P > 24750 ? 157.5 ; left
|
||||
: Joy_P > 20250 ? 112.5 ; down left
|
||||
: Joy_P > 15750 ? 67.5 ; down
|
||||
: Joy_P > 11250 ? 22.5 ; down right
|
||||
: Joy_P > 6750 ? 337.5 ; right
|
||||
: 292.5 ; up right
|
||||
, Gdip_FillPie(G1, pBrush2, PieX, PieY, PieSize, PieSize, StartAngle, 45)
|
||||
, Gdip_DrawPie(G1, pPen1, PieX, PieY, PieSize, PieSize, StartAngle, 45)
|
||||
, Gdip_DrawPie(G1, pPen2, PieX, PieY, PieSize, PieSize, StartAngle, 45)
|
||||
}
|
||||
}
|
||||
|
||||
; Crosshair 1
|
||||
CenterX := ScaleX * joy_x
|
||||
, CenterY := ScaleY2 * joy_y
|
||||
, Gdip_DrawLine(G1, pPen3, CenterX-CrosshairOffset, CenterY, CenterX+CrosshairOffset, CenterY)
|
||||
, Gdip_DrawLine(G1, pPen3, CenterX, CenterY-CrosshairOffset, CenterX, CenterY+CrosshairOffset)
|
||||
, Gdip_DrawEllipse(G1, pPen4, CenterX-CircleOffset, CenterY-CircleOffset, CircleSize, CircleSize)
|
||||
, Gdip_DrawEllipse(G1, pPen4, CenterX-3, CenterY-3, 6, 6)
|
||||
|
||||
; Crosshair 2
|
||||
if ((R || U) && Show2ndCrosshair)
|
||||
CenterU := ScaleX * joy_u
|
||||
, CenterR := ScaleY2 * joy_r
|
||||
, Gdip_DrawLine(G1, pPen5, CenterU-CrosshairOffset, CenterR, CenterU+CrosshairOffset, CenterR)
|
||||
, Gdip_DrawLine(G1, pPen5, CenterU, CenterR-CrosshairOffset, CenterU, CenterR+CrosshairOffset)
|
||||
, Gdip_DrawEllipse(G1, pPen6, CenterU-CircleOffset, CenterR-CircleOffset, CircleSize, CircleSize)
|
||||
, Gdip_DrawEllipse(G1, pPen6, CenterU-3, CenterR-3, 6, 6)
|
||||
|
||||
UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
|
||||
, Gdip_GraphicsClear(G1)
|
||||
}
|
||||
return
|
||||
|
||||
^Esc::
|
||||
Exit:
|
||||
Gdip_Shutdown(pToken)
|
||||
ExitApp
|
||||
23
Task/Joystick-position/BBC-BASIC/joystick-position.basic
Normal file
23
Task/Joystick-position/BBC-BASIC/joystick-position.basic
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
VDU 23,22,512;512;8,16,16,0
|
||||
VDU 5
|
||||
|
||||
GCOL 4,15
|
||||
REPEAT
|
||||
B% = ADVAL(0)
|
||||
X% = ADVAL(1) / 64
|
||||
Y% = 1023 - ADVAL(2) / 64
|
||||
PROCjoy(B%,X%,Y%)
|
||||
WAIT 4
|
||||
PROCjoy(B%,X%,Y%)
|
||||
UNTIL FALSE
|
||||
END
|
||||
|
||||
DEF PROCjoy(B%,X%,Y%)
|
||||
LOCAL I%
|
||||
LINE X%-32,Y%,X%+32,Y% : LINE X%,Y%-32,X%,Y%+32
|
||||
VDU 30
|
||||
FOR I% = 0 TO 15
|
||||
IF B% AND 1<<I% THEN PRINT "Button "; I%+1 " pressed";
|
||||
VDU 10,13
|
||||
NEXT
|
||||
ENDPROC
|
||||
55
Task/Joystick-position/C/joystick-position.c
Normal file
55
Task/Joystick-position/C/joystick-position.c
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void clear() {
|
||||
for(int n = 0;n < 10; n++) {
|
||||
printf("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\r\n\r\n\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
#define UP "00^00\r\n00|00\r\n00000\r\n"
|
||||
#define DOWN "00000\r\n00|00\r\n00v00\r\n"
|
||||
#define LEFT "00000\r\n<--00\r\n00000\r\n"
|
||||
#define RIGHT "00000\r\n00-->\r\n00000\r\n"
|
||||
#define HOME "00000\r\n00+00\r\n00000\r\n"
|
||||
|
||||
int main() {
|
||||
clear();
|
||||
system("stty raw");
|
||||
|
||||
printf(HOME);
|
||||
printf("space to exit; wasd to move\r\n");
|
||||
char c = 1;
|
||||
|
||||
while(c) {
|
||||
c = getc(stdin);
|
||||
clear();
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'a':
|
||||
printf(LEFT);
|
||||
break;
|
||||
case 'd':
|
||||
printf(RIGHT);
|
||||
break;
|
||||
case 'w':
|
||||
printf(UP);
|
||||
break;
|
||||
case 's':
|
||||
printf(DOWN);
|
||||
break;
|
||||
case ' ':
|
||||
c = 0;
|
||||
break;
|
||||
default:
|
||||
printf(HOME);
|
||||
};
|
||||
|
||||
printf("space to exit; wasd key to move\r\n");
|
||||
}
|
||||
|
||||
system("stty cooked");
|
||||
system("clear");
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
5 rem joystick - commodore vic-20 (expanded)
|
||||
6 rem for rosetta code
|
||||
10 print chr$(147);:poke 37154,peek(37154) and 127
|
||||
15 j1=37137:j2=37152:sc=4118:co=37910:x=11:y=11
|
||||
20 poke sc+x+y*22,43:poke co+x+y*22,0
|
||||
25 j=(not peek(j1) and28)/4
|
||||
30 j=j+(not peek(j1) and32)/2
|
||||
35 j=j+(not peek(j2) and128)/16
|
||||
40 print chr$(19);"joy: ";
|
||||
45 get k$:if k$="q" then print chr$(147):poke 37154,peek(37154)or128:end
|
||||
50 ox=x:oy=y
|
||||
60 if(j and 1) then y=1:ud$="u"
|
||||
61 if(j and 2) then y=21:ud$="d"
|
||||
62 if(j and 3)=0 then y=11:ud$=" "
|
||||
63 if(j and 4) then x=0:lr$="l"
|
||||
64 if(j and 8) then x=21:lr$="r"
|
||||
65 if(j and 12)=0 then x=11:lr$=" "
|
||||
66 if(j and 16) then f$="fire!":c=24
|
||||
67 if(j and 16)=0 then f$=" ":c=43
|
||||
70 print tab(5);ud$;tab(7);lr$;tab(9);f$;
|
||||
75 poke sc+x+y*22,c:poke co+x+y*22,0
|
||||
80 if (ox=x) and (oy=y) then goto 100
|
||||
85 poke sc+ox+oy*22,32
|
||||
100 goto 25
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
5 rem joystick - commodore 64
|
||||
6 rem for rosetta code
|
||||
8 rem black bkg, white text, dk. grey border
|
||||
9 poke 53280,11:poke 53281,0:poke 646,1
|
||||
10 print chr$(147);"joystick port 1 or 2";:input jp
|
||||
11 if jp<1 or jp>2 then print:print"invalid.":print:goto 10
|
||||
12 jp=(jp=2)+56321:print chr$(147);
|
||||
15 sc=1024:x=20:y=12:poke sc+x+y*40,43
|
||||
20 j=not peek(jp) and 31
|
||||
25 print chr$(19);"{CRSR DOWN 24}joy status: ";
|
||||
26 get k$:if k$="q" then print chr$(147):end
|
||||
35 ox=x:oy=y
|
||||
40 if(j and 1) then y=0:ud$="up "
|
||||
45 if(j and 2) then y=23:ud$="down"
|
||||
46 if(j and 3)=0 then y=12:ud$=" "
|
||||
50 if(j and 4) then x=0:lr$="left "
|
||||
55 if(j and 8) then x=39:lr$="right"
|
||||
56 if(j and 12)=0 then x=20:lr$=" "
|
||||
60 if(j and 16) then f$="fire!":c=24
|
||||
61 if(j and 16)=0 then f$=" ":c=43
|
||||
65 print tab(12);ud$;tab(17);lr$;tab(23);f$;
|
||||
85 poke sc+x+y*40,c:if (ox=x) and (oy=y) then goto 100
|
||||
90 poke sc+ox+oy*40,32
|
||||
100 goto 20
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
5 rem joystick - commodore plus/4
|
||||
6 rem for rosetta code
|
||||
8 rem black bkg, white text, dk. grey border
|
||||
9 color 0,1:color 4,2,1:color 1,2,7
|
||||
10 print chr$(147);"joystick port 1 or 2";:input jp
|
||||
11 if jp<1 or jp>2 then print:print"invalid.":print:goto 10
|
||||
12 print chr$(147);
|
||||
15 sc=3072:x=20:y=13:poke sc+x+y*40,43
|
||||
20 j=joy(jp)
|
||||
25 print chr$(19);"joy status: ";
|
||||
26 get k$:if k$="q" then print chr$(147):end
|
||||
35 ox=x:oy=y
|
||||
40 if(j and 15)=1 then d$="up ":x=20:y=1:goto 48
|
||||
41 if(j and 15)=2 then d$="up right":x=39:y=1:goto 48
|
||||
42 if(j and 15)=3 then d$=" right":x=39:y=13:goto 48
|
||||
43 if(j and 15)=4 then d$="down right":x=39:y=24:goto 48
|
||||
44 if(j and 15)=5 then d$="down ":x=20:y=24:goto 48
|
||||
45 if(j and 15)=6 then d$="down left ":x=0:y=24:goto 48
|
||||
46 if(j and 15)=7 then d$=" left ":x=0:y=13:goto 48
|
||||
47 if(j and 15)=8 then d$="up left ":x=0:y=1
|
||||
48 if(j and 128) then f$="fire!":c=24
|
||||
49 if(j and 128)=0 then f$=" ":c=43
|
||||
50 if(j=0) then d$=" ":x=20:y=13
|
||||
65 print tab(12);d$;tab(23);f$;
|
||||
85 poke sc+x+y*40,c:if (ox=x) and (oy=y) then goto 100
|
||||
90 poke sc+ox+oy*40,32
|
||||
100 goto 20
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
5 rem joystick - commodore 128
|
||||
6 rem for rosetta code
|
||||
8 rem black bkg, white text, dk. grey border
|
||||
9 color 0,1:color 4,12:color 1,2:graphic 0:scnclr 0:graphic 5
|
||||
10 print chr$(147);"joystick port 1 or 2";:input jp
|
||||
11 if jp<1 or jp>2 then print:print"invalid.":print:goto 10
|
||||
12 print chr$(147);
|
||||
15 sc=1024:x=20:y=12:poke sc+x+y*40,43
|
||||
20 j=joy(jp)
|
||||
25 print chr$(19);"joy status: ";
|
||||
26 get k$:if k$="q" then print chr$(147):end
|
||||
35 ox=x:oy=y
|
||||
40 if(j and 15)=1 then d$="up ":x=20:y=0:goto 48
|
||||
41 if(j and 15)=2 then d$="up right":x=39:y=0:goto 48
|
||||
42 if(j and 15)=3 then d$=" right":x=39:y=12:goto 48
|
||||
43 if(j and 15)=4 then d$="down right":x=39:y=24:goto 48
|
||||
44 if(j and 15)=5 then d$="down ":x=20:y=24:goto 48
|
||||
45 if(j and 15)=6 then d$="down left ":x=0:y=24:goto 48
|
||||
46 if(j and 15)=7 then d$=" left ":x=0:y=12:goto 48
|
||||
47 if(j and 15)=8 then d$="up left ":x=0:y=0
|
||||
48 if(j and 128) then f$="fire!":c=24
|
||||
49 if(j and 128)=0 then f$=" ":c=43
|
||||
50 if(j=0) then d$=" ":x=20:y=12
|
||||
65 print tab(12);d$;tab(23);f$;
|
||||
85 poke sc+x+y*40,c:if (ox=x) and (oy=y)then goto 100
|
||||
90 poke sc+ox+oy*40,32
|
||||
100 goto 20
|
||||
72
Task/Joystick-position/Delphi/joystick-position-1.delphi
Normal file
72
Task/Joystick-position/Delphi/joystick-position-1.delphi
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
unit uMain;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Winapi.Windows, System.SysUtils, System.Classes, Vcl.Controls, Vcl.Forms,
|
||||
Vcl.ExtCtrls, Vcl.StdCtrls;
|
||||
|
||||
type
|
||||
TForm1 = class(TForm)
|
||||
tmr1: TTimer;
|
||||
lblPosition: TLabel;
|
||||
procedure tmr1Timer(Sender: TObject);
|
||||
procedure FormPaint(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
procedure DrawCrosshair(X, Y: Integer);
|
||||
end;
|
||||
|
||||
var
|
||||
Form1: TForm1;
|
||||
X: Integer = 0;
|
||||
Y: Integer = 0;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
mmSystem, Vcl.Graphics;
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TForm1.DrawCrosshair(X, Y: Integer);
|
||||
const
|
||||
RADIUS = 10;
|
||||
CROSS = 3;
|
||||
begin
|
||||
Canvas.Brush.Color := clblack;
|
||||
Canvas.FillRect(ClientRect);
|
||||
with Canvas do
|
||||
begin
|
||||
Pen.Color := clWhite;
|
||||
pen.Width := 1;
|
||||
Ellipse(X - RADIUS, Y - RADIUS, X + RADIUS, Y + RADIUS);
|
||||
pen.Width := 2;
|
||||
MoveTo(X - CROSS * RADIUS, Y);
|
||||
LineTo(X + CROSS * RADIUS, Y);
|
||||
MoveTo(X, Y - CROSS * RADIUS);
|
||||
LineTo(X, Y + CROSS * RADIUS);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TForm1.FormPaint(Sender: TObject);
|
||||
begin
|
||||
DrawCrosshair(X, Y);
|
||||
end;
|
||||
|
||||
procedure TForm1.tmr1Timer(Sender: TObject);
|
||||
var
|
||||
info: TJoyInfo;
|
||||
begin
|
||||
if (joyGetPos(0, @info) = 0) then
|
||||
begin
|
||||
X := Round(ClientWidth * info.wXpos / MAXWORD);
|
||||
Y := Round(ClientHeight * info.wYpos / MAXWORD);
|
||||
lblPosition.Caption := Format('(%3d,%3d)', [X, Y]);
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
36
Task/Joystick-position/Delphi/joystick-position-2.delphi
Normal file
36
Task/Joystick-position/Delphi/joystick-position-2.delphi
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
object Form1: TForm1
|
||||
Left = 0
|
||||
Top = 0
|
||||
Caption = 'Form1'
|
||||
ClientHeight = 600
|
||||
ClientWidth = 600
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
OnPaint = FormPaint
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object lblPosition: TLabel
|
||||
Left = 500
|
||||
Top = 0
|
||||
Width = 100
|
||||
Height = 21
|
||||
Alignment = taCenter
|
||||
AutoSize = False
|
||||
Caption = '(0,0)'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWhite
|
||||
Font.Height = -20
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object tmr1: TTimer
|
||||
Interval = 500
|
||||
OnTimer = tmr1Timer
|
||||
end
|
||||
end
|
||||
30
Task/Joystick-position/FreeBASIC/joystick-position.basic
Normal file
30
Task/Joystick-position/FreeBASIC/joystick-position.basic
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
Screen 12
|
||||
|
||||
Dim As Single x, y
|
||||
Dim As Integer buttons, result
|
||||
|
||||
Const JoystickID = 0
|
||||
|
||||
'This line checks to see if the joystick is ok.
|
||||
If Getjoystick(JoystickID, buttons, x, y) Then
|
||||
Print "Joystick doesn't exist or joystick error."
|
||||
Print !"\nPress any key to continue."
|
||||
Sleep
|
||||
End
|
||||
End If
|
||||
|
||||
Do
|
||||
result = Getjoystick(JoystickID, buttons, x, y)
|
||||
|
||||
Locate 1,1
|
||||
Print ; "result:"; result; " x:"; x; " y:"; y; " Buttons:"; buttons, "", "", ""
|
||||
|
||||
'This tests to see which buttons from 1 to 27 are pressed.
|
||||
For a As Integer = 0 To 26
|
||||
If (buttons And (1 Shl a)) Then
|
||||
Print "Button "; a; " pressed. "
|
||||
Else
|
||||
Print "Button "; a; " not pressed."
|
||||
End If
|
||||
Next a
|
||||
Loop
|
||||
2
Task/Joystick-position/GUISS/joystick-position.guiss
Normal file
2
Task/Joystick-position/GUISS/joystick-position.guiss
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Start,Control Panel, Game Controllers, List:installed controllers,Click:Joystick,
|
||||
Button:Properties,Button:Test
|
||||
103
Task/Joystick-position/Go/joystick-position.go
Normal file
103
Task/Joystick-position/Go/joystick-position.go
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/nsf/termbox-go"
|
||||
"github.com/simulatedsimian/joystick"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func printAt(x, y int, s string) {
|
||||
for _, r := range s {
|
||||
termbox.SetCell(x, y, r, termbox.ColorDefault, termbox.ColorDefault)
|
||||
x++
|
||||
}
|
||||
}
|
||||
|
||||
func readJoystick(js joystick.Joystick, hidden bool) {
|
||||
jinfo, err := js.Read()
|
||||
check(err)
|
||||
|
||||
w, h := termbox.Size()
|
||||
tbcd := termbox.ColorDefault
|
||||
termbox.Clear(tbcd, tbcd)
|
||||
printAt(1, h-1, "q - quit")
|
||||
if hidden {
|
||||
printAt(11, h-1, "s - show buttons:")
|
||||
} else {
|
||||
bs := ""
|
||||
printAt(11, h-1, "h - hide buttons:")
|
||||
for button := 0; button < js.ButtonCount(); button++ {
|
||||
if jinfo.Buttons&(1<<uint32(button)) != 0 {
|
||||
// Buttons assumed to be numbered from 1, not 0.
|
||||
bs += fmt.Sprintf(" %X", button+1)
|
||||
}
|
||||
}
|
||||
printAt(28, h-1, bs)
|
||||
}
|
||||
|
||||
// Map axis values in range -32767 to +32768 to termbox co-ordinates.
|
||||
x := int(float64((jinfo.AxisData[0]+32767)*(w-1)) / 65535)
|
||||
y := int(float64((jinfo.AxisData[1]+32767)*(h-2)) / 65535)
|
||||
printAt(x, y, "+") // display crosshair
|
||||
termbox.Flush()
|
||||
}
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Under Linux the id is used to construct the joystick device name.
|
||||
// For example: id 0 will open device: "/dev/input/js0"
|
||||
// Under Windows the id is the actual numeric id of the joystick.
|
||||
jsid := 0
|
||||
// Optionally pass joystick id to be used as a command line argument.
|
||||
if len(os.Args) > 1 {
|
||||
i, err := strconv.Atoi(os.Args[1])
|
||||
check(err)
|
||||
jsid = i
|
||||
}
|
||||
|
||||
js, jserr := joystick.Open(jsid)
|
||||
check(jserr)
|
||||
|
||||
err := termbox.Init()
|
||||
check(err)
|
||||
defer termbox.Close()
|
||||
|
||||
eventQueue := make(chan termbox.Event)
|
||||
go func() {
|
||||
for {
|
||||
eventQueue <- termbox.PollEvent()
|
||||
}
|
||||
}()
|
||||
|
||||
ticker := time.NewTicker(time.Millisecond * 40)
|
||||
hidden := false // Controls whether button display hidden or not.
|
||||
|
||||
for doQuit := false; !doQuit; {
|
||||
select {
|
||||
case ev := <-eventQueue:
|
||||
if ev.Type == termbox.EventKey {
|
||||
if ev.Ch == 'q' {
|
||||
doQuit = true
|
||||
} else if ev.Ch == 'h' {
|
||||
hidden = true
|
||||
} else if ev.Ch == 's' {
|
||||
hidden = false
|
||||
}
|
||||
}
|
||||
if ev.Type == termbox.EventResize {
|
||||
termbox.Flush()
|
||||
}
|
||||
case <-ticker.C:
|
||||
readJoystick(js, hidden)
|
||||
}
|
||||
}
|
||||
}
|
||||
22
Task/Joystick-position/Haskell/joystick-position.hs
Normal file
22
Task/Joystick-position/Haskell/joystick-position.hs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
import qualified Graphics.UI.GLFW as GLFW -- cabal install GLFW-b
|
||||
import Graphics.Win32.Key
|
||||
import Control.Monad.RWS.Strict (liftIO)
|
||||
|
||||
main = do
|
||||
liftIO $ do
|
||||
_ <- GLFW.init
|
||||
GLFW.pollEvents
|
||||
(jxrot, jyrot) <- liftIO $ getJoystickDirections GLFW.Joystick'1
|
||||
putStrLn $ (show jxrot) ++ " " ++ (show jyrot)
|
||||
w <- getAsyncKeyState 27 -- ESC pressed?
|
||||
if (w<1) then main else do
|
||||
GLFW.terminate
|
||||
return ()
|
||||
|
||||
getJoystickDirections :: GLFW.Joystick -> IO (Double, Double)
|
||||
|
||||
getJoystickDirections js = do
|
||||
maxes <- GLFW.getJoystickAxes js
|
||||
return $ case maxes of
|
||||
(Just (x:y:_)) -> (-y, x)
|
||||
_ -> ( 0, 0)
|
||||
10
Task/Joystick-position/IS-BASIC/joystick-position.basic
Normal file
10
Task/Joystick-position/IS-BASIC/joystick-position.basic
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
100 CLEAR SCREEN
|
||||
110 DO
|
||||
120 LET J=JOY(0) OR JOY(1) OR JOY(2)
|
||||
130 PRINT AT 1,1:" ";:PRINT AT 1,1:"";
|
||||
140 IF J BAND 1 THEN PRINT "right ";
|
||||
150 IF J BAND 2 THEN PRINT "left ";
|
||||
160 IF J BAND 4 THEN PRINT "down ";
|
||||
170 IF J BAND 8 THEN PRINT "up ";
|
||||
180 IF J BAND 16 THEN PRINT "fire ";
|
||||
190 LOOP
|
||||
76
Task/Joystick-position/Julia/joystick-position.julia
Normal file
76
Task/Joystick-position/Julia/joystick-position.julia
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
using CSFML.LibCSFML, Gtk.ShortNames, Colors, Graphics, Cairo
|
||||
|
||||
#------------ input code ----------------------#
|
||||
|
||||
mutable struct Joystick
|
||||
devnum::Int
|
||||
isconnected::Bool
|
||||
hasXaxis::Bool
|
||||
nbuttons::Int
|
||||
pressed::Vector{Bool}
|
||||
ypos::Int
|
||||
xpos::Int
|
||||
name::String
|
||||
Joystick(n, b=2, c=false, x=true) = new(n, c, x, b, fill(false, b), 0, 0)
|
||||
end
|
||||
|
||||
const devnum = 0
|
||||
const buttons = 2
|
||||
const jstick = Joystick(devnum, buttons)
|
||||
|
||||
function polljoystick(jstick, sleepinterval=0.05)
|
||||
while !sfJoystick_isConnected(jstick.devnum)
|
||||
sleep(0.25) # wait till connected
|
||||
sfJoystick_update()
|
||||
end
|
||||
jstick.name = sfJoystick_getIdentification(jstick.devnum).name
|
||||
jstick.isconnected = true
|
||||
jstick.hasXaxis = sfJoystick_hasAxis(jstick.devnum, 0)
|
||||
jstick.nbuttons = sfJoystick_getButtonCount(jstick.devnum)
|
||||
while true
|
||||
sfJoystick_update()
|
||||
for i in 1:jstick.nbuttons
|
||||
jstick.pressed[i] = sfJoystick_isButtonPressed(jstick.devnum, i - 1)
|
||||
end
|
||||
jstick.ypos = sfJoystick_getAxisPosition(jstick.devnum, 1)
|
||||
jstick.xpos = sfJoystick_getAxisPosition(joystick.devnum, 0)
|
||||
yield()
|
||||
sleep(sleepinterval)
|
||||
end
|
||||
end
|
||||
|
||||
#------------ output code -------------------#
|
||||
|
||||
makelabel() = "Button 1: " * (jstick.pressed[1] ? "DOWN" : "UP") *
|
||||
" Button 2: " * (jstick.pressed[2] ? "DOWN" : "UP")
|
||||
|
||||
const fontpointsize = 80
|
||||
const wid = 500
|
||||
const hei = 500
|
||||
win = Window("Cursor Task", wid, hei) |> (Frame() |> (vbox = Box(:v)))
|
||||
set_gtk_property!(vbox, :expand, true)
|
||||
can = Canvas(wid, hei)
|
||||
label = Label(makelabel())
|
||||
push!(vbox, can, label)
|
||||
|
||||
joytoxpos() = div((jstick.xpos + 100) * width(can), 200)
|
||||
joytoypos() = div((jstick.ypos + 100) * height(can), 200)
|
||||
Gtk.showall(win)
|
||||
|
||||
@guarded draw(can) do widget
|
||||
ctx = getgc(can)
|
||||
select_font_face(ctx, "Courier", Cairo.FONT_SLANT_NORMAL, Cairo.FONT_WEIGHT_BOLD)
|
||||
set_font_size(ctx, fontpointsize)
|
||||
set_source(ctx, colorant"red")
|
||||
move_to(ctx, joytoxpos(), joytoypos())
|
||||
show_text(ctx, "+")
|
||||
set_gtk_property!(label, :label, makelabel())
|
||||
end
|
||||
|
||||
@async polljoystick(jstick)
|
||||
|
||||
while true
|
||||
draw(can)
|
||||
sleep(0.2)
|
||||
yield()
|
||||
end
|
||||
72
Task/Joystick-position/Liberty-BASIC/joystick-position.basic
Normal file
72
Task/Joystick-position/Liberty-BASIC/joystick-position.basic
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
'disable text window
|
||||
nomainwin
|
||||
|
||||
'set window size
|
||||
WindowWidth = 308
|
||||
WindowHeight = 331
|
||||
|
||||
'center window on screen
|
||||
UpperLeftX = int((DisplayWidth-WindowWidth)/2)
|
||||
UpperLeftY = int((DisplayHeight-WindowHeight)/2)
|
||||
|
||||
'open graphics window
|
||||
open "Joystick Position" for graphics_nf_nsb as #m
|
||||
|
||||
'trap window closing
|
||||
#m "trapclose [quit]"
|
||||
|
||||
'put pen down
|
||||
#m "down"
|
||||
|
||||
'get center of graphics window
|
||||
#m "home"
|
||||
#m "posxy CenterX CenterY"
|
||||
|
||||
'draw sprite for crosshair
|
||||
#m "backcolor black; color black"
|
||||
#m "place 0 20;boxfilled 20 40"
|
||||
#m "line 0 10 20 10"
|
||||
#m "line 10 0 10 20"
|
||||
#m "place 10 10; circle 10"
|
||||
#m "backcolor white; color red"
|
||||
#m "line 0 30 20 30"
|
||||
#m "line 10 20 10 40"
|
||||
#m "place 10 30; circle 10"
|
||||
#m "flush"
|
||||
|
||||
'get sprite image
|
||||
#m "getbmp plus 0 0 20 40"
|
||||
#m "cls"
|
||||
|
||||
'create sprite from image
|
||||
#m "addsprite crosshair plus"
|
||||
#m "centersprite crosshair"
|
||||
#m "spritexy crosshair "; CenterX; " "; CenterY
|
||||
#m "drawsprites"
|
||||
|
||||
'check joystick every 100 milliseconds
|
||||
timer 100, [CheckJoystick]
|
||||
wait
|
||||
|
||||
[CheckJoystick]
|
||||
readjoystick 1
|
||||
|
||||
'calculate crosshair position
|
||||
PosX = int(CenterX*Joy1x/32767)
|
||||
PosY = int(CenterY*Joy1y/32767)
|
||||
|
||||
'update crosshair position
|
||||
#m "spritexy crosshair "; PosX; " "; PosY
|
||||
#m "drawsprites"
|
||||
|
||||
'display button information
|
||||
if Joy1button1 > 0 then #m "place 0 0;\\Button 1 pressed"
|
||||
if Joy1button2 > 0 then #m "place 0 0;\\\Button 2 pressed"
|
||||
|
||||
wait
|
||||
|
||||
[quit]
|
||||
timer 0
|
||||
close #m
|
||||
unloadbmp "plus"
|
||||
end
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
10 MODE 1:BORDER 14:x=320:y=200:d=1
|
||||
20 a=JOY(0) ' read state of first joystick
|
||||
30 IF d THEN q$="*" ELSE q$=" "
|
||||
40 IF a THEN MOVE x-8,y+8:TAG:PRINT q$;:TAGOFF
|
||||
50 IF (a AND 1) AND y<380 THEN y=y+10
|
||||
60 IF (a AND 2) AND y>20 THEN y=y-10
|
||||
70 IF (a AND 4) AND x>20 THEN x=x-10
|
||||
80 IF (a AND 8) AND x<620 THEN x=x+10
|
||||
90 IF a AND 16 THEN LOCATE 1,1:PRINT "Fire1 pressed":d=1
|
||||
100 IF a AND 32 THEN LOCATE 1,2:PRINT "Fire2 pressed":d=0
|
||||
110 IF a<16 THEN LOCATE 1,1:PRINT " ":PRINT " "
|
||||
120 MOVE x-8,y+8:TAG:PRINT "X";:TAGOFF
|
||||
130 GOTO 20
|
||||
|
|
@ -0,0 +1 @@
|
|||
Slider2D[Dynamic[ControllerState[{"X", "Y"}]], ImageSize -> {500, 500}]
|
||||
54
Task/Joystick-position/OCaml/joystick-position.ocaml
Normal file
54
Task/Joystick-position/OCaml/joystick-position.ocaml
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
let remove x = List.filter (fun y -> y <> x)
|
||||
let buttons_string b =
|
||||
String.concat " " (List.map string_of_int b)
|
||||
|
||||
let position app x y =
|
||||
let view = SFRenderWindow.getView app in
|
||||
let width, height = SFView.getSize view in
|
||||
let hw = width /. 2.0 in
|
||||
let hh = height /. 2.0 in
|
||||
(hw +. ((x /. 100.0) *. hw),
|
||||
hh +. ((y /. 100.0) *. hh))
|
||||
|
||||
let cross =
|
||||
[| 1.0, 1.0; 10.0, 1.0; 10.0, -1.0; 1.0, -1.0;
|
||||
1.0, -10.0; -1.0, -10.0; -1.0, -1.0; -10.0, -1.0;
|
||||
-10.0, 1.0; -1.0, 1.0; -1.0, 10.0; 1.0, 10.0; |]
|
||||
|
||||
let () =
|
||||
let app = SFRenderWindow.make (800, 600) "Joystick Position" in
|
||||
let text = SFText.make "" in
|
||||
let shape = SFShape.create cross in
|
||||
SFShape.setFillColor shape SFColor.white;
|
||||
SFShape.setOutlineColor shape SFColor.white;
|
||||
SFShape.setOutlineThickness shape 1.0;
|
||||
let rec display ((x, y), b) =
|
||||
SFText.setString text (buttons_string b);
|
||||
let x, y = position app x y in
|
||||
SFShape.setPosition shape (x, y);
|
||||
SFRenderWindow.clear app SFColor.black;
|
||||
SFRenderWindow.drawText app text ();
|
||||
SFRenderWindow.drawShape app shape ();
|
||||
SFRenderWindow.display app;
|
||||
and loop joyd =
|
||||
let get_joystick (((x, y), b) as joyd) = function
|
||||
| SFEvent.JoystickButtonPressed (0, button) -> ((x, y), button::b)
|
||||
| SFEvent.JoystickButtonReleased (0, button) -> ((x, y), remove button b)
|
||||
| SFEvent.JoystickMoved (0, SFJoystick.X, av) -> ((av, y), b)
|
||||
| SFEvent.JoystickMoved (0, SFJoystick.Y, av) -> ((x, av), b)
|
||||
| _ -> joyd
|
||||
in
|
||||
let rec proc_event joyd =
|
||||
match SFRenderWindow.pollEvent app with
|
||||
| Some SFEvent.KeyPressed (SFKey.Escape,_,_,_,_)
|
||||
| Some SFEvent.Closed -> ()
|
||||
| Some event ->
|
||||
let joyd = get_joystick joyd event in
|
||||
proc_event joyd
|
||||
| None ->
|
||||
display joyd;
|
||||
loop joyd
|
||||
in
|
||||
proc_event joyd
|
||||
in
|
||||
loop ((0.0, 0.0), [])
|
||||
64
Task/Joystick-position/Phix/joystick-position-1.phix
Normal file
64
Task/Joystick-position/Phix/joystick-position-1.phix
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
(notonline)-->
|
||||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span>
|
||||
<span style="color: #000080;font-style:italic;">-- Joystick library for Euphoria (Windows)
|
||||
-- /Mic, 2002
|
||||
--
|
||||
-- integer joy_init()
|
||||
-- returns the number of joysticks attached to the computer
|
||||
--
|
||||
-- sequence joy_get_state(integer joy_num)
|
||||
-- returns the current state of joystick #joy_num (can be either 1 or 2).
|
||||
-- the format of the return sequence is:
|
||||
-- {X_direction, Y_direction, Z_direction, buttons}
|
||||
-- the X,Y and Z directions have 3 possible values; 0 (negative), 32768 (neutral) or 65535 (positive)
|
||||
-- the buttons' status are represented by a single bit (button up, button down). e.g. to get the status
|
||||
-- of button #3 on joystick #1 you'd use:
|
||||
-- sequence state
|
||||
-- state = joy_get_state(1)
|
||||
-- if and_bits(state[4],4) then ... end if
|
||||
--</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #000000;">dll</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #000000;">machine</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">joyinfo</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">32</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">atom</span> <span style="color: #000000;">winmm</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">joyGetNumDevs</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyGetPos</span>
|
||||
|
||||
<span style="color: #000000;">winmm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">open_dll</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"winmm.dll"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">winmm</span> <span style="color: #0000FF;"><=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Unable to open winmm.dll"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
|
||||
<span style="color: #000000;">joyGetNumDevs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">winmm</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"joyGetNumDevs"</span><span style="color: #0000FF;">,{},</span><span style="color: #000000;">C_UINT</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">joyGetPos</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">winmm</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"joyGetPos"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">,</span><span style="color: #000000;">C_POINTER</span><span style="color: #0000FF;">},</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetNumDevs</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Unable to link functions"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
|
||||
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">joy_init</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">joy1Attached</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joy2Attached</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">numDevs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetNumDevs</span><span style="color: #0000FF;">,{})</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">numDevs</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
|
||||
<span style="color: #000000;">joy1Attached</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">})</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">167</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">joy2Attached</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">numDevs</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">})</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">167</span><span style="color: #0000FF;">)</span>
|
||||
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">joy1Attached</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">joy2Attached</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">joy_get_state</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">joy_num</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">joy_num</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #000000;">joy_num</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">joy_num</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">joy_num</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">joy_num</span><span style="color: #0000FF;">*</span><span style="color: #000000;">16</span><span style="color: #0000FF;">)})</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000080;font-style:italic;">-- ERROR</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #7060A8;">peek4u</span><span style="color: #0000FF;">({</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">joy_num</span><span style="color: #0000FF;">*</span><span style="color: #000000;">16</span><span style="color: #0000FF;">),</span><span style="color: #000000;">4</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
<!--
|
||||
37
Task/Joystick-position/Phix/joystick-position-2.phix
Normal file
37
Task/Joystick-position/Phix/joystick-position-2.phix
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
(notonline)-->
|
||||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #000000;">joy</span><span style="color: #0000FF;">.</span><span style="color: #000000;">ew</span>
|
||||
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">joy_init</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"No joystick(s) attached!"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">joy_info</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">button_mask</span>
|
||||
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Joystick test\nEntering input loop. Press a key to exit..\n\n"</span><span style="color: #0000FF;">)</span>
|
||||
|
||||
<span style="color: #008080;">while</span> <span style="color: #7060A8;">get_key</span><span style="color: #0000FF;">()=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000080;font-style:italic;">-- Get the state of joystick #1</span>
|
||||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">joy_get_state</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
|
||||
<span style="color: #000080;font-style:italic;">-- Do not print info unless the state has changed</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">equal</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joy_info</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">joy_info</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span>
|
||||
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"X = %d, Y= %d "</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">32767</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">32768</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">32767</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">32768</span><span style="color: #0000FF;">)})</span>
|
||||
|
||||
<span style="color: #000000;">button_mask</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">8</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">],</span><span style="color: #000000;">button_mask</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"BTN%d "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">button_mask</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">2</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<!--
|
||||
40
Task/Joystick-position/PicoLisp/joystick-position.l
Normal file
40
Task/Joystick-position/PicoLisp/joystick-position.l
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
(load "@lib/openGl.l")
|
||||
|
||||
(setq *JoyX 0.0 *JoyY 0.0)
|
||||
|
||||
(glutInit)
|
||||
(glutInitDisplayMode (| GLUT_RGBA GLUT_DOUBLE GLUT_ALPHA GLUT_DEPTH))
|
||||
(glutInitWindowSize 400 400)
|
||||
(glutCreateWindow "Joystick")
|
||||
|
||||
(glClearColor 0.3 0.3 0.5 0)
|
||||
|
||||
(displayPrg
|
||||
(glClear GL_COLOR_BUFFER_BIT)
|
||||
(glBegin GL_LINES)
|
||||
(glVertex2f *JoyX (- *JoyY 0.1)) # Draw crosshair
|
||||
(glVertex2f *JoyX (+ *JoyY 0.1))
|
||||
(glVertex2f (- *JoyX 0.1) *JoyY)
|
||||
(glVertex2f (+ *JoyX 0.1) *JoyY)
|
||||
(glEnd)
|
||||
(glFlush)
|
||||
(glutSwapBuffers) )
|
||||
|
||||
# Track joystick position
|
||||
(native `*GlutLib "glutJoystickFunc" NIL
|
||||
(lisp 'joystickFunc
|
||||
'((Btn X Y Z)
|
||||
(msg # Display buttons
|
||||
(make
|
||||
(for (B 1 (n0 Btn) (inc B))
|
||||
(and (bit? 1 Btn) (link B))
|
||||
(setq Btn (>> 1 Btn)) ) ) )
|
||||
(setq # Move crosshair
|
||||
*JoyX (*/ X 1.0 1000)
|
||||
*JoyY (*/ Y 1.0 1000) )
|
||||
(glutPostRedisplay) ) )
|
||||
100 )
|
||||
|
||||
# Exit upon mouse click
|
||||
(mouseFunc '((Btn State X Y) (bye)))
|
||||
(glutMainLoop)
|
||||
72
Task/Joystick-position/PureBasic/joystick-position.basic
Normal file
72
Task/Joystick-position/PureBasic/joystick-position.basic
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
If InitJoystick() = 0
|
||||
MessageRequester("Error!", "Need to connect a joystick", #PB_MessageRequester_Ok)
|
||||
End
|
||||
EndIf
|
||||
|
||||
;some constants for Window positioning
|
||||
#WindowW = 100: #WindowH = 100
|
||||
#CrossW = 10
|
||||
#p1 = (#WindowW - #CrossW) / 2
|
||||
#p2 = (#WindowW / 2 - #CrossW)
|
||||
|
||||
If OpenWindow(0, 0, 0, #WindowW * 2 + 10, #WindowH, "Joystick Position", #PB_Window_SystemMenu)
|
||||
CreateImage(0, #WindowW, #WindowW)
|
||||
ImageGadget(0, 0, 0, 0, 0, ImageID(0))
|
||||
TextGadget(2, #WindowW + 5, 10, #WindowW, 20, "Buttons Pressed:")
|
||||
CreateImage(1, #WindowW, 40)
|
||||
ImageGadget(1, #WindowW + 5, 30, 0, 0, ImageID(1))
|
||||
|
||||
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 0)
|
||||
Define event, x_movement, y_movement
|
||||
Repeat
|
||||
Repeat
|
||||
event = WindowEvent()
|
||||
Select event
|
||||
Case #PB_Event_Menu
|
||||
If EventMenu() = 0
|
||||
End
|
||||
EndIf
|
||||
Case #PB_Event_CloseWindow
|
||||
End
|
||||
EndSelect
|
||||
Until event = 0
|
||||
|
||||
Define pressed.s, buttonNum, buttonX, buttonY, buttonText.s, buttonColor
|
||||
pressed.s = ""
|
||||
If ExamineJoystick(0)
|
||||
x_movement = JoystickAxisX(0)
|
||||
y_movement = JoystickAxisY(0)
|
||||
|
||||
StartDrawing(ImageOutput(1))
|
||||
DrawingMode(#PB_2DDrawing_Transparent)
|
||||
Box(0, 0, #WindowW, 50, RGB($D4, $D0, $C8)) ;a Gray
|
||||
; check to see if any of the buttons have been pressed
|
||||
For buttonNum = 1 To 10
|
||||
buttonX = ((buttonNum - 1) * 20 + 10) % #WindowW
|
||||
buttonY = ((buttonNum - 1) / 5) * 20 + 10
|
||||
If JoystickButton(0, buttonNum)
|
||||
buttonColor = RGB($FF, 0, 0) ;Red
|
||||
Else
|
||||
buttonColor = RGB($80, $80, $80) ;Gray
|
||||
EndIf
|
||||
Circle(buttonX, buttonY, 9, buttonColor)
|
||||
buttonText = Str(buttonNum)
|
||||
DrawText(buttonX - TextWidth(buttonText) / 2, buttonY - TextHeight(buttonText) / 2, buttonText, RGB($FF, $FF, $FF)) ;White
|
||||
Next
|
||||
StopDrawing()
|
||||
|
||||
SetGadgetState(1, ImageID(1))
|
||||
EndIf
|
||||
|
||||
|
||||
StartDrawing(ImageOutput(0))
|
||||
Box(0,0, #WindowW, #WindowW, RGB($FF, $FF, $FF)) ;White
|
||||
Line(#p1 + x_movement * #p2, #WindowW / 2 + y_movement * #p2, #CrossW, 1, RGB($FF, 0, 0)) ;Red
|
||||
Line(#WindowW / 2 + x_movement * #p2, #p1 + y_movement * #p2, 1, #CrossW, RGB($FF, 0, 0)) ;Red
|
||||
StopDrawing()
|
||||
|
||||
SetGadgetState(0, ImageID(0))
|
||||
|
||||
Delay(10)
|
||||
Until event = #PB_Event_CloseWindow
|
||||
EndIf
|
||||
73
Task/Joystick-position/Python/joystick-position.py
Normal file
73
Task/Joystick-position/Python/joystick-position.py
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
import sys
|
||||
import pygame
|
||||
|
||||
pygame.init()
|
||||
|
||||
# Create a clock (for framerating)
|
||||
clk = pygame.time.Clock()
|
||||
|
||||
# Grab joystick 0
|
||||
if pygame.joystick.get_count() == 0:
|
||||
raise IOError("No joystick detected")
|
||||
joy = pygame.joystick.Joystick(0)
|
||||
joy.init()
|
||||
|
||||
# Create display
|
||||
size = width, height = 600, 600
|
||||
screen = pygame.display.set_mode(size)
|
||||
pygame.display.set_caption("Joystick Tester")
|
||||
|
||||
# Frame XHair zone
|
||||
frameRect = pygame.Rect((45, 45), (510, 510))
|
||||
|
||||
# Generate crosshair
|
||||
crosshair = pygame.surface.Surface((10, 10))
|
||||
crosshair.fill(pygame.Color("magenta"))
|
||||
pygame.draw.circle(crosshair, pygame.Color("blue"), (5,5), 5, 0)
|
||||
crosshair.set_colorkey(pygame.Color("magenta"), pygame.RLEACCEL)
|
||||
crosshair = crosshair.convert()
|
||||
|
||||
# Generate button surfaces
|
||||
writer = pygame.font.Font(pygame.font.get_default_font(), 15)
|
||||
buttons = {}
|
||||
for b in range(joy.get_numbuttons()):
|
||||
buttons[b] = [
|
||||
writer.render(
|
||||
hex(b)[2:].upper(),
|
||||
1,
|
||||
pygame.Color("red"),
|
||||
pygame.Color("black")
|
||||
).convert(),
|
||||
# Get co-ords: ((width*slot)+offset, offset). Offsets chosen
|
||||
# to match frames.
|
||||
((15*b)+45, 560)
|
||||
]
|
||||
|
||||
while True:
|
||||
# Pump and check the events queue
|
||||
pygame.event.pump()
|
||||
for events in pygame.event.get():
|
||||
if events.type == pygame.QUIT:
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
# Black the screen
|
||||
screen.fill(pygame.Color("black"))
|
||||
|
||||
# Get joystick axes
|
||||
x = joy.get_axis(0)
|
||||
y = joy.get_axis(1)
|
||||
|
||||
# Blit to the needed coords:
|
||||
# x*amplitude+(centre offset (window size/2))-(xhair offset (xh size/2))
|
||||
screen.blit(crosshair, ((x*250)+300-5, (y*250)+300-5))
|
||||
pygame.draw.rect(screen, pygame.Color("red"), frameRect, 1)
|
||||
|
||||
# Get and display the joystick buttons
|
||||
for b in range(joy.get_numbuttons()):
|
||||
if joy.get_button(b):
|
||||
screen.blit(buttons[b][0], buttons[b][1])
|
||||
|
||||
# Write the display
|
||||
pygame.display.flip()
|
||||
clk.tick(40) # Limit to <=40 FPS
|
||||
104
Task/Joystick-position/Raku/joystick-position.raku
Normal file
104
Task/Joystick-position/Raku/joystick-position.raku
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
use experimental :pack;
|
||||
|
||||
# Joysticks generally show up in the /dev/input/ directory as js(n) where n is
|
||||
# the number assigned by the OS. E.G. /dev/input/js1 . In my particular case:
|
||||
|
||||
my $device = '/dev/input/js0';
|
||||
|
||||
my $exit = 0;
|
||||
|
||||
my $event-stream = $device.IO.open(:bin);
|
||||
my $js = $event-stream.Supply(:8size);
|
||||
|
||||
my %config; # joystick configuration: number of axes and buttons
|
||||
my %event; # global "joystick event"
|
||||
|
||||
%config<button>.push: 0;
|
||||
|
||||
my $callback = sub { update };
|
||||
|
||||
sub get-js-event ( $ev, &callback ) {
|
||||
exit if $exit;
|
||||
# 32 bit timestamp milliseconds. Allows easy checking for "double-click" button presses
|
||||
%event<timestamp> = $ev.subbuf(0, 4).reverse.unpack('N');
|
||||
|
||||
# 16 bit (signed int16) value of current control
|
||||
%event<value> = (my $v = $ev.subbuf(4, 2).unpack('S')) > 32767 ?? -65536 + $v !! $v;
|
||||
|
||||
# Two 8 bit integers, current event: control type, and control ID
|
||||
(%event<type>, %event<number>) = $ev.subbuf(6).unpack('CC');
|
||||
|
||||
# Process the event
|
||||
if %event<type> +& 128 { # initialing
|
||||
given %event<type> +& 3 { # enumeration of control inputs
|
||||
when 1 { %config<button>.push: %event<number> }
|
||||
when 2 { %config<axis>.push: %event<number> }
|
||||
}
|
||||
} else {
|
||||
# Optional callback subroutine to run every time a js event is received
|
||||
callback
|
||||
}
|
||||
}
|
||||
|
||||
# read events from the joystick driver asynchronously
|
||||
start react whenever $js { $js.act: { get-js-event($_, $callback) } }
|
||||
|
||||
# allow a short delay while driver initializes
|
||||
sleep .5;
|
||||
|
||||
# clean up on exit
|
||||
signal(SIGINT).tap: {
|
||||
print "\e[0m", "\n" xx 50, "\e[H\e[J\e[?25hWaiting for one more joystick event...\n";
|
||||
$exit = 1;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
use Terminal::ANSIColor;
|
||||
|
||||
my ($rows, $cols) = qx/stty size/.words; # get the terminal size
|
||||
|
||||
my $xhair = '╺╋╸';
|
||||
my $axis = '█';
|
||||
my @btext = %config<button>.map: { sprintf( "%2d", $_) };
|
||||
my @button = @btext.map: {color('bold white on_blue ') ~ $_ ~ color('reset')};
|
||||
my ($x, $y, $z) = ($rows/2).floor, ($cols/2).floor, 0;
|
||||
|
||||
sub update {
|
||||
given %event<type> {
|
||||
when 1 { # button event
|
||||
given %event<value> {
|
||||
when 0 { @button[%event<number>] = color('bold white on_blue ') ~ @btext[%event<number>] ~ color('reset') }
|
||||
when 1 { @button[%event<number>] = color('bold white on_green') ~ @btext[%event<number>] ~ color('reset') }
|
||||
}
|
||||
}
|
||||
when 2 { # axis events
|
||||
given %event<number> {
|
||||
when 0 { $y = ($cols / 2 + %event<value> / 32767 * $cols / 2).Int max 1 }
|
||||
when 1 { $x = ($rows / 2 + %event<value> / 32767 * $rows / 2).Int max 2 }
|
||||
when 2 { $z = (%event<value> / 32767 * 100).Int }
|
||||
default { } # only using the first 3 axes, ignore ant others
|
||||
}
|
||||
$x min= $rows - 1;
|
||||
$y min= $cols - 1;
|
||||
}
|
||||
}
|
||||
print "\e[H\e[J\e[1;1H";
|
||||
print " ", join " ", flat @button, "Axis 0: $x", "Axis 1: $y" , "Axis 2: $z%\n";
|
||||
my $bar = ($z / 100 * $cols / 2).floor;
|
||||
if $bar < 0 {
|
||||
print ' ' x ($bar + $cols / 2).floor, color('bold green') ~ $axis x -$bar ~ color('reset');
|
||||
} else {
|
||||
print ' ' x $cols / 2, color('bold green') ~ $axis x $bar ~ color('reset');
|
||||
}
|
||||
print "\e[{$x};{$y}H", color('bold yellow') ~ $xhair ~ color('reset');
|
||||
}
|
||||
|
||||
print "\e[?25l"; # hide the cursor
|
||||
update; # initial update
|
||||
|
||||
# Main loop, operates independently of the joystick event loop
|
||||
loop {
|
||||
once say " Joystick has {%config<axis>.elems} axes and {%config<button>.elems} buttons";
|
||||
sleep 1;
|
||||
($rows, $cols) = qx/stty size/.words;
|
||||
}
|
||||
43
Task/Joystick-position/Tcl/joystick-position.tcl
Normal file
43
Task/Joystick-position/Tcl/joystick-position.tcl
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package require Tk 8.6
|
||||
package require mkLibsdl
|
||||
|
||||
# This code assumes we're dealing with the first pair of axes on the first
|
||||
# joystick; modern joysticks are complex...
|
||||
|
||||
# Callback for all joystick activity
|
||||
proc display {joyDict} {
|
||||
global x y buttons message
|
||||
set axis -1
|
||||
dict with joyDict {
|
||||
if {$joystick != 0} return
|
||||
if {[info exist button]} {
|
||||
# Handle button presses...
|
||||
set buttons($button) $value
|
||||
set message "Buttons:"
|
||||
foreach b [lsort -integer [array names buttons]] {
|
||||
if {$buttons($b)} {
|
||||
lappend message $b
|
||||
}
|
||||
}
|
||||
} else {
|
||||
# Handle joystick movement...
|
||||
if {$axis == -1} return
|
||||
set value [expr {$value / 32768.0 * 100 + 120}]
|
||||
if {$axis == 0} {
|
||||
set x $value
|
||||
} elseif {$axis == 1} {
|
||||
set y $value
|
||||
}
|
||||
.c coords xhairV $x [expr {$y-5}] $x [expr {$y+5}]
|
||||
.c coords xhairH [expr {$x-5}] $y [expr {$x+5}] $y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Make a GUI
|
||||
set message "Buttons:"
|
||||
pack [canvas .c -width 240 -height 240] [label .l -textvariable message]
|
||||
set x [set y 120]
|
||||
.c create line {120 115 120 125} -tags xhairV
|
||||
.c create line {115 120 125 120} -tags xhairH
|
||||
joystick event eval {display [joystick event peek]}
|
||||
75
Task/Joystick-position/Wren/joystick-position.wren
Normal file
75
Task/Joystick-position/Wren/joystick-position.wren
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
import "input" for Keyboard, GamePad
|
||||
import "graphics" for Canvas, Color
|
||||
import "dome" for Window
|
||||
|
||||
var Buttons = [
|
||||
"left", "right", "up", "down", "A", "B", "X", "Y",
|
||||
"back", "start", "guide", "leftshoulder", "rightshoulder"
|
||||
]
|
||||
|
||||
var Symbols = ["L", "R", "U", "D", "A", "B", "X", "Y", "BK", "S", "G", "LS", "RS"]
|
||||
|
||||
class Main {
|
||||
construct new(width, height) {
|
||||
Window.resize(width, height)
|
||||
Canvas.resize(width, height)
|
||||
Window.title = "Joystick position"
|
||||
_w = width
|
||||
_h = height
|
||||
_dx = (width/100).floor
|
||||
_dy = (height/100).floor
|
||||
_gpd = GamePad.next
|
||||
}
|
||||
|
||||
init() {
|
||||
// start in center
|
||||
_x = _w / 2
|
||||
_y = _h / 2
|
||||
Canvas.cls(Color.yellow)
|
||||
showButtonStatus()
|
||||
Canvas.print("+", _x, _y, Color.red)
|
||||
}
|
||||
|
||||
update() {
|
||||
var dx = 0
|
||||
var dy = 0
|
||||
if (Keyboard.isKeyDown("left") || _gpd.getAnalogStick("left").x < -0.25) {
|
||||
dx = -_dx
|
||||
} else if (Keyboard.isKeyDown("right") || _gpd.getAnalogStick("left").x > 0.25) {
|
||||
dx = _dx
|
||||
} else if (Keyboard.isKeyDown("up") || _gpd.getAnalogStick("left").y < -0.25) {
|
||||
dy = -_dy
|
||||
} else if (Keyboard.isKeyDown("down") || _gpd.getAnalogStick("left").y > 0.25) {
|
||||
dy = _dy
|
||||
}
|
||||
moveCrossHair(dx, dy)
|
||||
}
|
||||
|
||||
moveCrossHair(dx, dy) {
|
||||
_x = _x + dx
|
||||
_y = _y + dy
|
||||
if (_x < 0) _x = 0
|
||||
if (_x > _w - 5) _x = _w - 5
|
||||
if (_y < 0) _y = 0
|
||||
if (_y > _h * 0.96 - 5) _y = _h * 0.96 - 5
|
||||
}
|
||||
|
||||
// show whether other gamepad keys are pressed by printing the corresponding symbol if they are.
|
||||
showButtonStatus() {
|
||||
Canvas.rectfill(0, _h * 0.96, _w, _h, Color.blue)
|
||||
var s = ""
|
||||
for (i in 0...Buttons.count) {
|
||||
var button = Buttons[i]
|
||||
if (_gpd.isButtonPressed(button)) s = s + " " + Symbols[i]
|
||||
}
|
||||
Canvas.print(s, 0, _h * 0.98, Color.white)
|
||||
}
|
||||
|
||||
draw(alpha) {
|
||||
Canvas.cls(Color.yellow)
|
||||
showButtonStatus()
|
||||
Canvas.print("+", _x, _y, Color.red)
|
||||
}
|
||||
}
|
||||
|
||||
var Game = Main.new(600, 600)
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
10 DIM o$(5)
|
||||
20 LET xm=0: LET xx=31: REM screen limits
|
||||
30 LET ym=0: LET yx=18
|
||||
40 LET xo=16: LET yo=9: REM origin
|
||||
50 LET xc=xo: LET yc=yo
|
||||
60 PRINT AT yc,xc;" ": REM entry point for scan loop - blank cursor
|
||||
70 LET xc=xo: LET yc=yo
|
||||
80 LET t=IN 31
|
||||
90 IF t=1 OR t=5 OR t=9 OR t=17 OR t=21 OR t=25 THEN LET xc=xx: LET o$(2)="R": REM right
|
||||
100 IF t=2 OR t=6 OR t=10 OR t=18 OR t=22 OR t=26 THEN LET xc=xm: LET o$(1)="L": REM left
|
||||
110 IF t=4 OR t=5 OR t=6 OR t=20 OR t=21 OR t=22 THEN LET yc=yx: LET o$(4)="D": REM down
|
||||
120 IF t=8 OR t=9 OR t=10 OR t=24 OR t=25 OR t=26 THEN LET yc=ym: LET o$(3)="U": REM up
|
||||
130 IF t>=16 THEN LET o$(5)="F": REM fire
|
||||
140 PRINT AT 21,0;"Input:";o$
|
||||
150 PRINT AT yc,xc;"+"
|
||||
160 LET o$=" ": REM five spaces to blank output line again
|
||||
170 GO TO 60
|
||||
Loading…
Add table
Add a link
Reference in a new issue