OpenGl et ExamineKeyboard() = error

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

OpenGl et ExamineKeyboard() = error

Message par SPH »

Salut a tous,

voici un code utilisant des polygones (ma passion actuelle).
J'ai un problème avec le keyboard car je n'utilise pas d'openscreen.
J'utilise OpenWindow et OpenGLGadget.

la fonction ExamineKeyboard() fait donc une erreur.

Je suppose qu'il y a une soluce OpenGL ?

PS : Sup "Goto no"

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitKeyboard()
InitSprite()

Global chemin$,sph_cmb,Dim sph_xx(1),Dim sph_yy(1),attente,attente_ok
Global numero,echelle_xf.f,echelle_yf.f,Resx,Resy,categorie$
Global Dim speedx.w(1,1),Dim speedy.w(1,1),pas
Global perso__x, perso__y, marcher__f.f,  marcher__zoom.f


;EnableExplicit

;-CONSTANTS
Enumeration
  #MainWindow
  #OpenGLGadget
EndEnumeration


ExamineDesktops()
ddw=DesktopWidth(0)
ddh=DesktopHeight(0)
mix=ddw/2
miy=ddh/2

;********************* DPI *********************
echelle_xf.f=(1920/ddw)*DesktopResolutionX()
echelle_yf.f=(1080/ddh)*DesktopResolutionY()
;**********************************************

;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = ddw
WindowDim\Y = ddh


;-DEFINES
Define.i Event
Define.i WindowFlags = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget


;-DECLARES
Declare Render()
Declare Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
Declare SetupOpenGL()
Declare SetupGLTexture(ImageHandle.i)


