Page 1 sur 1

sprite, plot, clearscreen, flipbuffer....au secours!!!

Publié : lun. 02/janv./2006 4:16
par Huitbit
Bonne année!
Après un réveil difficile, j'ai mis en application mes bonnes résolutions!!!
Je suis(un débutant) en train de préparer un "tutoriel" pour profs débutants!
Le sujet est un classique des classes de 3ième et 2nde, la cycloïde!

Pour l'instant j'ai crée une roue, je la fais tourner (sans glissements) mais je ne sais pas comment faire pour afficher la trajectoire d'un point de la roue(la valve ou l'axe) au fur et à mesure avec un plot!

J'ai laissé dans le code le calcul des coordonnées de la valve
(positionXvalve;positionYvalve)

Si ce n'est pas possible, peut-on ouvrir un deuxième écran à coté pour tracer la trajectoire simultanément?

D'autres solutions ou idées sont les bienvenues!!!


Code : Tout sélectionner

;*****************variables utilisées********************

#RayonRoue=64 
#LargeurEcran=15*#RayonRoue
#HauteurEcran=4*#RayonRoue
#pi=3.1415927

Angle.f=0
PositionXvalve.f=0
PositionYvalve.f=0
PositionXaxe.f=32
PositionYaxe.f=32
;*****************initialisation**************************
InitKeyboard()
InitSprite()
InitSprite3D()
;*****************écrans*********************************
OpenWindow(1,1,1,#LargeurEcran,#HauteurEcran,#PB_Window_SystemMenu,"La cycloïde"); on ouvre une fenêtre
OpenWindowedScreen(WindowID(1),0,0,#LargeurEcran,#HauteurEcran,1,1,1); on met un écran dedans
;**************dessin du sol****************************

;**************dessin de la roue**********************
CreateSprite(0,128,128,#PB_Sprite_Texture); 
StartDrawing(SpriteOutput(0))
Circle(64,64,64,RGB(77, 125, 139));pneu(extérieur
Circle(64,64,48,RGB(0,0,0));pneu(intérieur)
LineXY( 32,32,96,96,RGB(193, 49, 54));
LineXY(32,96,96,32,RGB(193, 49, 54));
Box(104,60,8,8,RGB(249, 235, 6));valve 
Box(60,60,8,8,RGB(248, 43, 7));axe
StopDrawing()

CreateSprite3D(0,0)
;*******************************************************

Repeat ; boucle principale 
  
   Repeat 
     Event = WindowEvent() 
      
     Select Event 
       Case #PB_Event_CloseWindow 
         End 
     EndSelect 
   Until Event = #Null 
    
  Angle=Angle+1
  If Angle*#RayonRoue*#pi/ 180>=#LargeurEcran
  Angle=0
  EndIf
 
  
ClearScreen(0,0,0)



StartDrawing(ScreenOutput())

Box(0,3*#RayonRoue,#LargeurEcran,#RayonRoue,RGB(166, 240, 89));  dessin du sol (gazon!)
;*************infos provisoires sur le mouvement*******************
Locate(0,0)
DrawText("Distance=" + StrF((Angle)*32*#pi/ 180))
Locate(0,30)
DrawText("Tour(s)=" + StrF(Angle/360))
;******************************************************************

;**********************position de la valve************************
;PositionXvalve=64*Angle*#pi/180+48*Cos(Angle*#pi/180)+68
;PositionYvalve=48*Sin(Angle*#pi/180)+128
;Plot(PositionXvalve,PositionYvalve,RGB(57, 70, 243))
;******************************************************************

StopDrawing()

;******************affichage de la roue****************************
Start3D()

RotateSprite3D(0,Angle,0)
DisplaySprite3D(0,Angle*#RayonRoue*#pi/ 180,#RayonRoue)


Stop3D() 

FlipBuffers () 

 
ForEver



Merci d'avance!!!

Publié : lun. 02/janv./2006 5:12
par filperj
La solution la plus simple, c'est probablement de dessiner la courbe dans un sprite de la taille de l'écran, et de le rendre en fin de boucle par-dessus tout le reste.
J'ai fait comme ça: (j'ai pas eu besoin d'ajouter grand-chose)

Code : Tout sélectionner

;*****************variables utilisées********************

#RayonRoue=64
#LargeurEcran=15*#RayonRoue
#HauteurEcran=4*#RayonRoue
#pi=3.1415927

Angle.f=0
PositionXvalve.f=0
PositionYvalve.f=0
PositionXaxe.f=32
PositionYaxe.f=32
;*****************initialisation**************************
InitKeyboard()
InitSprite()
InitSprite3D()
;*****************écrans*********************************
OpenWindow(1,1,1,#LargeurEcran,#HauteurEcran,#PB_Window_SystemMenu,"La cycloïde"); on ouvre une fenêtre
OpenWindowedScreen(WindowID(1),0,0,#LargeurEcran,#HauteurEcran,1,1,1); on met un écran dedans
;**************dessin du sol****************************

;**************dessin de la roue**********************
CreateSprite(0,128,128,#PB_Sprite_Texture);
StartDrawing(SpriteOutput(0))
Circle(64,64,64,RGB(77, 125, 139));pneu(extérieur
Circle(64,64,48,RGB(0,0,0));pneu(intérieur)
LineXY( 32,32,96,96,RGB(193, 49, 54));
LineXY(32,96,96,32,RGB(193, 49, 54));
Box(104,60,8,8,RGB(249, 235, 6));valve
Box(60,60,8,8,RGB(248, 43, 7));axe
StopDrawing()

CreateSprite3D(0,0)
;*******************************************************

CreateSprite(1,#LargeurEcran,#HauteurEcran)

Repeat ; boucle principale
 
   Repeat
     Event = WindowEvent()
     
     Select Event
       Case #PB_Event_CloseWindow
         End
     EndSelect
   Until Event = #Null
   
  Angle=Angle+1
  If Angle*#RayonRoue*#pi/ 180>=#LargeurEcran
  Angle=0
  EndIf
 
 
ClearScreen(0,0,0)



StartDrawing(ScreenOutput())

Box(0,3*#RayonRoue,#LargeurEcran,#RayonRoue,RGB(166, 240, 89));  dessin du sol (gazon!)
;*************infos provisoires sur le mouvement*******************
Locate(0,0)
DrawText("Distance=" + StrF((Angle)*32*#pi/ 180))
Locate(0,30)
DrawText("Tour(s)=" + StrF(Angle/360))
;******************************************************************

StopDrawing()


StartDrawing(SpriteOutput(1))

;**********************position de la valve************************
PositionXvalve=64*Angle*#pi/180+48*Cos(Angle*#pi/180)+68
PositionYvalve=48*Sin(Angle*#pi/180)+128
If PositionXvalve>=0 And PositionXvalve<#LargeurEcran-1 And PositionYvalve>=0 And PositionYvalve<#HauteurEcran-1
   Plot(PositionXvalve,PositionYvalve,RGB(57, 70, 243))
EndIf
;******************************************************************

StopDrawing()

;******************affichage de la roue****************************
Start3D()

RotateSprite3D(0,Angle,0)
DisplaySprite3D(0,Angle*#RayonRoue*#pi/ 180,#RayonRoue)


Stop3D()

DisplayTransparentSprite(1,0,0)

FlipBuffers ()

 
ForEver
Sympa, ta petite anim! :D

API Nouilleur!

Publié : lun. 02/janv./2006 12:52
par Huitbit
Super, c'est exactement l'effet que je voulais!!

Bon , ben j'y retourne alors, j'ai plein choses a rajouter!


Merci filperj (cékoi cet animal, ça se mange????)
A+

Publié : lun. 02/janv./2006 12:57
par Dorian
arf j'ai voulu voir ce que sa donne mais les source s'execute jusqu'à Start3D() et il me mais invalid memory ou un truc du style :(

What's wrong???

Publié : lun. 02/janv./2006 13:07
par Huitbit
Dorian>C'est bizarre!
Le programme est le plus autonome possible (pas de chargement de sprite, etc..)

J'ai fait copier/coller avec la soluce de filperj, ça fonctionne nickel!!!

(Et en plus j'ai tout compris ses explications!!!)

Publié : lun. 02/janv./2006 13:22
par Dorian
Je sais que c'est bizarre. J'ai essayer un exemple fourni dans pb et sa marche nikel puis dès que j'ai légerement modifié le code plus rien :?

Publié : lun. 02/janv./2006 13:28
par comtois
ça fonctionne nickel chez moi , avec la version 3.94.

à tout hasard regarde tes drivers.
J'avais des soucis avec une commande 3D , et j'ai longtemps mis ça sur le compte d'un bug de Purebasic car tout le reste fonctionnait, et en fait , c'était juste mes drivers qui n'étaient pas à jour , j"étais pourtant persuadé que j'avais les derniers :oops:

Publié : lun. 02/janv./2006 13:56
par Dorian
Moi sa bug aussi avec la 2D

Oups!

Publié : lun. 02/janv./2006 14:57
par Huitbit
Au début j'ai travaillé avec une roue de 32 pixels, alors j'ai laissé traîner une petite coquille!

calcul de la distance (corrigé):

Code : Tout sélectionner

;***********infos provisoires sur le mouvement******************* 
Locate(0,0) 
DrawText("Distance=" + StrF(Angle*#RayonRoue*#pi/ 180)) 
Locate(0,30) 
DrawText("Tour(s)=" + StrF(Angle/360)) 
;*********************************************************** 
Désolé

PROBLEME : l'exe fonctionne, idem avec JapBE et pas sur PB?

Publié : jeu. 05/janv./2006 3:50
par Huitbit
J'ai amélioré le programme sur la cycloïde
Maintenant on regarde un roulement avec ou sans glissement!

nouvelles variables:
trace
glisse
pause

4 buttongadgets

Je n'ai pa su mettre les buttonsgadget (ils restaient inactifs)
sur l'écran alors ils sont sur la fenêtre!

Voilà le code:


Code : Tout sélectionner

;*****************variables utilisées********************

#RayonRoue=64
#LargeurEcran=1024
#HauteurEcran=4*#RayonRoue
#pi=3.1415927

Angle.f=-32
PositionXvalve.f=0
PositionYvalve.f=0
PositionXaxe.f=0
PositionYaxe.f=0
trace=0
glisse.f=1
Pause=0
;*****************initialisation**************************
InitKeyboard()
InitSprite()
InitSprite3D()
;*****************écrans*********************************
OpenWindow(1,1,1,#LargeurEcran,#HauteurEcran+20,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"La cycloïde"); on ouvre une fenêtre
OpenWindowedScreen(WindowID(1),0,0,#LargeurEcran,#HauteurEcran,0,1,1); on met un écran dedans

;**************dessin de la roue**********************
CreateSprite(0,128,128,#PB_Sprite_Texture);
StartDrawing(SpriteOutput(0))
Circle(64,64,64,RGB(77, 125, 139));pneu(extérieur
Circle(64,64,48,RGB(0,0,0));pneu(intérieur)
LineXY( 32,32,96,96,RGB(193, 49, 54));
LineXY(32,96,96,32,RGB(193, 49, 54));
Box(104,60,8,8,RGB(249, 235, 6));valve
Box(60,60,8,8,RGB(248, 43, 7));axe
StopDrawing()

CreateSprite3D(0,0)
;**********************sprite calque pour afficher les trajectoires***
CreateSprite(1,#LargeurEcran,#HauteurEcran)
;**********************sprite calqueblank pour effacer sprite calque***
CreateSprite(2,#LargeurEcran,#HauteurEcran)
;***************************gadgets********************
CreateGadgetList(WindowID(1))
ButtonGadget(1,0,256,90,20,"Tracer / Effacer" )
ButtonGadget(2,90,256,90,20,"Glissements",#PB_Button_Toggle    )
ButtonGadget(3,180,256,90,20,"Pause")
ButtonGadget(4,270,256,90,20,"Quitter")
Repeat ; boucle principale

   Repeat
    event = WindowEvent()

     Select event
      Case #PB_Event_CloseWindow
        End
      Case #PB_EventGadget
        Select EventGadgetID()
          Case 1 ; appui sur le bouton "Trace/effacer"
            trace=trace+1
            If trace>1
              trace=0
            EndIf
          Case 2; appui sur le bouton"glisse"
            glisse=glisse+1.5
            trace=0
            If glisse>3
              glisse=1
              
            EndIf
          Case 3; appui sur le bouton "pause"
            Pause=Pause+1
            If Pause>1
              Pause=0
              EndIf
          Case 4; appui sur le bouton "quitter"
            End
      EndSelect

    EndSelect

Until event = #Null


If Pause=0
  Angle=Angle+1
  If Angle*#RayonRoue*#pi/ 180>=#LargeurEcran-2
  Angle=-64
  EndIf
EndIf

ClearScreen(0,0,0)

StartDrawing(ScreenOutput())

Box(0,3*#RayonRoue,#LargeurEcran,#RayonRoue,RGB(166, 240, 89));  dessin du sol (gazon!)
;*************info  sur le mouvement*******************
Locate(0,0)
DrawText("Distance parcourue =" + StrF(Angle*#RayonRoue*#pi/ 180)+ " cm  | (rayon de la roue 64 cm)")

;******************************************************************

StopDrawing()


StartDrawing(SpriteOutput(1))

;**********************position de la valve************************
PositionXvalve=#RayonRoue*Angle*#pi/180+48*Cos(glisse*Angle*#pi/180)+64
PositionYvalve=48*Sin(glisse*Angle*#pi/180)+128
;**********************position de l'axe***************************
PositionXaxe=#RayonRoue+Angle*#RayonRoue*#pi/ 180
PositionYaxe=2*#RayonRoue
;******************************************************************

If PositionXvalve>=0 And PositionXvalve<#LargeurEcran-1 And PositionYvalve>=0 And PositionYvalve<#HauteurEcran-1 And PositionXaxe< #LargeurEcran-1 And PositionYaxe>=0
   Plot(PositionXvalve,PositionYvalve,RGB(243, 234, 71))
   Plot(PositionXaxe,PositionYaxe,RGB(65, 237, 190))
Else 
  trace=0
EndIf

;******************************************************************

StopDrawing()

;******************affichage de la roue****************************
Start3D()

RotateSprite3D(0,Angle*glisse,0)
DisplaySprite3D(0,Angle*#RayonRoue*#pi/ 180,#RayonRoue)


Stop3D()
If trace=1          
 DisplayTransparentSprite(1,0,0)
Else
  CopySprite(2,1) ; si trace est nul, on "écrase" les courbes avec le sprite vierge 
EndIf

 
FlipBuffers ()


ForEver


Avec PB, on m'indique un "plot outside area" à la ligne 112 (ligne relative à la position de l'axe de la roue) si je décide de tracer la courbe pendant le mouvement. Alors que juste au dessus je teste les valeurs de toutes les coordonnées!
Avec JapBe et l'exe, rien du tout!?!!

S.O.S!!!!! (Save Our Sources!!!)

Publié : jeu. 05/janv./2006 6:23
par cederavic
Je t'ai mis des commentaires ligne 102 et ligne 116 pour t'explique le probleme (enfin celui ligne 102 c'est juste une optimisation).
J'ai pas le temps de regarder le code entierement ce matin, je verrais ça de plus pret ce soir.

Code : Tout sélectionner

;*****************variables utilisées********************

#RayonRoue=64
#LargeurEcran=1024
#HauteurEcran=4*#RayonRoue
#Pi=3.1415927

Angle.f=-32
PositionXvalve.f=0
PositionYvalve.f=0
PositionXaxe.f=0
PositionYaxe.f=0
trace=0
glisse.f=1
Pause=0
;*****************initialisation**************************
InitKeyboard()
InitSprite()
InitSprite3D()
;*****************écrans*********************************
OpenWindow(1,1,1,#LargeurEcran,#HauteurEcran+20,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"La cycloïde"); on ouvre une fenêtre
OpenWindowedScreen(WindowID(1),0,0,#LargeurEcran,#HauteurEcran,0,1,1); on met un écran dedans

;**************dessin de la roue**********************
CreateSprite(0,128,128,#PB_Sprite_Texture);
StartDrawing(SpriteOutput(0))
Circle(64,64,64,RGB(77, 125, 139));pneu(extérieur
Circle(64,64,48,RGB(0,0,0));pneu(intérieur)
LineXY( 32,32,96,96,RGB(193, 49, 54));
LineXY(32,96,96,32,RGB(193, 49, 54));
Box(104,60,8,8,RGB(249, 235, 6));valve
Box(60,60,8,8,RGB(248, 43, 7));axe
StopDrawing()

CreateSprite3D(0,0)
;**********************sprite calque pour afficher les trajectoires***
CreateSprite(1,#LargeurEcran,#HauteurEcran)
;**********************sprite calqueblank pour effacer sprite calque***
CreateSprite(2,#LargeurEcran,#HauteurEcran)
;***************************gadgets********************
CreateGadgetList(WindowID(1))
ButtonGadget(1,0,256,90,20,"Tracer / Effacer" )
ButtonGadget(2,90,256,90,20,"Glissements",#PB_Button_Toggle    )
ButtonGadget(3,180,256,90,20,"Pause")
ButtonGadget(4,270,256,90,20,"Quitter")
Repeat ; boucle principale

   Repeat
    event = WindowEvent()

     Select event
      Case #PB_Event_CloseWindow
        End
      Case #PB_EventGadget
        Select EventGadgetID()
          Case 1 ; appui sur le bouton "Trace/effacer"
            trace=trace+1
            If trace>1
              trace=0
            EndIf
          Case 2; appui sur le bouton"glisse"
            glisse=glisse+1.5
            trace=0
            If glisse>3
              glisse=1
             
            EndIf
          Case 3; appui sur le bouton "pause"
            Pause=Pause+1
            If Pause>1
              Pause=0
              EndIf
          Case 4; appui sur le bouton "quitter"
            End
      EndSelect

    EndSelect

Until event = #Null


If Pause=0
  Angle=Angle+1
  If Angle*#RayonRoue*#Pi/ 180>=#LargeurEcran-2
  Angle=-64
  EndIf
EndIf

ClearScreen(0,0,0)

StartDrawing(ScreenOutput())

Box(0,3*#RayonRoue,#LargeurEcran,#RayonRoue,RGB(166, 240, 89));  dessin du sol (gazon!)
;*************info  sur le mouvement*******************
Locate(0,0)
DrawText("Distance parcourue =" + StrF(Angle*#RayonRoue*#Pi/ 180)+ " cm  | (rayon de la roue 64 cm)")

;******************************************************************

StopDrawing()

;***
; On dessine seulement si on en a besoin
;***
If trace = 1
  StartDrawing(SpriteOutput(1))
  
  ;**********************position de la valve************************
  PositionXvalve=#RayonRoue*Angle*#Pi/180+48*Cos(glisse*Angle*#Pi/180)+64
  PositionYvalve=48*Sin(glisse*Angle*#Pi/180)+128
  ;**********************position de l'axe***************************
  PositionXaxe=#RayonRoue+Angle*#RayonRoue*#Pi/ 180
  PositionYaxe=2*#RayonRoue
  ;******************************************************************
  
  ;***
  ; Il faut bien verifier les 2 coordonnées séparement sinon comme ça l'affiche de l'un peut continuer si l'autre est
  ; en dehors de l'ecran
  ;***
  
  If PositionXvalve>=0 And PositionXvalve<#LargeurEcran-1 And PositionYvalve>=0 And PositionYvalve<#HauteurEcran-1 
    Plot(PositionXvalve,PositionYvalve,RGB(243, 234, 71))
  EndIf
  If PositionXaxe >= 0 And PositionYaxe >=0 And PositionXaxe < #LargeurEcran-1 And PositionYaxe < #HauteurEcran-1 
    Plot(PositionXaxe,PositionYaxe,RGB(65, 237, 190))
  EndIf
  
  ;******************************************************************
  
  StopDrawing()
EndIf

;******************affichage de la roue****************************
Start3D()

RotateSprite3D(0,Angle*glisse,0)
DisplaySprite3D(0,Angle*#RayonRoue*#Pi/ 180,#RayonRoue)


Stop3D()
If trace=1         
 DisplayTransparentSprite(1,0,0)
Else
  CopySprite(2,1) ; si trace est nul, on "écrase" les courbes avec le sprite vierge
EndIf

 
FlipBuffers ()


ForEver

Publié : jeu. 05/janv./2006 13:10
par Backup
Bravo les Gars ! :D

ça rend bien votre truc , je trouve ça baleze en plus :D

Publié : jeu. 05/janv./2006 16:04
par Huitbit
Merci,
L'union fait la FORCE!(comme dirait Obiwan Machinchose)

Publié : jeu. 05/janv./2006 18:48
par Gillou
Super, ça rappelle des souvenir #fou (avec ça tes profs vont être super content et en plus un peu de pub gratuite pour pure c'est sympa, la communauté va s'agrandir :D

@Dorian

J'ai le même problème, remplace initsprite3D() par (c'est juste pour voir si tu as la même erreur)


If InitSprite3D () = 0
MessageRequester ( "Error" , "Direct3D system can't be initialized correctly" , 0)
End
EndIf