simplification commandes

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
drfloyd
Messages : 220
Inscription : mar. 21/août/2007 13:30
Contact :

simplification commandes

Message par drfloyd »

Hello,
Longtemps que j'etais pas passé ici, je me remets un peu au PB !

J'ai voulu simplifier les commandes pour les touches
Est ce que c'est normal que ca ne fonctionne pas :

Procedure droite()
KeyboardPushed(#PB_Key_Right)
EndProcedure


If droite():x=x+x1:EndIf

marche pas :)

On peut pas faire ca ????
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: simplification commandes

Message par Ar-S »

Tu utilises bien cette commande dans un environnement 2d ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: simplification commandes

Message par case »

tu ne renvois aucune valeur en dehors de ta procedure c'est pour ca :mrgreen:

Code : Tout sélectionner

Procedure droite()
ProcedureReturn KeyboardPushed(#PB_Key_Right)
EndProcedure
ImageImage
Avatar de l’utilisateur
Mindphazer
Messages : 695
Inscription : mer. 24/août/2005 10:42

Re: simplification commandes

Message par Mindphazer »

Si ta procédure doit renvoyer une valeur (en d'autres termes, si c'est une fonction), tu dois renvoyer la valeur avec ProcedureReturn

Attention à bien spécifier le type de la valeur renvoyée au niveau de la définition de te procédure :
Si ta procédure renvoie une chaine de caractères, par exemple, il faudra faire comme ceci :

Code : Tout sélectionner

Procedure.s renvoietoto()
  ProcedureReturn "Toto"
EndProcedure

Debug renvoietoto()
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
drfloyd
Messages : 220
Inscription : mar. 21/août/2007 13:30
Contact :

Re: simplification commandes

Message par drfloyd »

aaaah! bah merci, cool ! Ca marche

Top le forum

j'essaye de simplifier les commandes avant de commancer mon code, car c'est pas toujours simple en PB (surtout les commandes graphiques)

Moi je viens de DARK BASIC, BLITZ et autres... c'est pour ca :)

J'ai poussé le vice en integrant le examinekeyboard...

Code : Tout sélectionner

Procedure haut()
  ExamineKeyboard()
ProcedureReturn KeyboardPushed(#PB_Key_Up)
EndProcedure
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: simplification commandes

Message par case »

pas sur qu'integrer le examinekeyboard() soit une bonne chose car a chaque fois que tu vas interroger une touche tu vas examiner le clavier
alors qu'il suffit de l'examiner une fois par boucle en le metant dans la boucle principale
ImageImage
drfloyd
Messages : 220
Inscription : mar. 21/août/2007 13:30
Contact :

Re: simplification commandes

Message par drfloyd »

oui je sais, c'est con, c'est pour voir un minimum de choses inutiles dans la boucle... ca ralentit tu penses ?

parce que c'est quand meme curieux cette commande examine !

Le pire je trouve c'est STARTDRAWING pour le texte et les lignes/cercles... je pige pas pourquoi ca existe :mrgreen:
Pareil, du coup j'ai créé une procedure TEXT avec STARTDRAWING et STOPDRAWING intégrés

Code : Tout sélectionner

Procedure text (u,uu,u$,uuu)
   StartDrawing(ScreenOutput())   
   DrawText (u,uu,u$,uuu)
   StopDrawing()
 EndProcedure

C'est con aussi ??? :mrgreen:

Ca purifie mon code principal, ca ressemble desormais à du BLITZ BASIC
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: simplification commandes

Message par case »

ARGH

Code : Tout sélectionner

Procedure text (u,uu,u$,uuu)
   StartDrawing(ScreenOutput())   
   DrawText (u,uu,u$,uuu)
   StopDrawing()
 EndProcedure
c'est le pire, move possible :p la commande startdrawing/stop drawing est lente

Code : Tout sélectionner

InitSprite()
main=OpenScreen(800,600,32,"")
t=ElapsedMilliseconds()
StartDrawing(ScreenOutput())
For a=1 To 100
  DrawText(Random(800,1),Random(600,1),"test")
Next
StopDrawing()
Debug "test 1 > "+Str(ElapsedMilliseconds()-t)


t=ElapsedMilliseconds()
For a=1 To 100
StartDrawing(ScreenOutput())
  DrawText(Random(800,1),Random(600,1),"test")
StopDrawing()
Next
Debug "test 2 > "+Str(ElapsedMilliseconds()-t)





ImageImage
drfloyd
Messages : 220
Inscription : mar. 21/août/2007 13:30
Contact :

Re: simplification commandes

Message par drfloyd »

certes

Faut voir l'impact, sur un jeu d'arcade complexe, surement... mais bon sur un jeu de role 2D tendance rétro....

D'ou vient cette etrange nécessité du START et STOP drawing, alors que c'est pas necessaire pour les sprites ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: simplification commandes

Message par Ar-S »

Mais dans ta boucle 2D, tu dis juste "Je dessine dedans" et avant la fin de ta boucle "je clos la session de dessin".
Toi tu fais cette demande d'ouverture fermeture à chaque fois que tu veux afficher un truc ? C'est ça qui est inutile.

Concernant les sprites, rien ne t'empêche de dessiner ton texte en amont (genre au chargement de ton jeu) dans des sprites.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: simplification commandes

Message par Ollivier »

Justement, utilise les sprites direct : tu charges l'alphabet dans des sprites (1 lettre = 1 sprite). Et ça va être plus rapide à l'affichage, et un peu plus simple à afficher.

Pour le clavier, tu peux faire un

Code : Tout sélectionner

Global Dim K.I(255)
et examiner les 256 codes à chaque boucle.
2 avantages :

1) ça te donne une vitesse régulière de gestion, quelque soit l'état d'avancement de la programmation des touches.
2) si tu veux faire des tempo, des "macros" (pas le terme "macro" du langage, mais des "macros" comme des gestionnaires d'évènement clavier)

Pour la souris, tu peux faire à peu près pareil : un tableau qui récupère tout :

Code : Tout sélectionner

Dim Mouse.I(2, 7) ; 3 * 8 cellules
pour gérer les boutons (tempo/clic/double clic, etc...) et les positions x, y et z (z = molette souris)

En gros, avec 3 tableaux :

Code : Tout sélectionner

Structure PFS
   nID.I
   x.D
   y.D
   vx.D
   vy.D
   ax.D
   ay.D
   normeVitesse.D
   orientationVitesse.D
EndStructure
Dim K(255)
Dim Mouse(2, 7)
Dim Sprite.PFS(1023)
... tu peux tester régulièrement la prise max de ressources et automatiser assez facilement
drfloyd
Messages : 220
Inscription : mar. 21/août/2007 13:30
Contact :

Re: simplification commandes

Message par drfloyd »

Merci pour vos com'.
tout dépend après si on cherche à optimiser à fond.

Autre question (j'ai pas touché depuis 2 ans, y a p'etre des nouveautés ?) y a toujours pas de commande "sprite mirror" pour inverser un sprite horizontalement (utile quand un perso se deplace à droite puis à gauche par exemple). Je trouve ca super pratique. C'est con quand on sait qu'il y a rotate et zoom. Je sais qu'on peut y arriver avec la commande de déformation de sprite mais cette galère.

Sinon globalement, j'ai du essayer 50 basics dans ma vie, et franchement celui ci il dépote grave. Faut juste bien paramétrer son environnement en début de code et après on déroule tranquille. Mais le Startdrawing/stopdrawing m'agace ;) La longueur et le nom de certaines commandes aussi qui font qu'un débutant pourrait croire qu'il est très éloigné de l'esprit basic. J'ai trainé à l'essayer durant des années à la vue de la syntaxe de certains trucs, je bloquais.

