zone de texte temps réel dans un jeu !

Programmation avancée de jeux en PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

........
Dernière modification par Backup le mar. 19/août/2014 13:34, modifié 1 fois.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

On dirait que j’ai un dont pour trouver les Bugs moi.

Merci Dobro pour tes réponses rapides
:wink:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Nooooon c’était pas un bug , le problème venait des ( ) :
Il faut mettre les ( ) de la procédure aussi et désactiver le >déboguer< :

Code : Tout sélectionner

Procedure erreur()
MessageRequester("info","erreeeeeeeuuuuuuuuuuuur")
EndProcedure

OnErrorGosub(@erreur())

a = a / 0
là ça marche :D
MMais j'ai remarqué une chose , les Onerror ne détectent pas toutes les erreurs ??????
ex:
si vous mettez Closescreen() sans avoir ouvert une , y'a pas de message d'érreur !! Bizarre
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Mytic a écrit :Nooooon c’était pas un bug , le problème venait des ( )
ha oui ! quel ane !! :oops:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

:lol: on est deux alors ^^
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Là les gens vous êtes dans trip que je n'aurai jamais cru encore exister en 2007!

Quand je pense que j'avais 8 ans, je tournais sous ExcelBasic. C'était un ordi à part assez étrange. Il offrait de la couleur et du scrolling pour les avertis. C'était en 1989. Il était bien. Tu l'allumais et direct... Dans le Basic comme les consoles! Tu pouvais créer tes cartouches mémoire qui s'exécutait aussi vite que ça. Cet ordi s'appelait EXL100.

ça ne dit peut-être pas grand chose. Moi, je n'ai jamais fait de scrolling ni acheté de cartouche mais la commande GOTO... Qu'est-ce que je m'en souviens de cette méchante surtout quand je ne pouvais pas sauver mon programme...

Ensuite, il y a GW-Basic sur un PC 8088 à 4MHz:
Tu remplaces la ligne 20 qui sortait de ta boucle
"90 GOTO 10" et ton programme partait au ciel. Chaque touche qui fait bip et un écran bloqué. T'es obligé de faire Ctrl-Alt-Suppr en pleurant :D

C'est vrai qu'aujourd'hui, plus rien ne plante si facilement. Plus rien n'est exécuté sans être sauvegardé (sauf les New*) mais la GOTO me reste un peu comme un quelque chose à n'utiliser qu'un dernier recours. Et c'est vraiment rare.

Sinon je rejoins un peu Dobro pour l'ordre des choses. J'ai du mal quand toutes mes "Global", "Declaration", "Procedure" ne sont pas ensemble. Je mettais les procedures en tête il y a quelques jours, jusqu'à ce qu'une procédure en appelle une autre. Là il fallait vraiment déclarer. Et de fil en aiguilles, les procédures ont migrés en bas quand elles ne sont pas encore mises en PBI ou DLL.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ollivier a écrit : Sinon je rejoins un peu Dobro pour l'ordre des choses. J'ai du mal quand toutes mes "Global", "Declaration", "Procedure" ne sont pas ensemble
pour la relecture, c'est quand même plus sympath d'avoir les procédures en bas de listing , car sinon sur de gros projet, durant le Scrolling on se colle une bonne centaines de lignes de Procédure avant , d'enfin arriver a la boucle principale !!

par définition, les Déclaration génère des lignes moins longues (pas de paramètres qui prenne de la largeur dans l'éditeur), et lorsqu'on arrive a la boucle principal, on s'en rend mieux compte !! :D

bref plein d'avantage ! :D
nous avions déjà fait un topic sur l'organisation d'un listing :)

moi j'ai encore mon ZX81 !! déja mis la photo ici :)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

oui, pareil pour moi, procedure en bas, c'est la logique qui le veut.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

J'ai fait une ou deux modif. Pardonnez-moi si j'ai chamboulé l'architecture. Je ne trouvais pas les Sprites très utiles. Mais il y avait peut-être une raison pour leur présence...

Code : Tout sélectionner

Global Texte$ 
 
Declare Graph() 
Declare zone_texte(x.l,Y.l,Couleur.l) 
Declare.S Curs(ms.L, Char.S = "_")

InitSprite () 
InitKeyboard () 
OpenWindow (0,0,0,300,300, "" ) 
OpenWindowedScreen ( WindowID (0),0,0,300,300,0,0,0) 

Texte$ = "A>"
Repeat 
    Graph() 
    FlipBuffers () 
    Event = WindowEvent () 
Until Event = #PB_Event_CloseWindow 





Procedure zone_texte(x.l,Y.l,Couleur.l) 
  ExamineKeyboard()
  Texte$ = Left(Texte$, Len(Texte$) - KeyboardReleased( #PB_Key_Back ) ) + KeyboardInkey ()
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText (x+2,Y+2,texte$ + Curs(500),#Black,0) 
  DrawText (x,Y,texte$ + Curs(500),Couleur,0)    
EndProcedure 

Procedure Graph() 
    StartDrawing ( ScreenOutput ()) 
    xc = 1 
    yc = 1 
     For Rayon = 400 To 10 Step -10 
         Circle (xc, yc, Rayon , RGB ( Random (255), Random (255), Random (255))) 
     Next Rayon 
    zone_texte(10,10,#White) 
     StopDrawing () 
EndProcedure 

Procedure.S Curs(ms.L, Char.S = "_")
  Static Used.L
  Static Start.L
  Static CursorStat.B
  If Used = 0: Start = ElapsedMilliseconds(): Used = 1: EndIf
  If ElapsedMilliseconds() > Start + ms
    CursorStat = 1 - CursorStat
    Used = 0
  EndIf
  If CursorStat
    ExitChar.S = Char
  Else
    ExitChar = ""
  EndIf
  ProcedureReturn ExitChar
EndProcedure
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

c'est sympath aussi comme ça :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Et comme ça ? :D

Code : Tout sélectionner

Global MaxText.L
MaxText = 15
Global Dim Texte$(MaxText)
Global Ptr.L
  
Declare Graph() 
Declare zone_texte(x.l,Y.l,Couleur.l) 
Declare.S Curs(ms.L, Char.S = "_") 

InitSprite () 
InitKeyboard () 
OpenWindow (0,0,0,300,300, "" ) 
OpenWindowedScreen ( WindowID (0),0,0,300,300,0,0,0) 

Texte$(0) = "Ecrit et appuie sur [Entrée]"
Ptr = 1
Repeat 
    Graph() 
    FlipBuffers () 
    Event = WindowEvent () 
Until Event = #PB_Event_CloseWindow 





Procedure zone_texte(x.l,Y.l,Couleur.l) 
  ExamineKeyboard() 
  Texte$(Ptr) = Left(Texte$(Ptr), Len(Texte$(Ptr) ) - KeyboardReleased( #PB_Key_Back ) ) + KeyboardInkey () 
  If KeyboardReleased(#PB_Key_Return)
    Ptr + 1
    If Ptr > MaxText
      Ptr = MaxText
      For i = 0 To MaxText - 1
        Texte$(i) = Texte$(i + 1)
      Next i
      Texte$(MaxText) = ""
    EndIf
  EndIf
  DrawingMode(#PB_2DDrawing_Transparent)
  For i = 0 To MaxText
    If i = Ptr
      DrawText (x+2,Y+2+i*16,texte$(i) + Curs(500),#Black,0) 
      DrawText (x,Y+i*16,texte$(i) + Curs(500),Couleur,0)
    Else
      DrawText (x+2,Y+2+i*16,texte$(i),#Black,0) 
      DrawText (x,Y+i*16,texte$(i),Couleur,0)
    EndIf
  Next i
EndProcedure 

Procedure Graph() 
    StartDrawing ( ScreenOutput ()) 
    xc = 1 
    yc = 1 
     For Rayon = 400 To 10 Step -10 
         Circle (xc, yc, Rayon , RGB ( Random (255), Random (255), Random (255))) 
     Next Rayon 
    zone_texte(10,10,#White) 
     StopDrawing () 
EndProcedure 

Procedure.S Curs(ms.L, Char.S = "_") 
  Static Used.L 
  Static Start.L 
  Static CursorStat.B 
  If Used = 0: Start = ElapsedMilliseconds(): Used = 1: EndIf 
  If ElapsedMilliseconds() > Start + ms 
    CursorStat = 1 - CursorStat 
    Used = 0 
  EndIf 
  If CursorStat 
    ExitChar.S = Char 
  Else 
    ExitChar = "" 
  EndIf 
  ProcedureReturn ExitChar 
EndProcedure 
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Bravo >Ollivier< !!
J’aime bien la nouvelle méthode…
Mais pour les sprites que t’a jugé inutiles, ben… leur utilité survient dans un milieu hostile, genre un milieu ou y’a plusieurs couches de sprites , et là le StartDrawing() n’a plus d’effet , car le texte une fois dessiné , avec le FlipBuffer() il disparaît vite , et si ce n’est pas le cas , y’aura des clignotements , donc vaut mieux dessiner sur un sprite puis afficher le sprite à l’écran.
Je dis ça, car sa m’est déjà arriver.
:?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Et si tu affiches ton texte en dernier, ça merdoie toujours??
Parce que là, je m'amusais bien

Code : Tout sélectionner

Global MaxText.L
MaxText = 15
Global Dim Keyb.L(255)
Global Dim KeybStart.L(255)
Global Dim Texte$(MaxText)
Global Ptr.L
  
Declare Graph() 
Declare zone_texte(x.l,Y.l,Couleur.l) 
Declare.S Curs(ms.L = 200, Char.S = "_") 
Declare.L Keyboard(Touche.L, AttenteIni.L = 500) 

InitSprite () 
InitKeyboard () 
LoadFont(0, "Verdana", 12, #PB_Font_Italic| #PB_Font_Bold)
OpenWindow (0,0,0,300,300, "" ) 
OpenWindowedScreen ( WindowID (0),0,0,300,300,0,0,0) 

Texte$(0) = "Ecrit et appuie sur [Entrée]"
Ptr = 1
Repeat 
    Graph() 
    FlipBuffers () 
    Event = WindowEvent () 
Until Event = #PB_Event_CloseWindow 





Procedure zone_texte(x.l,Y.l,Couleur.l) 
  ExamineKeyboard() 
  Texte$(Ptr) = Left(Texte$(Ptr), Len(Texte$(Ptr) ) - Keyboard( #PB_Key_Back ) ) + KeyboardInkey () 
  If Keyboard(#PB_Key_Return)
    Ptr + 1
    If Ptr > MaxText
      Ptr = MaxText
      For i = 0 To MaxText - 1
        Texte$(i) = Texte$(i + 1)
      Next i
      Texte$(MaxText) = ""
    EndIf
  EndIf
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0) )
  th = TextHeight("A")
  For i = 0 To MaxText
    If i = Ptr
      DrawText (x+2,Y+2+i*th,texte$(i) + Curs(),#Black,0) 
      DrawText (x,Y+i*th,texte$(i) + Curs(),Couleur,0)
    Else
      DrawText (x+2,Y+2+i*th,texte$(i),#Black,0) 
      DrawText (x,Y+i*th,texte$(i),Couleur,0)
    EndIf
  Next i
EndProcedure 

Procedure Graph() 
    StartDrawing ( ScreenOutput ()) 
    xc = 1 
    yc = 1 
     For Rayon = 400 To 10 Step -10 
         Circle (xc, yc, Rayon , RGB ( Random (255), Random (255), Random (255))) 
     Next Rayon 
    zone_texte(10,10,#White) 
     StopDrawing () 
EndProcedure 

Procedure.S Curs(ms.L = 200, Char.S = "_") 
  Static Used.L 
  Static Start.L 
  Static CursorStat.B 
  If Used = 0: Start = ElapsedMilliseconds(): Used = 1: EndIf 
  If ElapsedMilliseconds() > Start + ms 
    CursorStat = 1 - CursorStat 
    Used = 0 
  EndIf 
  If CursorStat 
    ExitChar.S = Char 
  Else 
    ExitChar = "" 
  EndIf 
  ProcedureReturn ExitChar 
EndProcedure 

Procedure.L Keyboard(Touche.L, AttenteIni.L = 500) 
  Static Used.L 
  Static Start.L 
  Static CursorStat.B 
  Signal = 0
  If KeyboardPushed(Touche)
    If Keyb(Touche) = 0
      Keyb(Touche) = 1
      KeybStart(Touche) = ElapsedMilliseconds()
      Signal = 1
    Else
      If ElapsedMilliseconds() > KeybStart(Touche) + AttenteIni
        Signal = 1
      EndIf
    EndIf
  Else
    Keyb(Touche) = 0    
  EndIf
  ProcedureReturn Signal
EndProcedure 

Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ptain, foutu sprite qui s'afficha pas
(Il est dans la procedure Graph() )

Code : Tout sélectionner

Global MaxText.L
MaxText = 15
Global Dim Keyb.L(255)
Global Dim KeybStart.L(255)
Global Dim Texte$(MaxText)
Global Ptr.L
  
Declare Graph() 
Declare zone_texte(x.l,Y.l,Couleur.l) 
Declare.S Curs(ms.L = 200, Char.S = "_") 
Declare.L Keyboard(Touche.L, AttenteIni.L = 500) 

InitSprite () 
InitKeyboard () 
LoadFont(0, "Verdana", 12, #PB_Font_Italic| #PB_Font_Bold)
OpenWindow (0,0,0,300,300, "" ) 
OpenWindowedScreen ( WindowID (0),0,0,300,300,0,0,0) 

Texte$(0) = "Ecrit et appuie sur [Entrée]"
Ptr = 1
Repeat 
    Graph() 
    FlipBuffers () 
    Event = WindowEvent () 
Until Event = #PB_Event_CloseWindow 





Procedure zone_texte(x.l,Y.l,Couleur.l) 
  ExamineKeyboard() 
  Texte$(Ptr) = Left(Texte$(Ptr), Len(Texte$(Ptr) ) - Keyboard( #PB_Key_Back ) ) + KeyboardInkey () 
  If Keyboard(#PB_Key_Return)
    Ptr + 1
    If Ptr > MaxText
      Ptr = MaxText
      For i = 0 To MaxText - 1
        Texte$(i) = Texte$(i + 1)
      Next i
      Texte$(MaxText) = ""
    EndIf
  EndIf
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0) )
  th = TextHeight("A")
  For i = 0 To MaxText
    If i = Ptr
      DrawText (x+2,Y+2+i*th,texte$(i) + Curs(),#Black,0) 
      DrawText (x,Y+i*th,texte$(i) + Curs(),Couleur,0)
    Else
      DrawText (x+2,Y+2+i*th,texte$(i),#Black,0) 
      DrawText (x,Y+i*th,texte$(i),Couleur,0)
    EndIf
  Next i
EndProcedure 

Procedure Graph()
  Static a.L
  If a = 0
    a = 1
    CreateSprite(0, 100, 100)
    StartDrawing (SpriteOutput(0)) 
    Box(1, 1, 90, 90, #Red)
    StopDrawing()
  EndIf
    StartDrawing ( ScreenOutput ()) 
    xc = 1 
    yc = 1 
     For Rayon = 400 To 10 Step -10 
         Circle (xc, yc, Rayon , RGB ( Random (255), Random (255), Random (255))) 
     Next Rayon    
    DisplaySprite(0, 0, 0)
    zone_texte(10,10,#White) 
     StopDrawing () 
EndProcedure 

Procedure.S Curs(ms.L = 200, Char.S = "_") 
  Static Used.L 
  Static Start.L 
  Static CursorStat.B 
  If Used = 0: Start = ElapsedMilliseconds(): Used = 1: EndIf 
  If ElapsedMilliseconds() > Start + ms 
    CursorStat = 1 - CursorStat 
    Used = 0 
  EndIf 
  If CursorStat 
    ExitChar.S = Char 
  Else 
    ExitChar = "" 
  EndIf 
  ProcedureReturn ExitChar 
EndProcedure 

Procedure.L Keyboard(Touche.L, AttenteIni.L = 500) 
  Static Used.L 
  Static Start.L 
  Static CursorStat.B 
  Signal = 0
  If KeyboardPushed(Touche)
    If Keyb(Touche) = 0
      Keyb(Touche) = 1
      KeybStart(Touche) = ElapsedMilliseconds()
      Signal = 1
    Else
      If ElapsedMilliseconds() > KeybStart(Touche) + AttenteIni
        Signal = 1
      EndIf
    EndIf
  Else
    Keyb(Touche) = 0    
  EndIf
  ProcedureReturn Signal
EndProcedure 

Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

C’est ce que j’ai remarqué !
Sympa l’effet de défilement , je sais pas pourquoi mais ça me rappel le Qbasic
:roll:
Répondre