OpenScreen(), OpenWindow(), MultiUserDungeon, MOO ....

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

OpenScreen(), OpenWindow(), MultiUserDungeon, MOO ....

Message par Joubarbe »

Bonsoir

Dans une boucle...

Code : Tout sélectionner

Procedure init()
  pcname$ = GetGadgetText(#string_principal)
  database = OpenFile(db, "database.txt")
  knownpcname$ = ReadString(database)
  If pcname$ = knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Bienvenue " + pcname$ + " !")
  ElseIf pcname$ <> knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Nouveau joueur (Oui/Non) ?")
    If GetGadgetText(#string_principal) = "oui" And KeyboardReleased(#PB_Key_Return)
      WriteStringN(database, pcname$)
      CloseFile(database)
    Else ;If GetGadgetText(#string_principal) = "non" And KeyboardReleased(#PB_Key_Return)
      ;init()
      CloseFile(database)
      End
    EndIf
  EndIf
EndProcedure
Ici, le programme demande par l'intermediaire d'un TextGadget() le nom du joueur. Le programme analyse ensuite ce qui est affiché dans le StringGadget() ET l'appui sur entrée.

Ce code ne fonctionne pas et ma question est : est-il nécessaire d'ouvrir un plein écran pour pouvoir gérer les touches du clavier ? Le debugger me dit que non mais le programme semble fonctionner malgré le mauvais codage du programme.

Si je suis obligé d'ouvrir un plein écran (OpenScreen), comment puis-je faire pour imiter la console (Print("") et Input() ) ? J'ai beau chercher dans l'aide de PB, il doit avoir une commande qui m'échappe ...

Merci !

(C'est compréhensible ? :oops: )
Dernière modification par Joubarbe le mer. 09/août/2006 9:32, modifié 2 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

en gros pure basic a 2 mode de fonctionnement

Le MODE FENETRé Windows

et tu utilise les gadgets, (donc il te faut ouvrir une fenetre windows , pas ecran )

et pour ce genre de chose tu utilise un "StringGadget"
puisque tout est prevu dedans pour que l'utilisateur entre un nom
ou un mot de pass :D , et tout est prevu pour pouvoir recuperer
le contenu de ce StringGadget ! :D


soit tu utilise le MODE JEUX
et dans ce cas tu oublie tout ce qui est gadget !!
il te faut ouvrir un ecran ou une fenetre avec ecran ...
et tu utilise la librairie "Keyboard" ! :D

il existe un mode mixte, mais qui a mon avis depasse pour le moment tes connaissance , (faut pas griller les etapes :D )


voila voila :D (regarde la doc a " StringGadget ")
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Je ne vois pas vraiment comment faire avec EventGadget puisqu'il faut bien prendre en compte un certain nombre de caractères puis la pression sur la touche entrée... Si quelqu'un pouvait m'expliquer l'erreur de mon code...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

faudrai mettre ton code complet

car la je peux pas tester , il me faut fabriquer une fenetre ect..
et j'ai la bulle :D
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Code : Tout sélectionner


; ** Déclaration des constantes
; * Interface
; Fenêtres
Enumeration
  #fenetre_principal
  #fenetre_statistiques
  #fenetre_carte
EndEnumeration
; Gadgets
Enumeration
  #frame_principal
  #scroll_principal
  #text_principal
  #string_principal
  #bouton_statistique
  #bouton_carte
EndEnumeration

; ** Déclaration des variables
; * Global

; * Local
database = CreateFile(db,"database.txt")

; ** Déclaration des procédures
Declare ug(commande$,texte$)
Declare init()

; ** Assignations par défaut


; Initialisations standards
InitKeyboard()
InitSprite()

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

; Création de l'interface
If OpenWindow(#fenetre_principal,0,0,800,600,"UG",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  ;OpenWindowedScreen(WindowID(#fenetre_principal),0,0,800,600,1,0,0)
  If CreateGadgetList(WindowID(#fenetre_principal))
  StringGadget(#string_principal,15,430,770,20,commande$,#PB_String_LowerCase)
  ButtonGadget(#bouton_statistique,15,460,60,20,"Statistiques")
  ScrollAreaGadget(#scroll_principal,15,15,770,400,770,400,1,#PB_ScrollArea_Center|#PB_ScrollArea_Flat)
  OpenGadgetList(#scroll_principal)
  TextGadget(#text_principal,0,0,770,1000,"Veuillez entrer votre nom...")
  CloseGadgetList()
  EndIf

  SetGadgetColor(#text_principal,#PB_Gadget_BackColor,RGB(0,0,0))
  SetGadgetColor(#text_principal,#PB_Gadget_FrontColor,RGB(250,250,250))
EndIf

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

;Boucle principale
Repeat
  ;Gestion des événements
Event = WaitWindowEvent()
Select Event
  Case #PB_Event_Gadget
    Select EventGadget()
      Case #bouton_statistique
        Break
    EndSelect
EndSelect
 
  ; *** Gestion du jeu ***
; Reconnaissance ou non du joueur
ExamineKeyboard()
init()


ForEver

End


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

Procedure ug(commande$,texte$)
  If GetGadgetText(#string_principal) = commande$ And KeyboardPushed(#PB_Key_Return)
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + texte$)
    SetGadgetText(#string_principal,"")
  EndIf
EndProcedure

Procedure init()
  pcname$ = GetGadgetText(#string_principal)
  database = OpenFile(db, "database.txt")
  knownpcname$ = ReadString(database)
  If pcname$ = knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Bienvenue " + pcname$ + " !")
  ElseIf pcname$ <> knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Nouveau joueur (Oui/Non) ?")
    If GetGadgetText(#string_principal) = "oui" And KeyboardReleased(#PB_Key_Return)
      WriteStringN(database, pcname$)
      CloseFile(database)
    Else ;If GetGadgetText(#string_principal) = "non" And KeyboardReleased(#PB_Key_Return)
      ;init()
      CloseFile(database)
      End
    EndIf
  EndIf
EndProcedure
A vrai dire, c'est plus pour savoir comment imiter la console que corriger le code (Mais on peut le corriger aussi :) ). A savoir vérifier une saisie, une touche entrée, intégrer un pseudo Input() etc. Merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

regarde ce code !

je vais bouffer , je regarde ton code apres :D
en attendant regarde celui ci

Code : Tout sélectionner


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #Text_0
  #bouton
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 344, 172, 319, 70, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 110, 10, 120, 30, "")
      TextGadget(#Text_0, 10, 20, 90, 20, "entre tes 6 char!")
      ButtonGadget(#bouton, 10, 40, 25,25, "ok" )
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  ;You can place code here, and use the result as parameters for the procedures
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #String_0
      nom$ = GetGadgetText(#String_0) ; ici on recupere le nom !! en temps reel !!! 
      If Len (nom$)>6 ; si le nom a plus de 6 charactere on quitte la fenetre !!
        Event = #PB_Event_CloseWindow 
      EndIf     
    EndIf 
    
    If GadgetID = #bouton
      Event = #PB_Event_CloseWindow 
    EndIf
    
   
    
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop

MessageRequester("hello","tu t'apelle :"+nom$,#PB_MessageRequester_Ok  )
End



;

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bon voici ton code legerement corrigé :D

Code : Tout sélectionner

; ** Déclaration des constantes
; * Interface
; Fenêtres
Enumeration
  #fenetre_principal
  #fenetre_statistiques
  #fenetre_carte
EndEnumeration
; Gadgets
Enumeration
  #frame_principal
  #scroll_principal
  #text_principal
  #string_principal
  #bouton_statistique
  #bouton_carte
EndEnumeration

; ** Déclaration des variables
; * Global

; * Local
database = CreateFile(db,"database.txt")

; ** Déclaration des procédures
Declare.s ug(commande$)
Declare init()

; ** Assignations par défaut


; Initialisations standards
InitKeyboard()
InitSprite()

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

; Création de l'interface
If OpenWindow(#fenetre_principal,0,0,800,600,"UG",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  ;OpenWindowedScreen(WindowID(#fenetre_principal),0,0,800,600,1,0,0)
  If CreateGadgetList(WindowID(#fenetre_principal))
    StringGadget(#string_principal,15,430,770,20,commande$,#PB_String_LowerCase)
    ButtonGadget(#bouton_statistique,15,460,60,20,"Statistiques")
    ScrollAreaGadget(#scroll_principal,15,15,770,400,770,400,1,#PB_ScrollArea_Center|#PB_ScrollArea_Flat)
    OpenGadgetList(#scroll_principal)
    TextGadget(#text_principal,0,0,770,1000,"Veuillez entrer votre nom...")
    CloseGadgetList()
  EndIf
  
  SetGadgetColor(#text_principal,#PB_Gadget_BackColor,RGB(0,0,0))
  SetGadgetColor(#text_principal,#PB_Gadget_FrontColor,RGB(250,250,250))
EndIf
AddKeyboardShortcut(#fenetre_principal, #PB_Shortcut_Return, 13); ajoute un racourci clavier qui va generer un evenement "13"


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

;Boucle principale
Repeat
  ; ******************* Lit les differents evenements ***********************************
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows 
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type
  eventmenu= EventMenu() ; gere les menu eventuel ainsi que les racourci clavier !!!
  ; ********************************************************************************************
  
  If Event= #PB_Event_Gadget  ; ********* dessous on gere les evenement gadget
    
    If GadgetID = #bouton_statistique ; le bouton "statistique"
      Break   
    EndIf  
    If GadgetID= #string_principal ; ceci est executé a chaque characatere tappé c'est du temps reel !!
    EndIf   
  EndIf
  
  
  If Event= #PB_Event_CloseWindow  ; ***** dessous on gere les evenement fenetre
      End
    EndIf
    
    If eventmenu=13 ; ***** dessous on gere les evenement menu et racourci clavier 
      nom$=ug(commande$)
      
      MessageRequester("hello","ton nom est :"+  nom$,#PB_MessageRequester_Ok )
      
      
    EndIf
  
  
  
  
  
  ; *** Gestion du jeu ***
  ; Reconnaissance ou non du joueur
  ExamineKeyboard()
  init()
  
  
ForEver

End


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

Procedure.s  ug(commande$)
  nom$= GetGadgetText(#string_principal) 
  ProcedureReturn nom$

EndProcedure

Procedure init()
  pcname$ = GetGadgetText(#string_principal)
  database = OpenFile(db, "database.txt")
  knownpcname$ = ReadString(database)
  If pcname$ = knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Bienvenue " + pcname$ + " !")
  ElseIf pcname$ <> knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Nouveau joueur (Oui/Non) ?")
    If GetGadgetText(#string_principal) = "oui" And KeyboardReleased(#PB_Key_Return)
      WriteStringN(database, pcname$)
      CloseFile(database)
    Else ;If GetGadgetText(#string_principal) = "non" And KeyboardReleased(#PB_Key_Return)
      ;init()
      CloseFile(database)
      End
    EndIf
  EndIf
EndProcedure 


l'appuis sur "Return" est detecté par un evenement de menu !!
j'ai modifié ta procedure UG
elle renvoie maintenant le nom entré a toi de faire ce que tu en veux ! :D
tu peux meme rester dans cette procedure, pour accepter ou refuser un Login :D

voila en esperant que tu arrive a comprendre le principe :D

ps : tu te lance dans du "Mixte" ecran ET Gadget, c'est pas la solution la plus facile pour faire un jeux :D Mais bon , comme tu veux, bon courage :D
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Non, tu modifies trop de choses et mon programme ne peut plus faire ce qu'il est censé faire, à savoir uniquement une interaction ; je tape un truc, le programme fait ceci. Moi j'aimerais savoir pourquoi quand je tape un nouveau nom, il me propose "nouveau joueur" mais quand j'essaie oui ou non ensuite, plus rien ne se passe ; merci.

(Je n'essaie pas de mixer fenêtre et écran, c'est en commentaires WindowedScreen)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ceci avait pour but de t'expliquer que la touche return en mode fenetre windows, est geré par les racourci clavier !

que le String gadget , on pouvais recuperer son contenu
a la volé !! pas besoin d'apuyer sur Return !!

puisque a chaque caractere, l'evenement du string gadget est appelé !

:D

j'ai affiché un message requester pour te montrer comment on recupere
les infos du string gadget
Dernière modification par Backup le mar. 08/août/2006 16:39, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

si tu prefere regarde celui-ci !!

Code : Tout sélectionner

; ** Déclaration des constantes
; * Interface
; Fenêtres
Enumeration
  #fenetre_principal
  #fenetre_statistiques
  #fenetre_carte
EndEnumeration
; Gadgets
Enumeration
  #frame_principal
  #scroll_principal
  #text_principal
  #string_principal
  #bouton_statistique
  #bouton_carte
EndEnumeration

; ** Déclaration des variables
; * Global

; * Local
database = CreateFile(db,"database.txt")

; ** Déclaration des procédures
Declare.s ug(commande$)
Declare init()

; ** Assignations par défaut


; Initialisations standards
InitKeyboard()
InitSprite()

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

; Création de l'interface
If OpenWindow(#fenetre_principal,0,0,800,600,"UG",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
 ; OpenWindowedScreen(WindowID(#fenetre_principal),0,0,800,600,1,0,0)
  If CreateGadgetList(WindowID(#fenetre_principal))
    StringGadget(#string_principal,15,430,770,20,commande$,#PB_String_LowerCase)
    ButtonGadget(#bouton_statistique,15,460,60,20,"Statistiques")
    ScrollAreaGadget(#scroll_principal,15,15,770,400,770,400,1,#PB_ScrollArea_Center|#PB_ScrollArea_Flat)
    OpenGadgetList(#scroll_principal)
    TextGadget(#text_principal,0,0,770,1000,"Veuillez entrer votre nom...")
    CloseGadgetList()
  EndIf
  
  SetGadgetColor(#text_principal,#PB_Gadget_BackColor,RGB(0,0,0))
  SetGadgetColor(#text_principal,#PB_Gadget_FrontColor,RGB(250,250,250))
EndIf
AddKeyboardShortcut(#fenetre_principal, #PB_Shortcut_Return, 13); ajoute un racourci clavier qui va generer un evenement "13"


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

;Boucle principale
Repeat
  ; ******************* Lit les differents evenements ***********************************
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type
  eventmenu= EventMenu() ; gere les menu eventuel ainsi que les racourci clavier !!!
  ; ********************************************************************************************
  
  If Event= #PB_Event_Gadget  ; ********* dessous on gere les evenement gadget
    
    If GadgetID = #bouton_statistique ; le bouton "statistique"
      Break   
    EndIf 
    If GadgetID= #string_principal ; ceci est executé a chaque characatere tappé c'est du temps reel !!
    EndIf   
  EndIf
  
  
  If Event= #PB_Event_CloseWindow  ; ***** dessous on gere les evenement fenetre
    End
  EndIf
  
  If eventmenu=13 ; ***** dessous on gere les evenement menu et racourci clavier
    nom$=ug(commande$) 
  EndIf
  
  
  
  
  
  ; *** Gestion du jeu ***
  ; Reconnaissance ou non du joueur
  ExamineKeyboard()
  init()
  
  
ForEver

End


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

Procedure.s  ug(commande$)
  nom$= GetGadgetText(#string_principal) 
  SetGadgetText(#text_principal, "tu t'apelle..."+nom$) 
  ProcedureReturn nom$ ; retourn eventuelement la commande , ou bien n'importe quoi 
EndProcedure

Procedure init()
  pcname$ = GetGadgetText(#string_principal)
  database = OpenFile(db, "database.txt")
  knownpcname$ = ReadString(database)
  If pcname$ = knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Bienvenue " + pcname$ + " !")
  ElseIf pcname$ <> knownpcname$ And KeyboardReleased(#PB_Key_Return)
    SetGadgetText(#string_principal,"")
    SetGadgetText(#text_principal,GetGadgetText(#text_principal) + Chr(10) + "Nouveau joueur (Oui/Non) ?")
    If GetGadgetText(#string_principal) = "oui" And KeyboardReleased(#PB_Key_Return)
      WriteStringN(database, pcname$)
      CloseFile(database)
    Else ;If GetGadgetText(#string_principal) = "non" And KeyboardReleased(#PB_Key_Return)
      ;init()
      CloseFile(database)
      End
    EndIf
  EndIf
EndProcedure
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Le but de tout ça serait en fait de faire un MUD (multi user dungeon) ou MOO ; donc, pour ceux qui connaissent, un RPG "textuel". J'aimerais faire tourner ça dans une entreprise et je serai ravi de prendre quelques informations sur ce sujet là. Comment procéder au mieux dans PureBasic pour arriver à mes fins ? Je ne parle pas pour le moment d'un développement réseau, prenons d'abord en compte l'élaboration de la partie solo. Je ne demande pas de codes précis, juste des "stratégies techniques" (ce qui est essentiel pour ce genre de projet, ce qui ne l'est pas etc...)

Merci beaucoup pour vos futurs conseils.

EDIT : Quel serait par exemple le meilleur moyen de traiter des commandes répétitives, "regarder", "prendre", "inventaire" et tout ce genre de choses commun aux MUDs. Egalement, comment faire pour traiter en routine la compréhension d'une commande, "je tape ça le pc fait ça" et enfin, que choisir entre la console, l'écran ou la fenêtre ?
Répondre