Y a pas des jeux commerciaux Steam qui ont été dév avec cet outil, est ce que vous savez ?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: simplification commandes

Message par Ollivier »

Teste openglGadget : tu as plus de possibilités de traitements de sprites (ou équivalent)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: simplification commandes

Message par case »

pour le miroring de sprites ce n'est toujours pas d’actualité, mais par contre il est simple de faire un miroir assez rapide sur une image.
et d'en faire un sprite pas assez rapide pour du temps reel mais en a t'on vraiment besoin :) .

Code : Tout sélectionner

Procedure mirorpic(pic,dir.s="h"); horizontal par defaut
      buffer=CopyImage(pic,#PB_Any)      
      StartDrawing(ImageOutput(buffer)  )         
      hgt=ImageHeight(pic)
      wdt=ImageWidth(pic)
  nbpix_v=ImageWidth(pic)-1
  nbpix_h=ImageHeight(pic)-1
  Select dir      
    Case "h" ; miroir horizontal
      For x=0 To nbpix_h/2
        b1=GrabDrawingImage(#PB_Any,x,0,1,hgt)
        b2=GrabDrawingImage(#PB_Any,nbpix_h-x,0,1,hgt)
        DrawImage(ImageID(b1),nbpix_h-x,0)
        DrawImage(ImageID(b2),x,0)
        FreeImage(b1)
        FreeImage(b2)
      Next
    Case "v"
      For y=0 To nbpix_v/2
        b1=GrabDrawingImage(#PB_Any,0,y,wdt,1)
        b2=GrabDrawingImage(#PB_Any,0,nbpix_v-y,wdt,1)
        DrawImage(ImageID(b1),0,nbpix_v-y)
        DrawImage(ImageID(b2),0,y)
        FreeImage(b1)
        FreeImage(b2)
      Next

  EndSelect    
      StopDrawing()
  ProcedureReturn buffer
EndProcedure
; exemple d'utilisation
; genere une image miroir
UsePNGImageDecoder()
InitSprite()
pic$=OpenFileRequester("selectionnez une image png","","image png|*.png",1)
picture=LoadImage(#PB_Any,pic$)
ResizeImage(picture,400,400) ; pour eviter d'avoir une trop grande image



picture2=mirorpic(picture) ; genere une image miroir horizontale par raport a l'originale
picture3=mirorpic(picture,"v"); genere une image miroir verticale par raport a l'originale
picture4=mirorpic(picture3,"h"); genere une image miroir horizontale par raport au miroir vertical
main=OpenWindow(#PB_Any,0,0,ImageWidth(picture)*2,ImageHeight(picture)*2,"miror")
OpenWindowedScreen(WindowID(main),0,0,ImageWidth(picture)*2,ImageHeight(picture)*2)
Repeat
  ev=WaitWindowEvent(0)
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(picture), 0,0)
  DrawImage(ImageID(picture2), ImageWidth(picture),0)
  DrawImage(ImageID(picture3), 0,ImageHeight(picture))
  DrawImage(ImageID(picture4), ImageWidth(picture),ImageHeight(picture))
StopDrawing()
FlipBuffers()
Until ev=#PB_Event_CloseWindow
ImageImage
drfloyd
Messages : 220
Inscription : mar. 21/août/2007 13:30
Contact :

Re: simplification commandes

Message par drfloyd »

Oui si c'est pas du "temps réel", je zappe

Autant dessiner le sprite dans sa position miroir
Répondre