;-MAIN WINDOW
win=OpenWindow(#MainWindow, 0, 0,ddw,ddh, "Lecteur_polygons",#PB_Window_Maximize|#PB_Window_BorderLess)
If win=0
  ;   Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenWindow() impossible")
  End
EndIf

screenGL=OpenGLGadget(#OpenGLGadget,0,0,ddw,ddh)
If screenGL=0
  ;   Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenGLGadget() impossible")
  End
EndIf

dpix.f=DesktopResolutionX()
dpiy.f=DesktopResolutionY()

SetupOpenGL()

AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666) ; quitter
AddKeyboardShortcut(0,  #PB_Shortcut_Right, 667)  ; droite
AddKeyboardShortcut(0,  #PB_Shortcut_Left, 668)   ; gauche


glOrtho_(0,ddw,ddh,0,-1,1)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
glClear_(0)

;*********************************************************************************************************************************

;;;;;;;;;;;
SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
;{
Procedure.i OpenGLDrawText(Gadget.i, x.f, y.f, Text$, Textcolor=#White)
  
  Protected Image.i, TextWidth.i, TextHeight.i, Result.i, tmpy.f
  
  
  Image = CreateImage(#PB_Any, 1, 1)
  If Image
    If StartDrawing(ImageOutput(Image))
      TextWidth = TextWidth(Text$)
      TextHeight = TextHeight(Text$)
      StopDrawing()
      
      If ResizeImage(Image, TextWidth, TextHeight)
        If StartDrawing(ImageOutput(Image))
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText(0, 0, Text$, Textcolor)
          
          tmpy = y - (1 / GadgetHeight(Gadget) * TextHeight * 2)
          
          glRasterPos2f_(x, tmpy)
          glDrawPixels_(TextWidth, TextHeight, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, DrawingBuffer())
          
          Result = #True
          
          StopDrawing()
        EndIf
      EndIf
      
    EndIf
    FreeImage(Image)
  EndIf
  
  ProcedureReturn Result
  
EndProcedure


Procedure Render()
  
  ;Clearing buffers and resetting clear color to remove old graphics from the last frame.
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  ;  glClearColor_(0.2, 0.2, 0.2, 1.0)
  glClearColor_(0,0,0,1)
  
  ;## DRAWING TEXTURES/IMAGES
  ;First enable the Texture system.
  glEnable_(#GL_TEXTURE_2D)
  
  ;This procedure will create a quad and apply a texture to it.
  ;The Texture variable contains the texture created earlier using SetupGLTexture().
  Render2DQuad(Texture1, 0, 0, ImageWidth(Image1), ImageHeight(Image1), -2)
  ; Render2DQuad(Texture2, 0, 0, ImageWidth(Image2), ImageHeight(Image2), -1)
  
  ;After all the textures have been displayed disable the texture system.
  ;Otherwise it will conflict with the non texture graphics.
  glDisable_(#GL_TEXTURE_2D)
  
EndProcedure
Procedure Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
  
  ;The texture is first bound which tells OpenGL to use this texture for any future rendering.
  glBindTexture_(#GL_TEXTURE_2D, OGLTexture)
  glBegin_(#GL_QUADS)
  glColor4f_   (1,1,1,1)
  glNormal3f_  (0,0,1.0)
  glTexCoord2f_(1.0,1.0)
  glVertex3f_  (StartX+Width,StartY,Z)
  glTexCoord2f_(0.0,1.0)
  glVertex3f_  (StartX,StartY,Z)
  glTexCoord2f_(0.0,0.0)
  glVertex3f_  (StartX,StartY+Height,Z)
  glTexCoord2f_(1.0,0.0)
  glVertex3f_  (StartX+Width,StartY+Height,Z)
  glEnd_()
  
EndProcedure
Procedure SetupOpenGL()
  
  glMatrixMode_(#GL_PROJECTION)
  
  glOrtho_(0.0, WindowDim\X, WindowDim\Y, 0.0, -1000.0, 1000.0)
  
  glMatrixMode_(#GL_MODELVIEW)
  
  ; glEnable_(#GL_DEPTH_TEST)
  
  glEnable_(#GL_BLEND)
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
  
EndProcedure

Procedure load_poly_data(categorie$,pol) ; ne jamais appeller un polygon "0.pol"
  If attente_ok=0 Or attente_ok<>pol
    attente_ok=pol
    Dim sph_xx(574)
    Dim sph_yy(574)
    
    For i=1 To 574/2
      Read.w sph_xx(i-1)
      Read.w sph_yy(i-1)
    Next
  EndIf
  
EndProcedure




Procedure affiche_poly_old(xxx,yyy,angle.f,dkx,dky,zoom.f,alpha.f)
  sph_cmb=sph_yy(0)
  sph_la=0
  Repeat
    glBegin_(#GL_POLYGON)
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    glColor4f_(sph_xx(sph_la+1)/255,sph_yy(sph_la+1)/255,sph_xx(sph_la+2)/255,(sph_yy(sph_la+2)/255)*alpha)
    ;;;;;;
    For i=3 To sph_cmb-1
      sph_xxx.f=(sph_xx(sph_la+i)/echelle_xf)-xxx
      sph_yyy.f=(sph_yy(sph_la+i)/echelle_yf)-yyy
      sq.f=Sqr(sph_xxx*sph_xxx+sph_yyy*sph_yyy)
      ff.f = ATan2(sph_xxx,sph_yyy)+angle ; par Nemerod (sans lui, je n'y serai pas arrivé)
      centre_x=xxx+Cos(ff)*sq*zoom
      centre_y=yyy+Sin(ff)*sq*zoom
      glVertex2f_(centre_x+dkx,centre_y+dky);
    Next
    ;;;;;;;
    glEnd_()                      ; 
    sph_cmb=sph_yy(sph_la+i)
    sph_la+i
  Until sph_yy(sph_la)=0
  ;;;;;;;;;;;;;;;
EndProcedure

Procedure gestion()
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
            Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
            ;;;;;;;         
            Select EventType()
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             
            EndSelect
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 666
            End
            
          Case 667
            pas+1
            If pas>16
              pas=1
            EndIf
            perso__x+marcher__f
            
          Case 668
            pas-1
            If pas<1
              pas=16
            EndIf
            perso__x-marcher__f
            
        EndSelect
    EndSelect
    
  Until Event = 0
EndProcedure
;}

;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
tourne.f=0
move.f=0.005
load_poly_data("monstre",1)
;;;
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
Repeat
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  gestion()
  
  ;;;;;;
  ;;;;;;
  ;;;;;;
  
  Goto no ; a supprimer
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_Left)
    move-0.0001  
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    move+0.0001  
  EndIf
  no:
  
  ;;;;;;
  ;;;;;;
  ;;;;;;
  
  affiche_poly_old(mix,miy,tourne,0,0,1,1)
  
  SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
  
  tourne+move
  
ForEver

End


DataSection
  Data.w 28,7,37,39,60,255,1919,0,1919,1079,0,1079,0,0,0,20,51,71,115,255
  Data.w 1908,589,1919,588,1919,813,1831,815,1772,833,1717,899,1528,946,1519,966,333,961,269,883
  Data.w 259,820,0,823,0,115,74,112,139,42,246,0,1869,0,0,10,51,71,115,255
  Data.w 0,801,0,963,67,964,213,886,211,847,267,814,157,775,0,19,61,82,141,255
  Data.w 236,0,155,544,162,598,300,818,343,825,348,643,380,646,713,881,1185,857,1267,816
  Data.w 1424,846,1577,814,1689,594,1695,540,1648,320,1629,0,0,9,61,82,141,255,700,861
  Data.w 723,900,485,900,427,844,398,838,381,672,0,7,61,82,141,255,616,816,381,674
  Data.w 379,618,611,775,0,22,64,110,239,255,380,0,256,255,235,333,257,496,363,646
  Data.w 380,648,412,705,606,750,630,710,646,711,695,734,1155,749,1211,720,1234,697,1384,661
  Data.w 1512,514,1509,354,1391,199,1344,0,0,6,64,110,239,255,1200,734,1179,768,1226,732
  Data.w 0,6,64,110,239,255,1519,641,1569,429,1590,426,0,7,64,110,239,255,1590,428
  Data.w 1542,271,1524,283,1567,437,0,7,64,110,239,255,1352,2,1407,123,1420,127,1362,0
  Data.w 0,7,64,110,239,255,1408,123,1523,285,1542,274,1422,129,0,14,0,138,255,255
  Data.w 388,0,307,205,290,355,342,524,556,625,1148,689,1352,602,1517,498,1504,342,1389,195
  Data.w 1345,0,0,17,0,0,4,255,528,958,448,1010,689,1010,643,706,600,607,648,161
  Data.w 551,233,506,354,436,415,420,496,390,516,382,552,406,618,412,700,0,7,0,0
  Data.w 4,255,0,1010,0,1079,1919,1071,1919,1009,0,10,0,0,4,255,680,980,725,951
  Data.w 936,887,913,956,924,989,927,1013,678,1031,0,18,0,0,4,255,932,889,1256,590
  Data.w 1425,402,1358,342,1305,237,1226,160,1169,41,1038,12,806,11,719,42,644,171,599,556
  Data.w 632,592,745,898,722,962,0,6,0,0,4,255,642,577,588,621,586,514,0,14
  Data.w 0,0,4,255,949,945,911,812,1256,571,1257,590,1154,742,1123,893,1123,948,1174,966
  Data.w 1189,1022,935,1033,931,964,0,17,0,0,4,255,1217,975,1161,1002,1178,1069,1412,1038
  Data.w 1405,1001,1368,976,1444,765,1466,602,1494,533,1483,491,1454,477,1423,400,1279,622,1229,768
  Data.w 0,7,0,0,4,255,1280,625,1249,577,1421,400,1425,407,0,7,0,0,4,255
  Data.w 109,1065,1919,1042,1919,1079,15,1079,0,7,188,148,130,255,943,514,937,579,945,579
  Data.w 959,512,0,7,188,148,130,255,907,664,898,705,913,705,914,663,0,7,188,148
  Data.w 130,255,847,688,830,688,837,641,844,643,0,7,188,148,130,255,817,503,831,539
  Data.w 837,538,833,502,0,7,108,25,0,255,789,437,795,453,810,456,806,437,0,7
  Data.w 108,25,0,255,966,423,961,439,979,440,985,425,0,0
EndDataSection
Merci d'avance... 8O

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: OpenGl et ExamineKeyboard() = error

Message par venom »

Salut sph.

tu dois utilisé la fonction EventType() ainsi que #PB_EventType_KeyDown pour renvoyer la touche enfoncer

et aussi que tu dois ajouter la fonction #PB_OpenGL_Keyboard dans les options de ton OpenGLGadget()

:wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: OpenGl et ExamineKeyboard() = error

Message par venom »

Je me doute que tu préfère un code :wink:

Le voici :

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 400, 300, "Détection de touche dans OpenGLGadget")
    OpenGLGadget(0, 10, 10, 380, 280, #PB_OpenGL_Keyboard)

    Repeat
        Event = WaitWindowEvent()
        
        If Event = #PB_Event_Gadget
            GadgetID = EventGadget()
            GadgetEvent = EventType()
            
            If GadgetID = 0 And GadgetEvent = #PB_EventType_KeyDown
                ; Récupération de la touche pressée
                Key = GetGadgetAttribute(0, #PB_OpenGL_Key)
                Debug "Touche pressée : " + Chr(Key) + " (Code : " + Str(Key) + ")"
            EndIf
        EndIf
        
    Until Event = #PB_Event_CloseWindow
EndIf
Ps: oublie pas de cliqué dans l'OpenGl avec ta souris avant d'essayé et de crier au scandale que ça ne fonctionne pas :roll:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: OpenGl et ExamineKeyboard() = error

Message par SPH »

Grand merci Venom !

...mais j'ai besoin d'une solution qui ne laisse aucun temps de latence entre l'appuie et la répétition de la touche.
Voici ce que je cherche :
https://www.purebasic.fr/french/viewtopic.php?t=19292
...mais en openGL.

Tu vois ce que je veux dire ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: OpenGl et ExamineKeyboard() = error

Message par nemerod »

venom a écrit : ven. 13/déc./2024 22:24 Je me doute que tu préfère un code :wink:

Le voici :

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 400, 300, "Détection de touche dans OpenGLGadget")
    OpenGLGadget(0, 10, 10, 380, 280, #PB_OpenGL_Keyboard)

    Repeat
        Event = WaitWindowEvent()
        
        If Event = #PB_Event_Gadget
            GadgetID = EventGadget()
            GadgetEvent = Eve...
ERREUR DE FONCTION a la ligne relatif 5, WaitWindowEvent n'est pas conseillé si les action doivent etre asyncrone, voir note plus bas pour solution fiable


SPH a écrit : sam. 14/déc./2024 16:45 Grand merci Venom !

...mais j'ai besoin d'une solution qui ne laisse aucun temps de latence entre l'appuie et la répétition de la touche.
Voici ce que je cherche :
https://www.purebasic.fr/french/viewtopic.php?t=19292
...mais en openGL.

Tu vois ce que je veux dire ?
bah justement on va en parlé de cela, ExamineKeyboard() n'a pas de probleme avec OpenGL, juste que la boucle principal se stop si il y a aucun event
traduction > tu appuis sur un bouton, la boucle se fais 1 fois, puis va attendre le prochaine event, en meme temps le SYSTEM, lui fais un delay pour la répétition car il n'a aucun idée de se que tu fais avec ton programme, donc il fais tous normallement, ENSUIT, des que le systeme a fais sont timer, il lance les event de répétition a ton programme qui du coup fais le spam, donc selon les setting et la vitesse, le temps de latence n'est pas le meme pour tous le monde et la vitesse de répétition non plus

POUR FINIR, ExamineKeyboard() a vraiment un problem, il oublie des bouton si le programme est un peu saturé ou trop lent, donc des event passe a la poubelle, il ne prendre donc pas 100% les action au clavier

je te propose la meme chose que sur discord, un code qui prendre en compte clavier/souri et le support de 16 manette SANS AUCUN utilisation d'un
  • InitJoystick
  • InitKeyboard
  • InitMouse
    ou bien un truc comme un
  • ExamineJoystick
  • ExamineKeyboard
  • ExamineMouse

donc solution

Code : Tout sélectionner

Global.q *key,key_internal_a.q,key_internal_temp.q:*key=AllocateMemory($2000)
Procedure KeyUpdate(id_event):key_internal_a=EventwParam()
  If (EventlParam()&$C0000000)<>$40000000
    !movzx r10,byte [v_key_internal_a]
    !mov   rax,     1 
    !add   r10,[p_key]
    !mov   r11, r10   
    !mov   r12, r11   
    !mov   r13, r12   
    !add   r10, $0000 
    !add   r11, $0100 
    !add   r12, $0200 
    !add   r13, $0300 
    !mov rcx,[p.v_id_event]
    !cmp rcx,$102; O
    !je key_set_2
    !cmp rcx,$100; D
    !je key_set_1
    !cmp rcx,$104
    !je key_set_1
    !cmp rcx,$101; U
    !je key_set_0
    !cmp rcx,$105
    !je key_set_0
    !jmp key_set_end
    !key_set_0:;multi return selector
    !xor rax,rax
    !mov r11,r12
    !key_set_1:
    !mov byte[r10], al;pokea $000
    !mov byte[r11],$01;pokea mux($100,$200)
    !mov byte[r13],$01;pokea $300
    !key_set_2:
    !xor  rax,$1000101
    ProcedureReturn
    !key_set_end:
  EndIf
  !mov rcx,[p.v_id_event]
  !mov   r10,[p_key]
  !mov rax,$100020001;mouse M clic F
  !cmp rcx,$200
  !je key_mov_1
  !inc r10
  !mov rax,$100020101;mouse D clic 0
  !cmp rcx,$201
  !je key_mov_1
  !cmp rcx,$203
  !je key_mov_1
  !mov rax,$100020201;mouse U clic 0
  !cmp rcx,$202
  !je key_mov_0
  !inc r10
  !mov rax,$100020401;mouse D clic 1
  !cmp rcx,$204
  !je key_mov_1
  !cmp rcx,$206
  !je key_mov_1
  !mov rax,$100020501;mouse U clic 1
  !cmp rcx,$205
  !je key_mov_0
  !inc r10
  !mov rax,$100020701;mouse D clic 2
  !cmp rcx,$207
  !je key_mov_1
  !cmp rcx,$209
  !je key_mov_1
  !mov rax,$100020801;mouse U clic 3
  !cmp rcx,$208
  !je key_mov_0
  !inc r10
  !mov rax,$100020a01;mouse O clic 3
  !cmp rcx,$20A
  !je key_mov_1
  !jmp key_mov_end;skip to joy
  !key_mov_0:
  !xor al,al
  !mov   r11,r10
  !mov   r12,r11
  !mov   r13,r12
  !add   r10, $0000 
  !add   r11, $0100 
  !add   r12, $0200 
  !add   r13, $0300 
  !mov byte[r10],$00;pokea $000
  !mov byte[r12],$01;pokea mux($100,$200)
  !mov byte[r13],$01;pokea $300
  !shr rax,8
  ProcedureReturn
  !key_mov_1:
  !mov   r11,r10
  !mov   r12,r11
  !mov   r13,r12
  !add   r10, $0000 
  !add   r11, $0100 
  !add   r12, $0200 
  !add   r13, $0300 
  !mov byte[r10],$01;pokea $000
  !mov byte[r11],$01;pokea mux($100,$200)
  !mov byte[r13],$01;pokea $300
  !shr rax,8
  ProcedureReturn
  !key_mov_end:
  PokeQ(*key+$400,$FF00000100)
  !cmp qword[p.v_id_event],0
  !jne key_event_end
  For key_internal_a = 0 To 15
    temp=joyGetPosEx_(key_internal_a,*key+$400)
    !xor r10,r10;pre-clear
    !xor r11,r11
    !xor r12,r12
    !xor rcx,rcx
    !mov r15,[p_key];quick load
    !mov r14,r15
    !mov  ch,byte [v_key_internal_a]
    !add r15,$1000
    !add r14,$0400
    !add r15,rcx;5 variable done minimal opcode
    !mov rbx,[v_key_internal_temp]
    !cmp rbx,$A5;#JOYERR_PARMS
    !je  key_clear_2
    !cmp rbx,$06;#MMSYSERR_NODRIVER
    !je  key_clear_2
    !cmp rbx,$0B;#MMSYSERR_INVALPARAM
    !je  key_clear_2
    !cmp rbx,$02;#MMSYSERR_BADDEVICEID
    !je  key_clear_2
    !cmp rbx,$A7;#JOYERR_UNPLUGGED
    !je  key_clear_1
    !cmp rbx,$00;#JOYERR_NOERROR
    !jne key_clear_1
    !mov r10,rcx;control OK, update flag/16
    !mov r11,[r15+$f8];F1 = flag tick
    !bts r10,0
    !inc r11
    !mov [r15+$f0],r10;F0 = flag primaire 
    !mov [r15+$f8],r11;F1 = flag tick
    !or qword[p.v_id_event],$2000000
    !mov r10,[r14+$20];process data button unpacked
    !mov rcx,31
    !@@:
    !bt r10,rcx
    !setc [r15+rcx]
    !dec rcx
    !jns @b;unload
    !mov    r10w    ,[r14+$08] ; control X all axe
    !mov    r11w    ,[r14+$18] ;
    !xor    r12,r12            ;unused yet
    !xor    r13,r13            ;unused yet 2
    !add    r10     ,     $8000;
    !add    r11     ,     $8000;
    !add    r12     ,     $8000;
    !add    r13     ,     $8000;
    !movsx  r10     , r10w     ;
    !movsx  r11     , r11w     ;
    !movsx  r12     , r12w     ;
    !movsx  r13     , r13w     ;
    !sar    r10     ,         5; DONE
    !sar    r11     ,         5; DONE
    !sar    r12     ,         5; DONE
    !sar    r13     ,         5; DONE
    !mov   [r15+$20], r10      ;
    !mov   [r15+$28], r11      ;
    !mov   [r15+$30], r12      ;
    !mov   [r15+$38], r13      ;
    !mov    r10w    ,[r14+$0C] ; control Y all axe
    !mov    r11w    ,[r14+$14] ;
    !xor    r12,r12            ;unused yet
    !xor    r13,r13            ;unused yet 2
    !add    r10     ,     $8000;
    !add    r11     ,     $8000;
    !add    r12     ,     $8000;
    !add    r13     ,     $8000;
    !movsx  r10     , r10w     ;
    !movsx  r11     , r11w     ;
    !movsx  r12     , r12w     ;
    !movsx  r13     , r13w     ;
    !sar    r10     ,         5; DONE
    !sar    r11     ,         5; DONE
    !sar    r12     ,         5; DONE
    !sar    r13     ,         5; DONE
    !mov   [r15+$40], r10      ;
    !mov   [r15+$48], r11      ;
    !mov   [r15+$50], r12      ;
    !mov   [r15+$58], r13      ;
    !mov    r10w    ,[r14+$28] ; control Z all axe
    !mov    r11w    ,[r14+$10] ;
    !xor    r12     , r12      ;unused yet
    !xor    r13     , r13      ;unused yet 2
    !add    r10     ,     $8000;
    !add    r11     ,     $8000;
    !add    r12     ,     $8000;
    !add    r13     ,     $8000;
    !movsx  r10     , r10w     ; TODO ?
    !movsx  r11     , r11w     ; TODO ?
    !movsx  r12     , r12w     ; TODO ?
    !movsx  r13     , r13w     ; TODO ?
    !sar    r10     ,         5; DONE
    !sar    r11     ,         5; DONE
    !sar    r12     ,         5; DONE
    !sar    r13     ,         5; DONE
    !mov   [r15+$60], r10      ;
    !mov   [r15+$68], r11      ;
    !mov   [r15+$70], r12      ;
    !mov   [r15+$78], r13      ;
    !jmp key_clear_end
    !key_clear_1:;post-clear
    !mov r10,$0000000000000000
    !mov r11,$ffffffffffffffff
    !mov r12,$fffffffffffffc00
    !key_clear_2:;ULTRA CLEAR in BATCH !!!! 
    !mov [r15+$00],r10;B8 = button byte     
    !mov [r15+$08],r10;B8 = button byte     
    !mov [r15+$10],r10;B8 = button byte     
    !mov [r15+$18],r10;B8 = button byte     
    !mov [r15+$f0],r10;F0 = flag primaire   
    !mov [r15+$f8],r11;F1 = flag tick       
    !mov [r15+$20],r12;X0 = stick           ;If eee=$113:eee=0:EndIf
    !mov [r15+$28],r12;X1 = stick           ;If eee=$3A0:eee=0:EndIf
    !mov [r15+$30],r12;X2 = stick           ;If eee=$3A2:eee=0:EndIf
    !mov [r15+$38],r12;X3 = stick           ;If eee=$3A5:eee=0:EndIf;button PM$F event
    !mov [r15+$40],r12;Y0 = stick           ;If eee=$3A7:eee=0:EndIf;button RM$F event
    !mov [r15+$48],r12;Y1 = stick           ;If eee=$0A5:eee=0:EndIf;INV KJOY
    !mov [r15+$50],r12;Y2 = stick           
    !mov [r15+$58],r12;Y3 = stick           
    !mov [r15+$60],r12;Z0 = stick           
    !mov [r15+$68],r12;Z1 = stick           
    !mov [r15+$70],r12;Z2 = stick           
    !mov [r15+$78],r12;Z3 = stick           
    !key_clear_end:
  Next
  !key_event_end:
  ProcedureReturn id_event
EndProcedure
Procedure KeyPushed(       a)
  !mov    bl,[p.v_a];PeekA(*key+( a&$ff)     )
  !movzx rbx,bl
  !add   rbx,[p_key]
  !mov    al,[rbx]
  !movzx rax,al
  ProcedureReturn 
EndProcedure
Procedure KeyReleased(     a)
  !mov    bl,[p.v_a];PeekA(*key+( a&$ff)     )!1
  !movzx rbx,bl
  !add   rbx,[p_key]
  !mov    al,[rbx]
  !xor al,$01
  !movzx rax,al
  ProcedureReturn 
EndProcedure
Procedure KeyEventPushed(  a)
  !mov    bl,[p.v_a];r0=PeekA(*key+(a&$ff)+$100)
  !movzx rbx,bl
  !add   rbx,[p_key];PokeA(*key+(a&$ff)+$100,0)
  !add   rbx,$100
  !mov    al,[rbx]
  !movzx rax,al
  !mov byte[rbx],$00
  ProcedureReturn 
EndProcedure
Procedure KeyEventReleased(a)
  !mov    bl,[p.v_a];r0=PeekA(*key+(a&$ff)+$200)
  !movzx rbx,bl
  !add   rbx,[p_key];PokeA(*key+(a&$ff)+$200,0)
  !add   rbx,$200
  !mov    al,[rbx]
  !movzx rax,al
  !mov byte[rbx],$00
  ProcedureReturn 
EndProcedure
Procedure KeyEventSwitch(  a)
  !mov    bl,[p.v_a];r0=PeekA(*key+(a&$ff)+$300)
  !movzx rbx,bl
  !add   rbx,[p_key];PokeA(*key+(a&$ff)+$300,0)
  !add   rbx,$300
  !mov    al,[rbx]
  !movzx rax,al
  !mov byte[rbx],$00
  ProcedureReturn 
EndProcedure
Procedure JoyPushed(index,button)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_button]
  !and    ax,$0f1f
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1000
  !mov    al,[rax]
  !movzx rax,al
  ProcedureReturn 
EndProcedure
Procedure JoyReleased(index,button)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_button]
  !and    ax,$0f1f
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1000
  !mov    al,[rax]
  !movzx rax,al
  !xor al,1
  ProcedureReturn 
EndProcedure
Procedure JoyX(index,sub=0)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_sub]
  !and    ax,$0f03
  !shl    al,3 ;factor scale to PB
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1020
  !mov   rax,[rax]
  ProcedureReturn 
EndProcedure
Procedure JoyY(index,sub=0)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_sub]
  !and    ax,$0f03
  !shl    al,3 ;factor scale to PB
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1040
  !mov   rax,[rax]
  ProcedureReturn 
EndProcedure
Procedure JoyZ(index,sub=0)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_sub]
  !and    ax,$0f03
  !shl    al,3 ;factor scale to PB
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1060
  !mov   rax,[rax]
  ProcedureReturn 
EndProcedure

c'est une sorte de gros code a placé au début, ne fais pas de modification sans savoir se que vous faite, le nom des fonction et les argument sont je pense claire

voila un cas d'exemple de mise en pratique

Code : Tout sélectionner

OpenWindow(0,100,100,1280,256,""):RemoveKeyboardShortcut(0,#PB_Shortcut_All)
CanvasGadget(0,0,0,1280,512)
Repeat:Event=WindowEvent()
  KeyUpdate(Event)
  If Event=0
    StartDrawing(CanvasOutput(0))
    For a = 0 To 255
      Box(((a&$0f)<<4)     ,a&$f0,16,16,KeyPushed(a)       *255)
      Box(((a&$0f)<<4)+ 256,a&$f0,16,16,KeyReleased(a)     *255)
      Box(((a&$0f)<<4)+ 512,a&$f0,16,16,KeyEventPushed(a)  *255)
      Box(((a&$0f)<<4)+ 768,a&$f0,16,16,KeyEventReleased(a)*255)
      Box(((a&$0f)<<4)+1024,a&$f0,16,16,KeyEventSwitch(a)  *255)
    Next
    For a = 0 To 31
      Box(((a&$0f)<<4)     ,a&$f0, 8, 8,(JoyPushed(0,a)*$ffff)!$000000ff)
    Next
    a=0
    For a = 0 To 3
      Box(((a&$0f)<<4)+8  ,128,1,JoyX(0,a)>>3,$ffffffff)
      Box(((a&$0f)<<4)+264,128,1,JoyY(0,a)>>3,$ffffffff)
      Box(((a&$0f)<<4)+520,128,1,JoyZ(0,a)>>3,$ffffffff)
    Next
    StopDrawing()
    Delay(16)
    
  EndIf
Until Event=#PB_Event_CloseWindow
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: OpenGl et ExamineKeyboard() = error

Message par SPH »

Hummm, je suis sur PB 6.12

...et ça ne marche pas.
Je sais que tu es en PB 5.73-

Bref, j'aurais plutôt aimé 3 ou 4 lignes de code à ajouter facilement à mon code...

Mais, merci quand même. :lol:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: OpenGl et ExamineKeyboard() = error

Message par nemerod »

la raison de pourquoi cela ne marche pas n'est pas donné, une petit explication de pourquoi, je tien a précisé que la version DEMO ou la version 32bit et que le code est prévus pour une platforme windows 64bit, je sais que le code marche avec la dernier version de PB, donc une explication de pourquoi cela ne marche pas, aurai etais cool ;)
placé le code dans un module ne peu garantir sont fonctionnement, changé ou faire une copie partiel ou changé le nom des variable peu posé probleme, l'utilisation du flag pour du multi thread est aussi conseillé, si moi j'y arrive et que d'autre personne on aussi reussi et l'on utilisé, c'est qu'il y a pas de probleme

ensuit si tu veux vraiment avoir un truc un peu plus correct, tu peu deja oublier le waitwindowsevent et passé sur le windowsevent et te faire tes propre fonction comme je les fais pour avoir le statut des bouton sans latence

moi je suis passé par les event pour etre sur a 100% de grab tous les action avec le minimum de latence

les 3 a 4 ligne ne sont viable que si tu tape les bonne, donc on va reprendre strictement ton code et faire une base un peu plus fiable, il ne reste que a prendre en compte quant le bouton est laché

Code : Tout sélectionner

If OpenWindow(0,100,100,400,300,"Détection de touche pas dans OpenGLGadget")=0:End:EndIf
OpenGLGadget(0,10,10,380,280)
Repeat
  Event = WindowEvent()
  Key   = EventwParam()
  Select Event
    Case $000:Delay(10);aucun event, faire le rendu au propre ici
    Case $100,$104;save le code dans une table avec la valeur 1 pour savoir si le bouton est actif pour ta boucle
      Debug "Touche pressée : " + Chr(Key) + " (Code : " + Str(Key) + ")"
    Case $101,$105;save le code dans la meme table mais avec un zero pour ensuit utilisé la table, c'est se que fais l'autre code avec les procedure dans le 2eme block de texte https://www.purebasic.fr/french/viewtopic.php?p=218280#p218280
      Debug "Touche relaché : " + Chr(Key) + " (Code : " + Str(Key) + ")"
    Default;autre event non prise en compte
  EndSelect
Until Event = #PB_Event_CloseWindow
donc explication de pourquoi cela ne marche pas serai cool ;)

PS: je suis avec la version 5.21 LTS 64x modifier
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: OpenGl et ExamineKeyboard() = error

Message par SPH »

nemerod a écrit : dim. 15/déc./2024 1:47

Code : Tout sélectionner

If OpenWindow(0,100,100,400,300,"Détection de touche pas dans OpenGLGadget")=0:End:EndIf
OpenGLGadget(0,10,10,380,280)
Repeat
  Event = WindowEvent()
  Key   = EventwParam()
  Select Event
    Case $000:Delay(10);aucun event, faire le rendu au propre ici
    Case $100,$104;save le code dans une table avec la valeur 1 pour savoir si le bouton est actif pour ta boucle
      Debug "Touche pressée : " + Chr(Key) + " (Code : " + Str(Key) + ")"
    Case $101,$105;save le code dans la meme table mais avec un zero pour ensuit utilisé la table, c'est se que fais l'autre code avec les procedure dans le 2eme block de texte https://www.purebasic.fr/french/viewtopic.php?p=218280#p218280
      Debug "Touche relaché : " + Chr(Key) + " (Code : " + Str(Key) + ")"
    Default;autre event non prise en compte
  EndSelect
Until Event = #PB_Event_CloseWindow
Merci pour ton nouveau code. Mais il y a toujours ce temps de latence que je veux éviter !
Imagine, tu es sur Notepad++ : tu laisse appuyer la touche A. Un A va s'afficher, puis une pause de quelques millisecondes, puis AAAAAAAAAAAAAA.
Et bien là, c'est helas pareil. Moi, je souhaiterais un A continu dès l'appuie de la touche et sans cette pause de traitement de texte...
nemerod a écrit : dim. 15/déc./2024 1:47 la raison de pourquoi cela ne marche pas n'est pas donné, une petit explication de pourquoi

donc explication de pourquoi cela ne marche pas serai cool ;)

PS: je suis avec la version 5.21 LTS 64x modifier
L'erreur est :
"Ligne 1: Les types natifs ne peuvent pas etre utilisees avec des pointeurs."

Vala vala :wink:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: OpenGl et ExamineKeyboard() = error

Message par falsam »

J'ai rencontré ton souci il y a longtemps et je l'ai évoqué sur ce lien.
:arrow: https://www.purebasic.fr/french/viewtopic.php?t=17623

Crisot te donnera quelques explications.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: OpenGl et ExamineKeyboard() = error

Message par nemerod »

SPH a écrit : dim. 15/déc./2024 7:15
nemerod a écrit : dim. 15/déc./2024 1:47

Code : Tout sélectionner

;lot of code
Merci pour ton nouveau code. Mais il y a toujours ce temps de latence que je veux éviter !
Imagine, tu es sur Notepad++ : tu laisse appuyer la touche A. Un A va s'afficher, puis une pause de quelques millisecondes, puis AAAAAAAAAAAAAA.
Et bien là, c'est helas pareil. Moi, je souhaiterais un A continu dès l'appuie de la touche et sans cette pause de traitement de texte...
nemerod a écrit : dim. 15/déc./2024 1:47 la raison de pourquoi cela ne marche pas n'est pas donné, une petit explication de pourquoi

donc explication de pourquoi cela ne marche pas serai cool ;)

PS: je suis avec la version 5.21 LTS 64x modifier
L'erreur est :
"Ligne 1: Les types natifs ne peuvent pas etre utilisees avec des pointeurs."

Vala vala :wink:
Alors, il semble que purebasic sois vraiment tres con sur ton ordinateur, car pour moi, les pointeur ne peuvent avoir de type, mais de la a faire se message comme quoi il vois que c'est un pointeur, mais il n'a pas prise en compte qu'il y a le mot clef GLOBAL au debut de la ligne

purebasic -1

donc je vais te proposé une version qui va juste bypass se probleme et donc rendre un pavé de code encors moins digest

j'ai juste viré 2 lettre qui etais collé au mot clef Global qui est trop con car il sais que les pointeur ne peuvent avoir de type, il devrai juste skip et ne pas dire le message, ah mais attent, c'est se qu'il fais dans les version passé

Code : Tout sélectionner

Global *key,key_internal_a.q,key_internal_temp.q:*key=AllocateMemory($2000)
Procedure KeyUpdate(id_event):key_internal_a=EventwParam()
  If (EventlParam()&$C0000000)<>$40000000
    !movzx r10,byte [v_key_internal_a]
    !mov   rax,     1 
    !add   r10,[p_key]
    !mov   r11, r10   
    !mov   r12, r11   
    !mov   r13, r12   
    !add   r10, $0000 
    !add   r11, $0100 
    !add   r12, $0200 
    !add   r13, $0300 
    !mov rcx,[p.v_id_event]
    !cmp rcx,$102; O
    !je key_set_2
    !cmp rcx,$100; D
    !je key_set_1
    !cmp rcx,$104
    !je key_set_1
    !cmp rcx,$101; U
    !je key_set_0
    !cmp rcx,$105
    !je key_set_0
    !jmp key_set_end
    !key_set_0:;multi return selector
    !xor rax,rax
    !mov r11,r12
    !key_set_1:
    !mov byte[r10], al;pokea $000
    !mov byte[r11],$01;pokea mux($100,$200)
    !mov byte[r13],$01;pokea $300
    !key_set_2:
    !xor  rax,$1000101
    ProcedureReturn
    !key_set_end:
  EndIf
  !mov rcx,[p.v_id_event]
  !mov   r10,[p_key]
  !mov rax,$100020001;mouse M clic F
  !cmp rcx,$200
  !je key_mov_1
  !inc r10
  !mov rax,$100020101;mouse D clic 0
  !cmp rcx,$201
  !je key_mov_1
  !cmp rcx,$203
  !je key_mov_1
  !mov rax,$100020201;mouse U clic 0
  !cmp rcx,$202
  !je key_mov_0
  !inc r10
  !mov rax,$100020401;mouse D clic 1
  !cmp rcx,$204
  !je key_mov_1
  !cmp rcx,$206
  !je key_mov_1
  !mov rax,$100020501;mouse U clic 1
  !cmp rcx,$205
  !je key_mov_0
  !inc r10
  !mov rax,$100020701;mouse D clic 2
  !cmp rcx,$207
  !je key_mov_1
  !cmp rcx,$209
  !je key_mov_1
  !mov rax,$100020801;mouse U clic 3
  !cmp rcx,$208
  !je key_mov_0
  !inc r10
  !mov rax,$100020a01;mouse O clic 3
  !cmp rcx,$20A
  !je key_mov_1
  !jmp key_mov_end;skip to joy
  !key_mov_0:
  !xor al,al
  !mov   r11,r10
  !mov   r12,r11
  !mov   r13,r12
  !add   r10, $0000 
  !add   r11, $0100 
  !add   r12, $0200 
  !add   r13, $0300 
  !mov byte[r10],$00;pokea $000
  !mov byte[r12],$01;pokea mux($100,$200)
  !mov byte[r13],$01;pokea $300
  !shr rax,8
  ProcedureReturn
  !key_mov_1:
  !mov   r11,r10
  !mov   r12,r11
  !mov   r13,r12
  !add   r10, $0000 
  !add   r11, $0100 
  !add   r12, $0200 
  !add   r13, $0300 
  !mov byte[r10],$01;pokea $000
  !mov byte[r11],$01;pokea mux($100,$200)
  !mov byte[r13],$01;pokea $300
  !shr rax,8
  ProcedureReturn
  !key_mov_end:
  PokeQ(*key+$400,$FF00000100)
  !cmp qword[p.v_id_event],0
  !jne key_event_end
  For key_internal_a = 0 To 15
    temp=joyGetPosEx_(key_internal_a,*key+$400)
    !xor r10,r10;pre-clear
    !xor r11,r11
    !xor r12,r12
    !xor rcx,rcx
    !mov r15,[p_key];quick load
    !mov r14,r15
    !mov  ch,byte [v_key_internal_a]
    !add r15,$1000
    !add r14,$0400
    !add r15,rcx;5 variable done minimal opcode
    !mov rbx,[v_key_internal_temp]
    !cmp rbx,$A5;#JOYERR_PARMS
    !je  key_clear_2
    !cmp rbx,$06;#MMSYSERR_NODRIVER
    !je  key_clear_2
    !cmp rbx,$0B;#MMSYSERR_INVALPARAM
    !je  key_clear_2
    !cmp rbx,$02;#MMSYSERR_BADDEVICEID
    !je  key_clear_2
    !cmp rbx,$A7;#JOYERR_UNPLUGGED
    !je  key_clear_1
    !cmp rbx,$00;#JOYERR_NOERROR
    !jne key_clear_1
    !mov r10,rcx;control OK, update flag/16
    !mov r11,[r15+$f8];F1 = flag tick
    !bts r10,0
    !inc r11
    !mov [r15+$f0],r10;F0 = flag primaire 
    !mov [r15+$f8],r11;F1 = flag tick
    !or qword[p.v_id_event],$2000000
    !mov r10,[r14+$20];process data button unpacked
    !mov rcx,31
    !@@:
    !bt r10,rcx
    !setc [r15+rcx]
    !dec rcx
    !jns @b;unload
    !mov    r10w    ,[r14+$08] ; control X all axe
    !mov    r11w    ,[r14+$18] ;
    !xor    r12,r12            ;unused yet
    !xor    r13,r13            ;unused yet 2
    !add    r10     ,     $8000;
    !add    r11     ,     $8000;
    !add    r12     ,     $8000;
    !add    r13     ,     $8000;
    !movsx  r10     , r10w     ;
    !movsx  r11     , r11w     ;
    !movsx  r12     , r12w     ;
    !movsx  r13     , r13w     ;
    !sar    r10     ,         5; DONE
    !sar    r11     ,         5; DONE
    !sar    r12     ,         5; DONE
    !sar    r13     ,         5; DONE
    !mov   [r15+$20], r10      ;
    !mov   [r15+$28], r11      ;
    !mov   [r15+$30], r12      ;
    !mov   [r15+$38], r13      ;
    !mov    r10w    ,[r14+$0C] ; control Y all axe
    !mov    r11w    ,[r14+$14] ;
    !xor    r12,r12            ;unused yet
    !xor    r13,r13            ;unused yet 2
    !add    r10     ,     $8000;
    !add    r11     ,     $8000;
    !add    r12     ,     $8000;
    !add    r13     ,     $8000;
    !movsx  r10     , r10w     ;
    !movsx  r11     , r11w     ;
    !movsx  r12     , r12w     ;
    !movsx  r13     , r13w     ;
    !sar    r10     ,         5; DONE
    !sar    r11     ,         5; DONE
    !sar    r12     ,         5; DONE
    !sar    r13     ,         5; DONE
    !mov   [r15+$40], r10      ;
    !mov   [r15+$48], r11      ;
    !mov   [r15+$50], r12      ;
    !mov   [r15+$58], r13      ;
    !mov    r10w    ,[r14+$28] ; control Z all axe
    !mov    r11w    ,[r14+$10] ;
    !xor    r12     , r12      ;unused yet
    !xor    r13     , r13      ;unused yet 2
    !add    r10     ,     $8000;
    !add    r11     ,     $8000;
    !add    r12     ,     $8000;
    !add    r13     ,     $8000;
    !movsx  r10     , r10w     ; TODO ?
    !movsx  r11     , r11w     ; TODO ?
    !movsx  r12     , r12w     ; TODO ?
    !movsx  r13     , r13w     ; TODO ?
    !sar    r10     ,         5; DONE
    !sar    r11     ,         5; DONE
    !sar    r12     ,         5; DONE
    !sar    r13     ,         5; DONE
    !mov   [r15+$60], r10      ;
    !mov   [r15+$68], r11      ;
    !mov   [r15+$70], r12      ;
    !mov   [r15+$78], r13      ;
    !jmp key_clear_end
    !key_clear_1:;post-clear
    !mov r10,$0000000000000000
    !mov r11,$ffffffffffffffff
    !mov r12,$fffffffffffffc00
    !key_clear_2:;ULTRA CLEAR in BATCH !!!! 
    !mov [r15+$00],r10;B8 = button byte     
    !mov [r15+$08],r10;B8 = button byte     
    !mov [r15+$10],r10;B8 = button byte     
    !mov [r15+$18],r10;B8 = button byte     
    !mov [r15+$f0],r10;F0 = flag primaire   
    !mov [r15+$f8],r11;F1 = flag tick       
    !mov [r15+$20],r12;X0 = stick           ;If eee=$113:eee=0:EndIf
    !mov [r15+$28],r12;X1 = stick           ;If eee=$3A0:eee=0:EndIf
    !mov [r15+$30],r12;X2 = stick           ;If eee=$3A2:eee=0:EndIf
    !mov [r15+$38],r12;X3 = stick           ;If eee=$3A5:eee=0:EndIf;button PM$F event
    !mov [r15+$40],r12;Y0 = stick           ;If eee=$3A7:eee=0:EndIf;button RM$F event
    !mov [r15+$48],r12;Y1 = stick           ;If eee=$0A5:eee=0:EndIf;INV KJOY
    !mov [r15+$50],r12;Y2 = stick           
    !mov [r15+$58],r12;Y3 = stick           
    !mov [r15+$60],r12;Z0 = stick           
    !mov [r15+$68],r12;Z1 = stick           
    !mov [r15+$70],r12;Z2 = stick           
    !mov [r15+$78],r12;Z3 = stick           
    !key_clear_end:
  Next
  !key_event_end:
  ProcedureReturn id_event
EndProcedure
Procedure KeyPushed(       a)
  !mov    bl,[p.v_a];PeekA(*key+( a&$ff)     )
  !movzx rbx,bl
  !add   rbx,[p_key]
  !mov    al,[rbx]
  !movzx rax,al
  ProcedureReturn 
EndProcedure
Procedure KeyReleased(     a)
  !mov    bl,[p.v_a];PeekA(*key+( a&$ff)     )!1
  !movzx rbx,bl
  !add   rbx,[p_key]
  !mov    al,[rbx]
  !xor al,$01
  !movzx rax,al
  ProcedureReturn 
EndProcedure
Procedure KeyEventPushed(  a)
  !mov    bl,[p.v_a];r0=PeekA(*key+(a&$ff)+$100)
  !movzx rbx,bl
  !add   rbx,[p_key];PokeA(*key+(a&$ff)+$100,0)
  !add   rbx,$100
  !mov    al,[rbx]
  !movzx rax,al
  !mov byte[rbx],$00
  ProcedureReturn 
EndProcedure
Procedure KeyEventReleased(a)
  !mov    bl,[p.v_a];r0=PeekA(*key+(a&$ff)+$200)
  !movzx rbx,bl
  !add   rbx,[p_key];PokeA(*key+(a&$ff)+$200,0)
  !add   rbx,$200
  !mov    al,[rbx]
  !movzx rax,al
  !mov byte[rbx],$00
  ProcedureReturn 
EndProcedure
Procedure KeyEventSwitch(  a)
  !mov    bl,[p.v_a];r0=PeekA(*key+(a&$ff)+$300)
  !movzx rbx,bl
  !add   rbx,[p_key];PokeA(*key+(a&$ff)+$300,0)
  !add   rbx,$300
  !mov    al,[rbx]
  !movzx rax,al
  !mov byte[rbx],$00
  ProcedureReturn 
EndProcedure
Procedure JoyPushed(index,button)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_button]
  !and    ax,$0f1f
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1000
  !mov    al,[rax]
  !movzx rax,al
  ProcedureReturn 
EndProcedure
Procedure JoyReleased(index,button)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_button]
  !and    ax,$0f1f
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1000
  !mov    al,[rax]
  !movzx rax,al
  !xor al,1
  ProcedureReturn 
EndProcedure
Procedure JoyX(index,sub=0)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_sub]
  !and    ax,$0f03
  !shl    al,3 ;factor scale to PB
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1020
  !mov   rax,[rax]
  ProcedureReturn 
EndProcedure
Procedure JoyY(index,sub=0)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_sub]
  !and    ax,$0f03
  !shl    al,3 ;factor scale to PB
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1040
  !mov   rax,[rax]
  ProcedureReturn 
EndProcedure
Procedure JoyZ(index,sub=0)
  !mov    ah,[p.v_index]
  !mov    al,[p.v_sub]
  !and    ax,$0f03
  !shl    al,3 ;factor scale to PB
  !movzx rax,ax
  !add   rax,[p_key]
  !add   rax,$1060
  !mov   rax,[rax]
  ProcedureReturn 
EndProcedure

OpenWindow(0,100,100,1280,256,""):RemoveKeyboardShortcut(0,#PB_Shortcut_All)
CanvasGadget(0,0,0,1280,512)
Repeat:Event=WindowEvent()
  KeyUpdate(Event)
  If Event=0
    StartDrawing(CanvasOutput(0))
    For a = 0 To 255
      Box(((a&$0f)<<4)     ,a&$f0,16,16,KeyPushed(a)       *255)
      Box(((a&$0f)<<4)+ 256,a&$f0,16,16,KeyReleased(a)     *255)
      Box(((a&$0f)<<4)+ 512,a&$f0,16,16,KeyEventPushed(a)  *255)
      Box(((a&$0f)<<4)+ 768,a&$f0,16,16,KeyEventReleased(a)*255)
      Box(((a&$0f)<<4)+1024,a&$f0,16,16,KeyEventSwitch(a)  *255)
    Next
    For a = 0 To 31
      Box(((a&$0f)<<4)     ,a&$f0, 8, 8,(JoyPushed(0,a)*$ffff)!$000000ff)
    Next
    a=0
    For a = 0 To 3
      Box(((a&$0f)<<4)+8  ,128,1,JoyX(0,a)>>3,$ffffffff)
      Box(((a&$0f)<<4)+264,128,1,JoyY(0,a)>>3,$ffffffff)
      Box(((a&$0f)<<4)+520,128,1,JoyZ(0,a)>>3,$ffffffff)
    Next
    StopDrawing()
    Delay(16)
    
  EndIf
Until Event=#PB_Event_CloseWindow
#CODE_DONWGRADE

amuse toi bien et fais toi plaisir

ensuit, pour se qui du temps de latence, tu semble ne pas avoir vue le message, il ne tien que a toi de placé la valeur 1 ou 0 dans une table via l'ID du bouton qui vien de l'event, ensuit tu va lire la table, c'est se que fais mon code en version compact


je peu pas faire plus simple, donc on va aussi reprendre l'autre code et faire une mise en pratique de se que je tes dit

en voila le resulta, fais en moins de 30 seconde

Code : Tout sélectionner

Global Dim stupide_key_statut.a(256)
If OpenWindow(0,100,100,400,300,"Détection de touche pas dans OpenGLGadget")=0:End:EndIf
OpenGLGadget(0,10,10,380,280)
Repeat
  Event = WindowEvent()
  Key   = EventwParam()
  Select Event
    Case $000:Delay(10);aucun event, faire le rendu au propre ici
    Case $100,$104;save le code dans une table avec la valeur 1 pour savoir si le bouton est actif pour ta boucle
      stupide_key_statut(Key)=1
    Case $101,$105;save le code dans la meme table mais avec un zero pour ensuit utilisé la table, c'est se que fais l'autre code avec les procedure dans le 2eme block de texte https://www.purebasic.fr/french/viewtopic.php?p=218280#p218280
      stupide_key_statut(Key)=0
    Default;autre event non prise en compte
  EndSelect
Until Event = #PB_Event_CloseWindow

ENSUIT
on va prendre un exemple de mise en pratique des valeur
je vais pas me prendre le chou car la c'est limite insultant pour moi meme
la raison est simple,

dans ta boucle de RENDU ou de timer pour avoir ta vitesse sans latence
tu fais un simple

Code : Tout sélectionner

;lot of line here
If stupide_key_statut(VALUE)
  ;made something here
EndIf
;other line not related
oubli pas de remplacé la valeur VALUE avec l'ID du bouton voulu, voir gros pavé de code pour un exemple de mise en pratique plus poussé, il suffi de replace un element



EDIT_FOR_DEMO:
si tu prendre le code qui a 2 octet de moins et que tu remplace se qui se trouve a partir du OpenWindow(...) par se code la si apres,

Code : Tout sélectionner


px=256
py=256
OpenWindow(0,100,100,512,512,"PB_SPHERE"):RemoveKeyboardShortcut(0,#PB_Shortcut_All)
CanvasGadget(0,0,0,512,512)
Repeat:Event=WindowEvent()
  KeyUpdate(Event);IMPORTANT
  If Event=0;if NO_EVENT, make render
    If StartDrawing(CanvasOutput(0))
      Box(0,0,512,512,$ff000000)
      For a = 0 To 255
        temp= KeyPushed(a)       *$000040
        temp|(KeyReleased(a)     *$002000)
        temp|(KeyEventPushed(a)  *$ff00ff)
        temp|(KeyEventReleased(a)*$ffff00)
        temp|(KeyEventSwitch(a)  *$ffffff)
        Box(((a&$0f)<<4)     ,a&$f0,15,15,temp)
      Next
      For a = 0 To 31
        Box(((a&$0f)<<4)     ,a&$f0, 8, 8,(JoyPushed(0,a)*$ffff)!$000000ff)
      Next
      a=0
      For a = 0 To 3
        Box(((a&$0f)<<1)+$08,128,1,JoyX(0,a)>>3,$ffffffff)
        Box(((a&$0f)<<1)+$18,128,1,JoyY(0,a)>>3,$ffffffff)
        Box(((a&$0f)<<1)+$28,128,1,JoyZ(0,a)>>3,$ffffffff)
      Next
      
      
      If KeyPushed($5A):py-1:EndIf
      If KeyPushed($53):py+1:EndIf
      If KeyPushed($51):px-1:EndIf
      If KeyPushed($44):px+1:EndIf
      
      If px<=010:px=010:EndIf:If py<=010:py=010:EndIf
      If px=>501:px=501:EndIf:If py=>501:py=501:EndIf
      
      Circle(px  ,py  ,10,$FF0071E0)
      Circle(px-1,py-2,08,$FF3D8AD5)
      Circle(px-2,py-3,04,$FF5995CF)
      Circle(px-3,py-4,02,$FFA5C7E8)
      
      StopDrawing()
      Delay(16)
    EndIf
  EndIf
Until Event=#PB_Event_CloseWindow
tu aura le contenu en video que je tes posté sur le discord
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: OpenGl et ExamineKeyboard() = error

Message par SPH »

falsam a écrit : dim. 15/déc./2024 9:42 J'ai rencontré ton souci il y a longtemps et je l'ai évoqué sur ce lien.
:arrow: https://www.purebasic.fr/french/viewtopic.php?t=17623

Crisot te donnera quelques explications.
Merci pour le lien ! TRES interessant !
Dis : ton Module keyboard.mod.pbi a t'il ete amelioré depuis sa version 1.0 ?

THX

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre