(résolu) La souris dans un OpenWindowedScreen()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

(résolu) La souris dans un OpenWindowedScreen()

Message par ATHOW »

Bonjour à tous,

Je bosse sur un petit jeu et j'utilise un OpenWindowedScreen().
Le probleme, c'est que je n'arrive pas bien à gérer la souris...
Grâce au tuto sur la souris (thx Dobro et les autres!) j'ai compris que pour utiliser le pointeur de souris de windows il ne fallait pas utiliser ExamineMouse() mais plutôt les commandes : WindowMouseX(), WindowMouseY() etc...
Mais pour le clique, j'utilise pour l'instant cette technique :

Code : Tout sélectionner

Event = WaitWindowEvent()
If Event=#WM_LButtonDown

; un clique est détecté....  

EndIf
Mais cela ne me permet pas de détecter un long clique... J'aimerais pouvoir, quand je clique longtemps sur une zone précise, qu'un de mes sprites se déplace tant que je laisse le bouton enfoncé.... comment faire ?

(j'ai bien conscience de poser une question de newbie... :) )
Dernière modification par ATHOW le mer. 06/juil./2005 22:29, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

l'utilisation d'un Flag est une des nombreuse solution et certainement la plus simple !! :D


un flag est une variable que tu prtedestine a une action particuliere
comme un noeu a ton mouchoir par exemple !!


donc tu regarde si un click est effectué , puis tu met une variable bidon a 1
comme ça plus loin dans le code lorsque tu constate que la variable bidon est a un , tu sait que l'utilisateur a appuyer sur le bouton de la souris ! et tu fait ton action en consequence ! :D .. en n'ometant pas de remetre ta variable bidon a zero bien sur pour le prochain clique ! :D

comme tu oterai le noeu au mouchoir apres l'action que ce noeu est sensé de faire te rappelé serai effectué ! :D

bref un "flag" en informatique c'est ça ! ..

perso une bonne habitude de programmation consiste a nommé precisement un flag lorsqu'il doit servir loin dans le programme

par exemple : click_bouton_gauche=1 ; pour la souris

et par contre, lui donné un nom pas possible pour un flag qui sert pour les 5 ou 6 lignes qui suivent , comme zrtrev=1
de façon pas pas melanger le nom des variable "utile", des variables "temporaire" que sont les flag ! :D
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Merci pour la rapidité de la réponse (au passage : super communauté !)

Hélas, j'avais déjà testé le flag...

Pour que vous puissiez tester (Pb v. 3.93) :

Code : Tout sélectionner

InitSprite()

OpenWindow(0,0,0,800,600,#PB_Window_ScreenCentered,"Essai")
OpenWindowedScreen(WindowID(),0,0,800,600,0,0,0)
  
  
spriteX=0
spriteY=0
click=0
ClearScreen(255,255,255)
Repeat
  x = WindowMouseX()  
  y = WindowMouseY()
  
  Event = WaitWindowEvent()
  
  If Event=#WM_LButtonDown
    click=1
  EndIf
  
  If Event=#WM_LButtonUp
    click=0
  EndIf
  
  If click=1
    If spriteX>0 And x>=650 And x<=680 And y>=457 And y<=477
      spriteX=spriteX-10
    ElseIf spriteX<570 And x>=720 And x<=750 And y>=457 And y<=477
      spriteX=spriteX+10
    ElseIf spriteY>0 And x>=692 And x<=712 And y>=415 And y<=445
      spriteY=spriteY-10
    ElseIf spriteY<570 And x>=692 And x<=712 And y>=485 And y<=515
      spriteY=spriteY+10
    EndIf
  EndIf
  
  
  StartDrawing(ScreenOutput())
  Locate(620,0)
  DrawText("Utilisez la croix")
  Locate(620,20)
  DrawText("pour dépacer le carré")
  Locate(620,60)
  DrawText("Right-click pour terminer")
  
  Box(spriteX,spriteY,30,30,RGB(0,0,0))
  
  Box(600,0,10,600,(RGB(0,0,0)))
  
  Box(650,457,100,20,RGB(0,0,0))
  Box(692,415,20,100,RGB(0,0,0))
  
  If x>=650 And x<=680 And y>=457 And y<=477
    LineXY(655, 467, 665, 472, RGB(255,0,0))
    LineXY(655, 467, 665, 462, RGB(255,0,0))
    LineXY(665, 472, 665, 462, RGB(255,0,0))
    FillArea(661,467,RGB(255,0,0),RGB(255,0,0))
  Else
    LineXY(655, 467, 665, 472, RGB(255,255,255))
    LineXY(655, 467, 665, 462, RGB(255,255,255))
    LineXY(665, 472, 665, 462, RGB(255,255,255))
    FillArea(661,467,RGB(255,255,255),RGB(255,255,255))
  EndIf
  
  If x>=720 And x<=750 And y>=457 And y<=477
    LineXY(745, 467, 735, 472 , RGB(255,0,0))
    LineXY(745, 467, 735, 462 , RGB(255,0,0))
    LineXY(735, 472, 735, 462 , RGB(255,0,0))
    FillArea(739,467,RGB(255,0,0),RGB(255,0,0))
  Else
    LineXY(745, 467, 735, 472 , RGB(255,255,255))
    LineXY(745, 467, 735, 462 , RGB(255,255,255))
    LineXY(735, 472, 735, 462 , RGB(255,255,255))
    FillArea(739,467,RGB(255,255,255),RGB(255,255,255))
  EndIf
  
  If x>=692 And x<=712 And y>=415 And y<=445
    LineXY(702, 420, 707,  430, RGB(255,0,0))
    LineXY(702, 420, 697,  430, RGB(255,0,0))
    LineXY(697, 430, 707,  430, RGB(255,0,0))
    FillArea(702,425,RGB(255,0,0),RGB(255,0,0))
  Else
    LineXY(702, 420, 707,  430, RGB(255,255,255))
    LineXY(702, 420, 697,  430, RGB(255,255,255))
    LineXY(697, 430, 707,  430, RGB(255,255,255))
    FillArea(702,425,RGB(255,255,255),RGB(255,255,255))
  EndIf
  
  If x>=692 And x<=712 And y>=485 And y<=515
    LineXY(702, 510, 707,  500, RGB(255,0,0))
    LineXY(702, 510, 697,  500, RGB(255,0,0))
    LineXY(697, 500, 707,  500, RGB(255,0,0))
    FillArea(702,505,RGB(255,0,0),RGB(255,0,0))
  Else
    LineXY(702, 510, 707,  500, RGB(255,255,255))
    LineXY(702, 510, 697,  500, RGB(255,255,255))
    LineXY(697, 500, 707,  500, RGB(255,255,255))
    FillArea(702,505,RGB(255,255,255),RGB(255,255,255))
  EndIf
  StopDrawing()
  FlipBuffers()
  ClearScreen(255,255,255)
  Delay(1)
Until Event=#WM_RButtonDown
Essayez de cliquer sur la croix directionnelle (sans bouger la souris pendant le clique !) et vous allez voir : le sprite (enfin dans le jeu c'est un sprite, là c'est juste une box()) reste bêtement immobile !
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

AHHhhh ! Quel idiot je fais... il suffit de remplacer le WaitWindowEvent() par un WindowEvent()...

Par contre, maintenant, ca bouffe un max de CPU, meme avec un delay(10) dans la boucle... normal ?
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

EDIT : Je vois que tu avais trouvé, pour l'utilisation CPU oui ça doit être normal, augmente ton delay ou cré un vrai sprite, car la suite de StartDrawing.box/line/stopdrawing prend du temps

Ton problème n'est pas là, c'est que tu as mis WaitWindowEvent() au lieu de WindowEvent(), donc le programme attend un nouvel évènement sur la fenêtre pour refaire une boucle :wink:

Code : Tout sélectionner

InitSprite() 

OpenWindow(0,0,0,800,600,#PB_Window_ScreenCentered,"Essai") 
OpenWindowedScreen(WindowID(),0,0,800,600,0,0,0) 
  
  
spriteX=0 
spriteY=0 
click=0 
ClearScreen(255,255,255) 
Repeat 
  x = WindowMouseX()  
  y = WindowMouseY() 
  
  Event = WindowEvent() 
  
  If Event=#WM_LButtonDown 
    click=1 
  EndIf 
  
  If Event=#WM_LButtonUp 
    click=0 
  EndIf 
  
  If click=1 
    If spriteX>0 And x>=650 And x<=680 And y>=457 And y<=477 
      spriteX=spriteX-10 
    ElseIf spriteX<570 And x>=720 And x<=750 And y>=457 And y<=477 
      spriteX=spriteX+10 
    ElseIf spriteY>0 And x>=692 And x<=712 And y>=415 And y<=445 
      spriteY=spriteY-10 
    ElseIf spriteY<570 And x>=692 And x<=712 And y>=485 And y<=515 
      spriteY=spriteY+10 
    EndIf 
  EndIf 
  
  
  StartDrawing(ScreenOutput()) 
  Locate(620,0) 
  DrawText("Utilisez la croix") 
  Locate(620,20) 
  DrawText("pour dépacer le carré") 
  Locate(620,60) 
  DrawText("Right-click pour terminer") 
  
  Box(spriteX,spriteY,30,30,RGB(0,0,0)) 
  
  Box(600,0,10,600,(RGB(0,0,0))) 
  
  Box(650,457,100,20,RGB(0,0,0)) 
  Box(692,415,20,100,RGB(0,0,0)) 
  
  If x>=650 And x<=680 And y>=457 And y<=477 
    LineXY(655, 467, 665, 472, RGB(255,0,0)) 
    LineXY(655, 467, 665, 462, RGB(255,0,0)) 
    LineXY(665, 472, 665, 462, RGB(255,0,0)) 
    FillArea(661,467,RGB(255,0,0),RGB(255,0,0)) 
  Else 
    LineXY(655, 467, 665, 472, RGB(255,255,255)) 
    LineXY(655, 467, 665, 462, RGB(255,255,255)) 
    LineXY(665, 472, 665, 462, RGB(255,255,255)) 
    FillArea(661,467,RGB(255,255,255),RGB(255,255,255)) 
  EndIf 
  
  If x>=720 And x<=750 And y>=457 And y<=477 
    LineXY(745, 467, 735, 472 , RGB(255,0,0)) 
    LineXY(745, 467, 735, 462 , RGB(255,0,0)) 
    LineXY(735, 472, 735, 462 , RGB(255,0,0)) 
    FillArea(739,467,RGB(255,0,0),RGB(255,0,0)) 
  Else 
    LineXY(745, 467, 735, 472 , RGB(255,255,255)) 
    LineXY(745, 467, 735, 462 , RGB(255,255,255)) 
    LineXY(735, 472, 735, 462 , RGB(255,255,255)) 
    FillArea(739,467,RGB(255,255,255),RGB(255,255,255)) 
  EndIf 
  
  If x>=692 And x<=712 And y>=415 And y<=445 
    LineXY(702, 420, 707,  430, RGB(255,0,0)) 
    LineXY(702, 420, 697,  430, RGB(255,0,0)) 
    LineXY(697, 430, 707,  430, RGB(255,0,0)) 
    FillArea(702,425,RGB(255,0,0),RGB(255,0,0)) 
  Else 
    LineXY(702, 420, 707,  430, RGB(255,255,255)) 
    LineXY(702, 420, 697,  430, RGB(255,255,255)) 
    LineXY(697, 430, 707,  430, RGB(255,255,255)) 
    FillArea(702,425,RGB(255,255,255),RGB(255,255,255)) 
  EndIf 
  
  If x>=692 And x<=712 And y>=485 And y<=515 
    LineXY(702, 510, 707,  500, RGB(255,0,0)) 
    LineXY(702, 510, 697,  500, RGB(255,0,0)) 
    LineXY(697, 500, 707,  500, RGB(255,0,0)) 
    FillArea(702,505,RGB(255,0,0),RGB(255,0,0)) 
  Else 
    LineXY(702, 510, 707,  500, RGB(255,255,255)) 
    LineXY(702, 510, 697,  500, RGB(255,255,255)) 
    LineXY(697, 500, 707,  500, RGB(255,255,255)) 
    FillArea(702,505,RGB(255,255,255),RGB(255,255,255)) 
  EndIf 
  StopDrawing() 
  FlipBuffers() 
  ClearScreen(255,255,255) 
  Delay(1) 
Until Event=#WM_RButtonDown 
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Oui je viens de tester avec les vrai sprites, et ca marche très bien sans augmentation de CPU !

Merci à tous les deux !
Répondre