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
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
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 ???
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
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 :
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