Tout à fait d'accord ^^crisot a écrit :(Et arrêtez avec Delay(), cette instruction n'existe pas )
J'ai codé un petit module (keyboard.mod.pbi) pour tester les touches mais avec quelques API.
■ Deux fonctions
InitKey(mode = #PB_Ignore)
Initialiser le module avec la topologie du clavier
KeyPress(value, released.b = #False)
Tester si une touche est pressée ou relâchée (released = #True)
■ Le code en l'état incluant le module et un code de test.
Flèches du clavier pour déplacer le carré
Escape pour quitter.
Ce module permet aussi de tester des combinaisons de touches
Control + R pour un carré rouge
Control + G pour un carré vert
Control + B pour un carré bleu
Code : Tout sélectionner
;-// Module keyboard.mod.pbi
; keyboard.mod.pbi - Version 1.0
DeclareModule keyboard
Declare InitKey(mode = #PB_Ignore)
Declare KeyPress(value, released.b = #False)
EndDeclareModule
Module keyboard
Structure NewKey
mode.i ; Topologie clavier
current.i ; Touche à tester
released.b ; Touche relachée oui ou non
previous.i ; Touche precédement pressée
EndStructure
Global key.NewKey
; Initialisation topologie du clavier
Procedure InitKey(mode = #PB_Ignore)
If mode = #PB_Keyboard_International
key\mode = $0409
ElseIf mode = #PB_Keyboard_Qwerty
key\mode = $040C
Else
If mode <> #PB_Ignore
key\mode = mode
Else
key\mode = GetKeyboardLayout_(0)
EndIf
EndIf
ProcedureReturn key\mode
EndProcedure
; Est ce que la touche testée est préssée ou relachée (released.b = #True)
Procedure KeyPress(value, released.b = #False)
; Mystere les touche de déplacement ne sont pas reconnues par MapVirtualKeyEx
; Mais peut être que je ne sais pas faire ^^
Select value
Case #PB_Key_Left : value = 37
Case #PB_Key_Right : value = 39
Case #PB_Key_Up : value = 38
Case #PB_Key_Down : value = 40
Default : value = MapVirtualKeyEx_(value, #MAPVK_VSC_TO_VK, KeyboardMode)
EndSelect
Key\released = released
If GetAsyncKeyState_(value)
If released = #False
; la touche peut être repéter
key\previous = #PB_Ignore
key\current = value
Else
; La touche doit être relacher
key\previous = value
key\current = #False ; On ne retournera pas la touche relachée
EndIf
Else
; La touche en cours de test est relachée
; ? Le test consisté à tester une touche relachée
; ? Est ce que la touche précédement pressée et la meme que celle qui est relachée
If Key\released And value = key\previous
Key\released = #False
key\current = value
Else
key\current = #False
EndIf
EndIf
ProcedureReturn key\current
EndProcedure
EndModule
;-
;-// Zone de test
EnableExplicit
UseModule keyboard
; Fenetre application, viewport et couleur arriere plan
Global window, ww = 800, wh = 600, viewport, wColor.f = RGB(107, 142, 35)
; Sprite
Global sx.f = 100, sy.f =100, sw = 64, sh = 64, sColor = RGB(255, 215, 0)
;Plan de l'application
Declare Start()
Declare GameRender()
Start()
Procedure Start()
window = OpenWindow(#PB_Any, 0, 0, ww, wh, "Test Opengl", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
; Fenetre Open GL
viewport = OpenGLGadget(#PB_Any, 0, 0, ww, wh, #PB_OpenGL_NoDepthBuffer | #PB_OpenGL_Keyboard)
SetActiveGadget(viewport)
; Modifier le contexte courant
SetGadgetAttribute(viewport, #PB_OpenGL_SetContext, #True)
; Couleur d'arrirer plan
glClearColor_(Red(wColor)/255, Green(wColor)/255, Blue(wColor)/255, 1.0)
; Volume de visualisation
glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_();
gluOrtho2D_(0, ww, wh, 0)
;Rendu 2D
InitKey()
GameRender()
EndProcedure
Procedure GameRender()
Protected Speed.f = 8
Repeat
If KeyPress(#PB_Key_Left)
sx - speed
EndIf
If KeyPress(#PB_Key_Right)
sx + speed
EndIf
If KeyPress(#PB_Key_Up)
sy - speed
EndIf
If KeyPress(#PB_Key_Down)
sy + Speed
EndIf
If KeyPress(#PB_Key_LeftControl) And KeyPress(#PB_Key_R)
scolor = RGB(255, 0, 0)
EndIf
If KeyPress(#PB_Key_LeftControl) And KeyPress(#PB_Key_G)
scolor = RGB(0, 255, 0)
EndIf
If KeyPress(#PB_Key_LeftControl) And KeyPress(#PB_Key_B)
scolor = RGB(0, 0, 255)
EndIf
; ClearScreen
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
; Affichage d'un carré
glMatrixMode_(#GL_MODELVIEW) ;Initialiser la matrice de transformation courante
glPushMatrix_()
glBegin_(#GL_POLYGON)
glColor3f_(Red(sColor)/255, Green(sColor)/255, Blue(sColor)/255)
glVertex2i_(sx, sy) ;Point haut gauche
glVertex2i_(sx + sw, sy) ;Point haut droit
glVertex2i_(sx + sw, sy + sh) ;Point bas droit
glVertex2i_(sx, sy + sh) ;Point bas gauche
glEnd_() ;Fin du polygone
glPopMatrix_();
; Flip buffer
SetGadgetAttribute(viewport, #PB_OpenGL_FlipBuffers, #True)
Until WindowEvent() = #PB_Event_CloseWindow Or KeyPress(#PB_Key_Escape, #True)
EndProcedure