Page 1 sur 2

simplification commandes

Publié : mar. 03/mai/2022 16:21
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 ????

Re: simplification commandes

Publié : mar. 03/mai/2022 17:03
par Ar-S
Tu utilises bien cette commande dans un environnement 2d ?

Re: simplification commandes

Publié : mar. 03/mai/2022 17:33
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

Re: simplification commandes

Publié : mar. 03/mai/2022 17:45
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()

Re: simplification commandes

Publié : mar. 03/mai/2022 17:51
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

Re: simplification commandes

Publié : mar. 03/mai/2022 18:11
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

Re: simplification commandes

Publié : mar. 03/mai/2022 18:18
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

Re: simplification commandes

Publié : mar. 03/mai/2022 18:37
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)






Re: simplification commandes

Publié : mar. 03/mai/2022 19:13
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 ?

Re: simplification commandes

Publié : mar. 03/mai/2022 19:59
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.

Re: simplification commandes

Publié : mar. 03/mai/2022 20:03
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

Re: simplification commandes

Publié : mer. 04/mai/2022 12:39
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 ?

Re: simplification commandes

Publié : mer. 04/mai/2022 20:17
par Ollivier
Teste openglGadget : tu as plus de possibilités de traitements de sprites (ou équivalent)

Re: simplification commandes

Publié : mer. 04/mai/2022 22:01
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

Re: simplification commandes

Publié : jeu. 05/mai/2022 13:14
par drfloyd
Oui si c'est pas du "temps réel", je zappe

Autant dessiner le sprite dans sa position miroir