Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| défilement des sprites | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: défilement des sprites Sam 11 Fév 2017 - 18:49 | |
| Sur l'idée du jeu de l'ami jjn4 avec son bandit manchot (bien fait entre parenthèses), je voulais voir l'influence de la commande PAUSE dans la vitesse du défilement. - Code:
-
LABEL Lance DIM fnt$,w%,h%,e%,x%,y%,i%,j%,k%,nc%,nb%,ne%,a$,fs$,ys%(20),yy%,n% fs$ = "C:\TEMP\Spr.bmp"
DATA "Arial","0","1","2","3","4","5","6","7","8","9" DATA "Fin" TOP 0,SCREEN_Y/2: LEFT 0,SCREEN_X/2: WIDTH 0,80: HEIGHT 0,125: BORDER_SMALL 0 COLOR 0,255,64,64: CAPTION 0,"": FONT_BOLD 0 nc% = 3: ' nombre de roues (ajuster width 0) w% = 30: h% = 50: e%=2: ' dimensions d'une case, espacement entre roues ne% = 0: READ a$ READ a$: WHILE a$<>"Fin": ne% = ne%+1: READ a$: END_WHILE: ' nombre d'éléments par roue PICTURE 1: WIDTH 1,w%: HEIGHT 1,h%*(ne%+1): ' pour dessiner le sprite de base 2D_TARGET_IS 1: 2D_FILL_COLOR 255,255,255 PRINT_TARGET_IS 1: FONT_COLOR 1,5,5,5 RESTORE: READ fnt$: FONT_NAME 1,fnt$: FONT_SIZE 1,32 y% = 0: x% = 0 FOR i% = 0 TO 50 READ a$: IF a$ = "Fin" THEN EXIT_FOR PRINT_LOCATE x%+3,y%+2: PRINT a$ ys%(i%) = y%: y% = y%+h% NEXT i% FILE_SAVE 1,fs$ 2D_TARGET_IS 0: PRINT_TARGET_IS 0: DELETE 1 SCENE2D 10: TOP 10,5: LEFT 10,10: WIDTH 10,nc%*w%+(nc%+1)*e%: HEIGHT 10,ne%*h% HEIGHT 10,h% FOR i% = 11 TO 11+nc%-1: SPRITE i%: NEXT i% BUTTON 30: TOP 30,HEIGHT(10)+12: LEFT 30,22: CAPTION 30,"Lancer": ON_CLICK 30,Lance FOR i% = 11 TO 11+nc%-1 SPRITE_FILE_LOAD i%,fs$ x% = e%+(i%-11)*(w%+e%): SPRITE_POSITION i%,x%,0 NEXT i% FILE_DELETE fs$ END ' ============================================================================== Lance: FOR k% = 11 TO 11+nc%-1 n% = 1+RND(ne%-1): j% = 0 FOR y% = 0 TO -1*h%*(ne%-2) STEP -1*h% FOR yy% = y% TO y%-h% STEP -2 SPRITE_Y_POSITION k%,yy% ' PAUSE 1 FOR i% = 1 TO 2000: NEXT i% NEXT yy% j% = j%+1: IF j% >= n% THEN EXIT_FOR NEXT y% NEXT k% RETURN ' ============================================================================== Et pour cette application, je m'aperçois que cette commande PAUSE ralentit trop, même au minimum (PAUSE 1). En la remplaçant par une boucle, la vitesse de défilement est beaucoup plus facile à moduler, même si c'est moins élégant. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 11 Fév 2017 - 19:12 | |
| Oui, c'est exact. C'est comme pour les midi_play la durée minimum, c'est 10 (midi_play N,10) qui fait 125 millisecondes, ce qui est très très long et ralentit énormément si on veut utiliser des sons dans un mouvement rapide où il faudrait de 1 ou 2 millisecondes seulement, voire moins. Pareil pour les pause qu'il faudrait avoir en microsecondes. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: défilement des sprites Sam 11 Fév 2017 - 19:53 | |
| En effet ta démonstration fait tout à fait son office et cette commande n'est en effet pas adapté pour ce type d'usage et devrait permettre plus de précision dans ce cadre | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: défilement des sprites Sam 11 Fév 2017 - 20:03 | |
| Bonjour à tous ! Chez moi, une pause inférieure à 15ms n'est pas possible. - Code:
-
dim temps1,temps2,resultat temps1 = NUMBER_TICKS
pause 1 : ' <= à moduler suivant vos désirs !
temps2 = NUMBER_TICKS Resultat=(temps2-temps1)/1000 print "Durée : "+str$(resultat)+" seconde(s)" EDIT : suite dans la rubrique A L'AIDE : https://panoramic.1fr1.net/t5129-number_ticks-et-pause#62836 | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: défilement des sprites Sam 11 Fév 2017 - 23:08 | |
| @JL35 si tu en fait un .exe, et que tu le teste sur des pc de vitesse différente, tu auras un affichage plus ou moins rapide en fonction de l'ordinateur. Pour contrer ce phénomène, il existe une technique appelée "mouvement basé sur le temps". J'ai créé une serie de sub qui fait cela ici.(De souvenir, ce n'est pas que pour la 3d) Voici un basique essai 2d que je me suis fait à l'époque pour voir si ça pouvait fonctionner sous panoramic. C'est un code ancien que j'ai conservé, il n'est pas sans défaut mais la technique est là: - Code:
-
dim tbm,old_time
dim posx,posy dim depx,vitX dim depy,vitY
label souris dim scan,old_k1,k1,old_k2,k2,temps
' dll pour la mesure du temps dll_on "kernel32"
' un délai de ralentissement par défaut(pour le lag imposé par l'utilisateur) temps=50 dim tmp$,current_time
' panoramic est synchonisé en interne à 60 fps, soit 1/60 seconde par image ' vitX=300 :' 300 pixels horizontaux par seconde vitY=200 :' 200 pixels verticaux par seconde repeat ' la sub en action : remplir la variable tbm SPEED_SYNC()
cls depx=depx+(vitX*tbm) :' déplacement horizontal modulé en fonction du temps ' tmp$=str$(vitX*tbm) + " / " + str$(tbm) : caption 0,tmp$ posx=50+depx :' if (posx>=(width(0)-58)) then vitX=0-256 :' on touche le bord, on change le sens du déplacement(rebond) if (posx<=50) then vitX=256 :' on touche le bord, on change le sens du déplacement(rebond) ' depy=depy+(vitY*tbm) :' déplacement vertical modulé en fonction du temps posy=50+depy :' if (posy>=(height(0)-84)) then vitY=0-200 :' on touche le bord, on change le sens du déplacement(rebond) if (posy<=50) then vitY=200 :' on touche le bord, on change le sens du déplacement(rebond)
2d_circle posx,posy,50 :' positionne et affiche le cercle
' le délai de ralentissement géré par la souris(lag imposé par l'utilisateur) gosub souris wait 1+temps
' affichage d'infos caption 0,"'return'=quitter, souris gauche/droite= ralentir/accelerer le 'lag'(="+str$(temps)+" ms)"
' fin si touche 'return' until scan=13
TERMINATE ' END sub SPEED_SYNC() ' dim_local current_time ' "GetTickCount"=mesure en milliseconde, le temps écoulé depuis l'allumage du PC if old_time=0 ' 1er appel, on initialise la variable avec une valeur par défaut tbm=0.001 : old_time=dll_call0("GetTickCount") else current_time=dll_call0("GetTickCount") ' seconde/image tbm=(current_time-old_time)*0.001 old_time=current_time end_if end_sub
souris: old_k1=k1 old_k2=k2 scan=scancode
select scan case 0:k1=0:k2=0 case 1:k1=1 case 2:k2=1 end_select
' souris gauche if (k1-old_k1)>0 then temps=temps-25 ' souris droite if (k2-old_k2)>0 then temps=temps+25 if temps>100 then temps=100 if temps<0 then temps=0 return | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: défilement des sprites Dim 12 Fév 2017 - 0:20 | |
| Je n'ai pas encore fait d'essais, mais je suis bien d'accord que le comportement doit être différent en version compilée, sans doute plus rapide, plutôt qu'en interprété. Il faudrait peut-être essayer avec des tests de NUMBER_TICKS pour plus de précision... C'est vrai que le PAUSE de valeurs faibles n'a pas de sens. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: défilement des sprites Dim 12 Fév 2017 - 0:31 | |
| Changez PAUSE par WAIT et constatez par vous-même
La commande PAUSE N arrête l'exécution du programme pendant N millisecondes. Les actions en attente sont effectuées. La commande WAIT N gèle l'exécution du programme pendant N millisecondes. Les actions en attente ne sont pas effectuées.
Wait est plus précis(e). | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: défilement des sprites Dim 12 Fév 2017 - 0:54 | |
| Rapidement, il me semble que j'avais essayé avec WAIT et que ça faisait pareil que PAUSE, mais je n'ai sans doute pas été assez rigoureux dans mon test. Même s'il semble ne pas y avoir d'action en attente, il doit quand même y avoir dans le cas de Pause la surveillance des actions possibles (clic sur un bouton par exemple) qui ne doit pas se faire avec Wait. En attendant mieux... | |
| | | Contenu sponsorisé
| Sujet: Re: défilement des sprites | |
| |
| | | | défilement des sprites | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |