Rosace3D

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Rosace3D

Message par comtois »

Voila c'est le dernier code que je place ici au nom de François Weil , maintenant qu'il a réussi à s'inscrire sur le forum , j'espère que l'on en verra d'autres :)
Fweil a écrit :Voici une proposition de mise à jour pour le code du programme Rosace3D de Cederavic. J'ai un peu commenté en français, mais pfff

Ce prog est déjà un peu relevé. Il contient une procédure assez intéressante pour construire des objets sprites. Il y a une partie qui vole un peu haut pour créer des panneaux de texte texturé avec passage de pointeur de structure en argument.

Sinon, par rapport à la version de Cederavic, c'est moins perfectionné pour le traitement des priorités des sprites par rapport à la coordonnée 3D. J'ai retiré la fonction de tri de la liste indexée, mais le calcul du fading suffit à rendre un très bon effet avant / arrière plan des sprites.

Par le fait, le programme tourne beaucoup mieux, l'affichage reste fluide avec un refresh de 40fps pour 200 balles affichées sur ma machine (1,2GHz).

J'ai également placé la strcture de code permettant de choisir un mode plein écran ou un mode fenêtré, et la version fenêtrée est de très bonne qualité en affichage.
Super encore un code à étudier :)

Code : Tout sélectionner

#BubbleMax = 200 ; En adaptant cette valeur on peut diminuer ou augmenter le nombre de balles traitées. Les valeurs au-delà de 200 ralentissent quand même le raffraichissement 
#Window_Main = 0 ; Si on choisi de démarrer en mode fenêtré, on utilisera cette constante pour ouvrir la fenêtre principale 
#NSprites = 30 ; Ici on défini le nombre de sprites différents qui vont être créés. Une valeur de 10 ou 20 est déjà correcte. 
#FullScreen = #FALSE ; Si la constante est vraie on ouvre en mode plein écran, sinon on ouvre en mode fenêtré. 
#Pointer1 = #NSprites + 1 ; On donne trois constantes pour gérer le pointeur en mode écran 
#Pointer2 = #NSprites + 2 ; Le pointeur 1 est une croix blanche, le pointeur 2, une croix rouge et le pointeur 3 un texte spécial 
#Pointer3 = #NSprites + 3 ; 
#SplashPanel = #NSprites + 4 ; Mon truc à moi 
#BackgroundColor = #Black ; Et une couleur de fond d'écran pour les sprites objets (CreateSpriteObject) 

Structure BubbleStruct 
  x.l 
  y.l 
  z.l 
  ax.l 
  ay.l 
  img.l 
  sx.b 
  sy.b 
EndStructure 

NewList Bubble.BubbleStruct() 

Structure TEXTPANEL 
  FontName.s 
  FontSize.l 
  Text.s 
  TextColor.l 
EndStructure 

SplashPanel.TEXTPANEL 

Procedure CreateSpriteObject(SpriteNumber.l, Width.l, Height.l, ObjectName.s, Param1.l, Param2.l) 
  ; 
  ; CreateSpriteObject allows to create parameterized sprites 
  ; 
  If CreateSprite(SpriteNumber, Width, Height, #PB_Sprite_Texture) 
      StartDrawing(SpriteOutput(SpriteNumber)) 
        Select ObjectName 
          Case "Cross" ; Un pointeur en forme de croix utlisant deux LineXY de la couleur Color1 dans une boite de fond Color2. la couleur Color2 doit en principe être transparente. 
            DrawingMode(0) 
            Box(0, 0, Width, Height, Param2) 
            LineXY(0, Height / 2, Width, Height / 2, Param1) 
            LineXY(Width / 2, 0, Width / 2, Height, Param1) 
          Case "Arrow" ; Un pointeur en forme de flêche de la couleur Color1 dans une boite de fond Color2. la couleur Color2 doit en principe être transparente. 
            DrawingMode(0) 
            Box(0, 0, Width, Height, Param2) 
            LineXY(0, 0, 4, 13, Param1) 
            LineXY(4, 13, 5, 8, Param1) 
            LineXY(5, 8, 29, 32, Param1) 
            LineXY(29, 32, 32, 29, Param1) 
            LineXY(32, 29, 9, 6, Param1) 
            LineXY(9, 6, 13, 5, Param1) 
            LineXY(13, 5, 0, 0, Param1) 
            FillArea(2, 2, Param1, Param1) 
          Case "TextPanel" ; Attention là, je suis en cours de mise au point donc ce n'est pas forcément très exhaustif 
            *TextPanel.TEXTPANEL = Param1 
            DrawingFont(LoadFont(0, *TextPanel\FontName, *TextPanel\FontSize, #PB_Font_HighQuality)) 
            DrawingMode(0) 
            For x = 0 To Width 
              Fading.f = x / Width - 0.5 : If Fading < 0 : Fading = 0 : EndIf : If Fading > 0.5 : Fading * 2 : EndIf 
              LineXY(x, 0, 0, x, RGB(Red(Param2) * Fading, Green(Param2) * Fading, Blue(Param2) * Fading)) 
              LineXY(Width - x, Height, Width, Width - x, RGB(Red(Param2) * Fading, Green(Param2) * Fading, Blue(Param2) * Fading)) 
            Next 
            DrawingMode(1) 
            If FindString(*TextPanel\Text, " ", 1) 
                FieldNumber = 1 
                While StringField(*TextPanel\Text, FieldNumber, " ") <> "" 
                  FieldNumber + 1 
                Wend 
                FieldNumber - 1 
                For h = 1 To FieldNumber 
                  For i = 1 To 4 
                    Locate((Width - TextLength(StringField(*TextPanel\Text, h, " "))) / 2 + i, (Height + 3 * (h - 1) * *TextPanel\FontSize) / 2 - i) 
                    FrontColor(Red(*TextPanel\TextColor) >> (4 - i), Green(*TextPanel\TextColor) >> (4 - i), Blue(*TextPanel\TextColor) >> (4 - i)) 
;                    FrontColor(64 * i - 1, 64 * i - 1, 50 * i - 1) 
                    DrawText(StringField(*TextPanel\Text, h, " ")) 
                  Next 
                Next 
              Else 
                For i = 1 To 4 
                  Locate((Width - TextLength(*TextPanel\Text)) / 2 + i, Height / 2 - i) 
                  FrontColor(64 * i - 1, 64 * i - 1, 50 * i - 1) 
                  DrawText(*TextPanel\Text) 
                Next 
            EndIf 
          Default ; Par défaut un objet 'non connu' est créé avec un caractère '?' 
            DrawingMode(0) 
            Box(0, 0, Width, Height, Param1) 
            DrawingMode(1) 
            Box(0, 0, Width, Height, Param2) 
            DrawingMode(1) 
            Label.s = "?" 
            DrawingFont(LoadFont(0, "Verdana", 12, #PB_Font_Bold | #PB_Font_HighQuality)) 
            Locate((Width - TextLength(Label)) / 2, (Height - 3 * FontSize / 2) / 2) 
            FrontColor(Red(255), Green(0), Blue(0)) 
            DrawText(Label) 
        EndSelect 
      StopDrawing() 
  EndIf 
EndProcedure 

  If InitSprite() And InitSprite3D() And InitKeyboard() And InitMouse() 
  
      If #FullScreen ; Initialisation de l'écran en mode plein écran, utilisant les dimensions trouvées dans l'API 
          WindowXSize = GetSystemMetrics_(#SM_CXSCREEN) 
          WindowYSize = GetSystemMetrics_(#SM_CYSCREEN) 
          ScreenXSize = WindowXSize 
          ScreenYSize = WindowYSize 
          OpenScreen(WindowXSize, WindowYSize, 32, "Rosace3D") 
          Initialized = #TRUE 
        Else ; Initialisation en mode fenêtré avec une zone écran de la même taille que la fenêtre principale 
          WindowXSize = 480 
          WindowYSize = 360 
          ScreenXSize = WindowXSize 
          ScreenYSize = WindowYSize 
          If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, #PB_Window_Borderless | #PB_Window_ScreenCentered, "Rosace3D") 
              AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape) 
              If OpenWindowedScreen(WindowID(), 0, 0, ScreenXSize, ScreenYSize, #TRUE, 0, 0) 
                  Initialized = #TRUE 
              EndIf 
          EndIf 
      EndIf 
      If Initialized 
          Sprite3DQuality(1) 
          CX = 3 * ScreenXSize / 7 ; Ajustement pour centrer les balles lors de l'affichage 
          CY = ScreenYSize / 2 
          CXZ = (1 + #FullScreen ) * ScreenXSize / 3 ; et coefficients zx et zy pour le calcul du rendu 3D 
          CYZ = (1 + #FullScreen ) * ScreenYSize / 3 
          s.l = 1 ; Les deux variables s et s2 sont des variables de polarité pour faire varier les variables s et s2 dans la plage définie de 5 à 35 
          s2.l = 1 ; Lorsque j et j2 atteignent une extrémité de la plage, s et s2 changent de polarité. 
          sk.l = 1 ; sk est le coefficient de polarité d'enveloppe générale de l'objet. 
          j.f = 0.0 ; En initialisant ces deux variables avec des valeurs au delà de la plage de variation traitée plus bas, on a un effet de désordre initial 
          j2.f = 50.0 ; Ces valeurs sont ensuite ressérées dans la plage de 5 à 35 
          k.l = 0 ; k est le coefficient d'enveloppe générale de l'objet. A 0, l'objet est un point mathématique, plus k est grand plus lo'bjet est 'zoomé'. 
          AngleX.f 
          AngleY.f 
          SpriteLightX.f = 0.5 ; Ces deux coefficients sont créés pour donner un effet de lumière sur les balles qui sont créées ci-dessous. Il est amusant de les faire varier 
          SpriteLightY.f = 0.5 ; en notant que les valeurs au-delà de -1.0 - +1.0 donnent une déformation des balles. 
          For t = 1 To #NSprites ; Cette boucle permet de créer les balles utilisées comme sprites 
            CreateSprite(t, 32, 32, #PB_Sprite_Texture) ; Chaque balle est définie avec une couleur générée aléatoirement (enfin pas tout à fait complètement aléatoire !) 
            StartDrawing(SpriteOutput(t)) 
              ColorMask.l = Random(7) + 1 ; En fait la couleur, ici est une fonction aléatoire des primitives RGB 
              Red = 32 * Random(4) * ((ColorMask & 4) >> 2) ; ColorMask correspond à une teinte fondamentale R, G, B, RG, RB, GB, RGB 
              Green = 32 * Random(4) * ((ColorMask & 2) >> 1) 
              Blue = 32 * Random(4) * ((ColorMask & 1)) 
              SpriteCX.f = 16.0 ; On dessine une succession de cercles de plus en plus lumineux en décalant éventuellement les cercles en direction de la source lumineuse 
              SpriteCY.f = 16.0 ; définie par SpriteLghtX et SpriteLightY 
              SpriteRadius = 10 
              Circle(SpriteCX, SpriteCY, SpriteRadius, RGB(0, 0, 0)) 
              For SpriteRadius = 9 To 2 Step - 1 
                Circle(SpriteCX, SpriteCY, SpriteRadius, RGB(Red, Green, Blue)) ; La couleur utilisée est une fonctionn croissante où chaque fondamentale est augmentée vers 
                SpriteCX + SpriteLightX ;  la valeur 255 pour les cercles finaux les plus petits. Cela donne automatiquement une 'bille avec reflet !' 
                SpriteCY + SpriteLightY 
                Red + 16 : If Red > 255 : Red = 255 : EndIf 
                Green + 32 : If Green > 255 : Green = 255 : EndIf 
                Blue + 32 : If Blue > 255 : Blue = 255 : EndIf 
              Next 
            StopDrawing() 
            CreateSprite3D(t, t) ; Et on créé le sprite3D correspondant 
          Next 
          PointerXSize = 8 ; On va créer deux sprites pour l'affichage d'un pointeur en mode écran 
          PointerYSize = 8 
          CreateSpriteObject(#Pointer1, PointerXSize, PointerYSize, "Cross", $FFFFFF, #BackgroundColor) ; Un pointeur en forme de croix blanche 
          CreateSpriteObject(#Pointer2, PointerXSize, PointerYSize, "Cross", $8080FF, #BackgroundColor) ; Un pointeur en forme de croix rouge 
          SplashPanel\FontName = "Verdana" 
          SplashPanel\FontSize = 8 * (#FullScreen + 1) 
          SPlashPanel\Text = "Visit www.francoisweil.com" 
          SPlashPanel\TextColor = $C0FFFF 
          CreateSpriteObject(#Pointer3, 256, 256, "TextPanel", @SplashPanel, $FF0000) ; Un pointeur en forme de panneau de texte 
          SplashPanel\FontName = "Verdana" 
          SplashPanel\FontSize = 8 * (#FullScreen + 1) 
          SPlashPanel\Text = "Designed by fweil" 
          SPlashPanel\TextColor = $C0FFFF 
          CreateSpriteObject(#SplashPanel, 128 * (#FullScreen + 1), 128 * (#FullScreen + 1), "TextPanel", @SplashPanel, $FFFFFF) ; Un panneau contenant un texte 
          CreateSprite3D(#SplashPanel, #SplashPanel) 
          SplashPanelXSize = 0 
          SplashPanelYSize = Random(256) 
          sSplashPanelX = 1 
          sSplashPanelY = 1 
          For t = 0 To #BubbleMax 
            AddElement(Bubble()) 
            Bubble()\x = (Sin(t / 20) + Cos(t / 50)) * 100 + ScreenXSize / 10 + Random(ScreenXSize - 16) 
            Bubble()\y = (Cos(t / 20) + Sin(t / 50)) * 100 + ScreenYSize / 10 + Random(ScreenYSize - 16) 
            Bubble()\z = Sin(t / 10) * 32 
            Bubble()\img = Random(#NSprites - 1) + 1 
            ResetList(Bubble()) 
          Next 
          Start3D() 
          Repeat 
            If #FullScreen = #FALSE 
                Select WindowEvent() 
                  Case #PB_Event_CloseWindow 
                    Quit = #TRUE 
                  Case #PB_Event_Menu 
                    Select EventMenuID() 
                      Case #PB_Shortcut_Escape 
                        Quit = #TRUE 
                    EndSelect 
                EndSelect 
            EndIf 
            ExamineKeyboard() 
            If KeyboardPushed(#PB_Key_Escape) : Quit = #TRUE : EndIf 
            If KeyboardPushed(#PB_Key_Left) : AngleX - 0.00025 : EndIf 
            If KeyboardPushed(#PB_Key_Right) : AngleX + 0.00025 : EndIf 
            If KeyboardPushed(#PB_Key_F1) : Delay(50) : HelpFlag = 1 - HelpFlag : EndIf 
            FlipBuffers() 
            ClearScreen(0, 0, 0) 
            AngleX + 0.01 ; L'effet d'angle s'applique à la rotation virtuelle de l'objet complet 
            AngleY + 0.01 
            ResetList(Bubble()) 
            For t = 0 To #BubbleMax 
              NextElement(Bubble()) 
              *h = Bubble() 
              j + s * 0.00025 
              j2 + s2 * 0.00025 
              If j <= 5 : s = 1 : EndIf 
              If j => 35 : s = -1 : EndIf 
              If j2 <= 5 : s2 = 1 : EndIf 
              If j2 => 35 : s2 = -1 : EndIf 
              Bubble()\x = (Sin(t / j) + Cos(t / j2 * 2 + (j2 / 2))) * k 
              Bubble()\y = (Cos(t / j) + Sin(t / j2 * 2 + (j2 / 2))) * k 
              Alpha = Sin(t / j / 2) * 32 
              Bubble()\ax = CX + CXZ * Bubble()\x / (ScreenXSize + Alpha) 
              Bubble()\ay = CY + CYZ * Bubble()\y / (ScreenYSize + Alpha) 
              If Alpha < 40 : Alpha = 128 - 3 * Alpha : Else : Alpha = 128 - Alpha / 3 : EndIf 
              If Alpha > 255 : Alpha = 255 : ElseIf Alpha < 0 : Alpha = 0 : EndIf 
              ZoomSprite3D(Bubble()\img, 32, 32) 
              DisplaySprite3D(Bubble()\img, Bubble()\ax, Bubble()\ay, Alpha) 
            Next 
            Refresh + 1 
            If HelpFlag 
                StartDrawing(ScreenOutput()) 
                  DrawingMode(1) 
                  For i = 1 To 4 
                    Locate(10 + i, 10 - i) 
                    FrontColor(64 * i - 1, 64 * i - 1, 50 * i - 1) 
                    DrawText("Refresh rate : " + Str(RefreshRate)) 
                  Next 
                StopDrawing() 
            EndIf 
            If StartCounter < 1000 
                StartDrawing(ScreenOutput()) 
                  DrawingMode(1) 
                  If StartCounter < 500 
                      ThisColor = 255 * StartCounter / 500 
                      FrontColor(ThisColor, ThisColor, ThisColor) 
                      Text.s = "Use left / right mouse buttons to change parameters - Escape to exit" 
                      Locate((ScreenXSize - TextLength(Text)) / 2, ScreenYSize - 20) 
                      DrawText(Text) 
                    Else 
                      ThisColor = 255 * (1000 - StartCounter) / 500 
                      FrontColor(ThisColor, ThisColor, ThisColor) 
                      Text.s = "Use left / right mouse buttons to change parameters - Escape to exit" 
                      Locate((ScreenXSize - TextLength(Text)) / 2, ScreenYSize - 20) 
                      DrawText(Text) 
                  EndIf 
                StopDrawing() 
            EndIf 
            ExamineMouse() 
            If MouseButton(1) 
                j = Random(100) - 50 
                j2 = Random(100) - 50 
            EndIf 
            If MouseButton(2) And k > 0 
                k = -k 
            EndIf 
            If ElapsedMilliseconds() - tz => 1000 
                tz = ElapsedMilliseconds() 
                RefreshRate = Refresh 
                Refresh = 0 
            EndIf 
            StartCounter + 1 
            MouseX = MouseX() 
            MouseY = MouseY() 
            If MouseX > ScreenXSize / 4 And MouseX < 3 * ScreenXSize / 4 And MouseY > ScreenYSize / 4 And MouseY < 3 * ScreenYSize / 4 
                DisplayTransparentSprite(#Pointer2, MouseX() - PointerXSize / 2, MouseY() - PointerYSize / 2) 
              ElseIf MouseY > ScreenYSize - 120 
                DisplayTransparentSprite(#Pointer3, MouseX() - 256 / 2, MouseY() - 256 / 2) 
              Else 
                DisplayTransparentSprite(#Pointer1, MouseX() - PointerXSize / 2, MouseY() - PointerYSize / 2) 
            EndIf 
            k + sk 
            If k <= 50 : sk = 1 : EndIf 
            If k => 250 : sk = -1 : EndIf 
            If StartCounter < 1200 
                If StartCounter < 950 
                    ThisFading = 255 
                  Else 
                    ThisFading = 1200 - StartCounter 
                EndIf 
                SplashPanelXSize + sSplashPanelX 
                SplashPanelYSize + sSplashPanelY 
                If SplashPanelXSize <= -128 : sSplashPanelX = 1 : EndIf 
                If SplashPanelXSize > 128 : sSplashPanelX = -1 : EndIf 
                If SplashPanelYSize <= -128 : sSplashPanelY = 1 : EndIf 
                If SplashPanelYSize > 128 : sSplashPanelY = -1 : EndIf 
                ZoomSprite3D(#SplashPanel, SplashPanelXSize, SplashPanelYSize) 
                RotateSprite3D(#SplashPanel, SplashPanelAngle, 0) 
                DisplaySprite3D(#SplashPanel, ScreenXSize - 100, ScreenYSize - 100, ThisFading) 
                SplashPanelAngle + 1 
            EndIf 
          Until Quit 
          Stop3D() 
          If #FullScreen 
              CloseScreen() 
            Else 
              CloseWindow(#Window_Main) 
          EndIf 
      EndIf 
  EndIf 
  TerminateProcess_(GetCurrentProcess_(), 0) 
End 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

c'est extra, faudrait en faire un écran de veille :D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

J'ai trouvé ca bô mais du coup ma sourie ne peut plus franchir les limites qu'avaient la fenetre de la rosace. Ce qui limite pluto ses déplacements... Enfin heureusement que je sais me servir un minimum d'un clavier...

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

sur Xp pro j'ai pas le probleme decrit par DRI ! :)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

exelent! :D
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Mise à jour de Rosace3D

Message par fweil »

Lisez les commentaires en haut du prog :

Maintenant la gestion de la souris est encore plus phénoménale ...

Code : Tout sélectionner

;
; 3D rose
;
; FWeil 20050515
;
; 20050519
;
; - ajout d'un type d'objet sprite Lettre
; - ajout d'un échappement pour libérer la souris lorsque l'utilisateur essaye de sortir de la fenêtre (par le coin haut gauche) et récupération de la souris lorsque le pointeur revient sur la fenêtre
; - ajout d'un sprite "X" en haut à gauche pour cliquer dessus et fermer la fenêtre.
; - modifications et améliorations pour la bonne lecture du code
; - modifications de la gestion des boutons gauche / droit de la souris pour interagir sur l'objet central seulement lorsque le curseur est la croix rouge.
; - Augmentationde la valeur constante #BubbleMax car les performances ont l'air suffisantes
; - Ajout d'un lien publicitaire 'clin d'oeil' (lorsque l'utilisateur sort de la fenêtre)
;
#BubbleMax = 400
#Window_Main = 0
#FullScreen = #FALSE
Enumeration #BubbleMax + 1
  #Pointer1
  #Pointer2
  #Pointer3
  #Pointer4
  #SplashPanel
  #Advertising
EndEnumeration
#BackgroundColor = #Black

Structure TEXTPANEL
  FontName.s
  FontSize.l
  Text.s
  TextColor.l
EndStructure

Structure LetterSprite
  ForegroundColor.l
  BackgroundColor.l
  Text.s
  FontName.s
  FontSize.l
  FontAttributes.l
EndStructure

Procedure CreateSpriteObject(SpriteNumber.l, Width.l, Height.l, ObjectName.s, Param1.l, Param2.l)
  ;
  ; CreateSpriteObject allows to create parameterized sprites
  ;
  If CreateSprite(SpriteNumber, Width, Height, #PB_Sprite_Texture)
      StartDrawing(SpriteOutput(SpriteNumber))
        Select ObjectName
          Case "Cross"
            DrawingMode(0)
            Box(0, 0, Width, Height, Param2)
            LineXY(0, Height / 2, Width, Height / 2, Param1)
            LineXY(Width / 2, 0, Width / 2, Height, Param1)
          Case "Arrow"
            DrawingMode(0)
            Box(0, 0, Width, Height, Param2)
            LineXY(0, 0, 4, 13, Param1)
            LineXY(4, 13, 5, 8, Param1)
            LineXY(5, 8, 29, 32, Param1)
            LineXY(29, 32, 32, 29, Param1)
            LineXY(32, 29, 9, 6, Param1)
            LineXY(9, 6, 13, 5, Param1)
            LineXY(13, 5, 0, 0, Param1)
            FillArea(2, 2, Param1, Param1)
          Case "Letter"
            *SpriteLetter.LetterSprite = Param1
            DrawingMode(0)
            Box(0, 0, Width, Height, *SpriteLetter\BackgroundColor)
            DrawingFont(LoadFont(23, *SpriteLetter\FontName, *SpriteLetter\FontSize, *SpriteLetter\FontAttributes))
            DrawingMode(1)
            Locate((Width - TextLength(*SpriteLetter\Text)) / 2, (Width - TextLength(*SpriteLetter\Text)) / 2)
            FrontColor(Red(*SpriteLetter\ForegroundColor), Green(*SpriteLetter\ForegroundColor), Blue(*SpriteLetter\ForegroundColor))
            DrawText(*SpriteLetter\Text)
          Case "TextPanel"
            *TextPanel.TEXTPANEL = Param1
            DrawingFont(LoadFont(0, *TextPanel\FontName, *TextPanel\FontSize, #PB_Font_HighQuality))
            DrawingMode(0)
            For x = 0 To Width
              Fading.f = x / Width - 0.5
              If Fading < 0
                  Fading = 0
              EndIf
              If Fading > 0.5
                  Fading * 2
              EndIf
              LineXY(x, 0, 0, x, RGB(Red(Param2) * Fading, Green(Param2) * Fading, Blue(Param2) * Fading))
              LineXY(Width - x, Height, Width, Width - x, RGB(Red(Param2) * Fading, Green(Param2) * Fading, Blue(Param2) * Fading))
            Next
            DrawingMode(1)
            If FindString(*TextPanel\Text, " ", 1)
                FieldNumber = 1
                While StringField(*TextPanel\Text, FieldNumber, " ") <> ""
                  FieldNumber + 1
                Wend
                FieldNumber - 1
                For h = 1 To FieldNumber
                  For i = 1 To 4
                    Locate((Width - TextLength(StringField(*TextPanel\Text, h, " "))) / 2 + i, (Height + 3 * (h - 1) * *TextPanel\FontSize) / 2 - i)
                    FrontColor(Red(*TextPanel\TextColor) >> (4 - i), Green(*TextPanel\TextColor) >> (4 - i), Blue(*TextPanel\TextColor) >> (4 - i))
                    DrawText(StringField(*TextPanel\Text, h, " "))
                  Next
                Next
              Else
                For i = 1 To 4
                  Locate((Width - TextLength(*TextPanel\Text)) / 2 + i, Height / 2 - i)
                  FrontColor(64 * i - 1, 64 * i - 1, 50 * i - 1)
                  DrawText(*TextPanel\Text)
                Next
            EndIf
          Default
            DrawingMode(0)
            Box(0, 0, Width, Height, Param1)
            DrawingMode(1)
            Box(0, 0, Width, Height, Param2)
            DrawingMode(1)
            Label.s = "?"
            DrawingFont(LoadFont(0, "Verdana", 12, #PB_Font_Bold | #PB_Font_HighQuality))
            Locate((Width - TextLength(Label)) / 2, (Height - 3 * FontSize / 2) / 2)
            FrontColor(Red(255), Green(0), Blue(0))
            DrawText(Label)
        EndSelect
      StopDrawing()
  EndIf
EndProcedure

;
;
;
  If InitSprite() And InitSprite3D() And InitKeyboard() And InitMouse()
      If #FullScreen
          WindowXSize = GetSystemMetrics_(#SM_CXSCREEN)
          WindowYSize = GetSystemMetrics_(#SM_CYSCREEN)
          ScreenXSize = WindowXSize
          ScreenYSize = WindowYSize
          OpenScreen(WindowXSize, WindowYSize, 32, "Rosace3D")
          Initialized = #TRUE
        Else
          WindowXSize = 480
          WindowYSize = 360
          ScreenXSize = WindowXSize
          ScreenYSize = WindowYSize
          If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, #PB_Window_Borderless | #PB_Window_ScreenCentered, "Rosace3D")
              AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
              If OpenWindowedScreen(WindowID(), 0, 0, ScreenXSize, ScreenYSize, #TRUE, 0, 0)
                  Initialized = #TRUE
              EndIf
          EndIf
      EndIf
      If Initialized
          BackgroundImageID = CreateImage(0, ScreenXSize, ScreenYSize)
          StartDrawing(ImageOutput())
            For i = 0 To 31
              Box(i, i, ScreenXSize - 2 * i, ScreenYSize - 2 * i, RGB(0, 0, 255 - 8 * i))
            Next
            Box(32, 32, ScreenXSize - 64, ScreenYSize - 64, #Black)
          StopDrawing()
          Sprite3DQuality(1)
          CX = 3 * ScreenXSize / 7
          CY = ScreenYSize / 2
          CXZ = (1 + #FullScreen ) * ScreenXSize / 3
          CYZ = (1 + #FullScreen ) * ScreenYSize / 3
          s.l = 1
          s2.l = 1
          sk.l = 1
          j.f = 0.0
          j2.f = 50.0
          k.l = 0
          SpriteLightX.f = 0.5
          SpriteLightY.f = 0.5
          For t = 0 To #BubbleMax
            CreateSprite(t, 32, 32, #PB_Sprite_Texture)
            StartDrawing(SpriteOutput(t))
              ColorMask.l = Random(7) + 1
              Red = 32 * Random(4) * ((ColorMask & 4) >> 2)
              Green = 32 * Random(4) * ((ColorMask & 2) >> 1)
              Blue = 32 * Random(4) * ((ColorMask & 1))
              SpriteCX.f = 16.0
              SpriteCY.f = 16.0
              SpriteRadius = 10
              Circle(SpriteCX, SpriteCY, SpriteRadius, RGB(0, 0, 0))
              For SpriteRadius = 9 To 2 Step - 1
                Circle(SpriteCX, SpriteCY, SpriteRadius, RGB(Red, Green, Blue))
                SpriteCX + SpriteLightX
                SpriteCY + SpriteLightY
                Red + 16
                If Red > 255
                    Red = 255
                EndIf
                Green + 32
                If Green > 255
                    Green = 255
                EndIf
                Blue + 32
                If Blue > 255
                    Blue = 255
                EndIf
              Next
            StopDrawing()
            CreateSprite3D(t, t)
          Next
          PointerXSize = 8
          PointerYSize = 8
          CreateSpriteObject(#Pointer1, PointerXSize, PointerYSize, "Cross", #White, #BackgroundColor)
          CreateSpriteObject(#Pointer2, PointerXSize, PointerYSize, "Cross", $8080FF, #BackgroundColor)
          SplashPanel.TEXTPANEL
          SplashPanel\FontName = "Verdana"
          SplashPanel\FontSize = 8 * (#FullScreen + 1)
          SPlashPanel\Text = "Visit www.francoisweil.com or email fweil@internext.fr"
          SPlashPanel\TextColor = $C0FFFF
          CreateSpriteObject(#Pointer3, 256, 256, "TextPanel", @SplashPanel, #Blue)
          SplashPanel\FontName = "Verdana"
          SplashPanel\FontSize = 8 * (#FullScreen + 1)
          SPlashPanel\Text = "Designed by fweil"
          SPlashPanel\TextColor = $C0FFFF
          CreateSpriteObject(#SplashPanel, 128 * (#FullScreen + 1), 128 * (#FullScreen + 1), "TextPanel", @SplashPanel, #White)
          Sprite4.LetterSprite
          Sprite4\ForegroundColor = #Red
          Sprite4\BackgroundColor = #Blue
          Sprite4\Text = "X"
          Sprite4\FontName = "Verdana"
          Sprite4\FontSize = 12
          Sprite4\FontAttributes = #PB_Font_Bold | #PB_Font_HighQuality
          CreateSpriteObject(#Pointer4, 2 * PointerXSize, 2 * PointerYSize, "Letter", @Sprite4, 0)
          Sprite4\ForegroundColor = $4020B0
          Sprite4\BackgroundColor = $300000
          Sprite4\FontAttributes = #PB_Font_HighQuality
          Sprite4\FontSize = 16
          AdvertisingString.s = "PureBasic va vous asseoir!"
          lAdvertisingString.l = Len(AdvertisingString)
          For i = 1 To lAdvertisingString
            Sprite4\Text = Mid(AdvertisingString, i, 1)
            CreateSpriteObject(#Advertising + i, 2 * PointerXSize, 4 * PointerYSize, "Letter", @Sprite4, 0)
          Next
          CreateSprite3D(#SplashPanel, #SplashPanel)
          SplashPanelXSize = 0
          SplashPanelYSize = Random(256)
          sSplashPanelX = 1
          sSplashPanelY = 1
          Start3D()
          Repeat
            ExamineKeyboard()
            If KeyboardPushed(#PB_Key_Escape)
                Quit = #TRUE
            EndIf
            If KeyboardPushed(#PB_Key_F1)
                Delay(50)
                RefreshRateFlag = 1 - RefreshRateFlag
                Refresh = 0
            EndIf
            FlipBuffers()
            ClearScreen(0, 0, 0)
            If #FullScreen = #FALSE
                If WindowEvent() = #PB_Event_CloseWindow Or EventMenuID() = #PB_Shortcut_Escape
                    Quit = #TRUE
                EndIf
                StartDrawing(ScreenOutput())
                  DrawImage(BackgroundImageID, 0, 0)
                StopDrawing()
            EndIf
            For t = 0 To #BubbleMax
              j + s * 0.00025
              j2 + s2 * 0.00025
              If j <= 5
                  s = 1
              EndIf
              If j => 35
                  s = -1
              EndIf
              If j2 <= 5
                  s2 = 1
              EndIf
              If j2 => 35
                  s2 = -1
              EndIf
              Angle1.f = t / j / 2
              Alpha = Sin(Angle1) * 32
              If Alpha < 40
                  Alpha = 128 - 3 * Alpha
                Else
                  Alpha = 128 - Alpha / 3
              EndIf
              If Alpha > 255
                  Alpha = 255
                ElseIf Alpha < 0
                  Alpha = 0
              EndIf
              ZoomSprite3D(t, 32, 32)
              Angle1.f = 2 * Angle1
              Angle2.f = 2 * t / j2 + j2 / 2
              DisplaySprite3D(t, CX + CXZ * (Sin(Angle1) + Cos(Angle2)) * k / (ScreenXSize + Alpha), CY + CYZ * (Cos(Angle1) + Sin(Angle2)) * k / (ScreenYSize + Alpha), Alpha)
            Next
            If RefreshRateFlag
                Refresh + 1
                If ElapsedMilliseconds() - tz => 1000
                    tz = ElapsedMilliseconds()
                    RefreshRate = Refresh
                    Refresh = 0
                EndIf
                StartDrawing(ScreenOutput())
                  DrawingMode(1)
                  For i = 1 To 4
                    Locate(10 + i, 10 - i)
                    FrontColor(64 * i - 1, 64 * i - 1, 50 * i - 1)
                    DrawText("Refresh rate : " + Str(RefreshRate))
                  Next
                StopDrawing()
            EndIf
            If StartCounter < 1200
                StartCounter + 1
                If StartCounter < 950
                    ThisFading = 255
                  Else
                    ThisFading = 1200 - StartCounter
                EndIf
                SplashPanelXSize + sSplashPanelX
                SplashPanelYSize + sSplashPanelY
                If SplashPanelXSize <= -128
                    sSplashPanelX = 1
                EndIf
                If SplashPanelXSize > 128
                    sSplashPanelX = -1
                EndIf
                If SplashPanelYSize <= -128
                    sSplashPanelY = 1
                EndIf
                If SplashPanelYSize > 128
                    sSplashPanelY = -1
                EndIf
                ZoomSprite3D(#SplashPanel, SplashPanelXSize, SplashPanelYSize)
                RotateSprite3D(#SplashPanel, SplashPanelAngle, 0)
                DisplaySprite3D(#SplashPanel, ScreenXSize - 100, ScreenYSize - 100, ThisFading)
                SplashPanelAngle + 1
                If StartCounter < 1000
                    StartDrawing(ScreenOutput())
                      DrawingMode(1)
                      If StartCounter < 500
                          ThisColor = 255 * StartCounter / 500
                        Else
                          ThisColor = 255 * (1000 - StartCounter) / 500
                      EndIf
                      FrontColor(ThisColor, ThisColor, ThisColor)
                      Text.s = "Use left / right mouse buttons at screen center to change parameters"
                      Locate((ScreenXSize - TextLength(Text)) / 2, ScreenYSize - 40)
                      DrawText(Text)
                      Text.s = "Escape to exit - F1 to see frame refresh rate"
                      Locate((ScreenXSize - TextLength(Text)) / 2, ScreenYSize - 20)
                      DrawText(Text)
                    StopDrawing()
                EndIf
            EndIf
            If MouseReleased
                GetCursorPos_(@Point.POINT)
                If WindowFromPoint_(Point\x, Point\y) = WindowID()
                    ReleaseMouse(0)
                    MouseLocate(ScreenXSize / 2, ScreenYSize / 2)
                    MouseReleased = #FALSE
                    AdvertisingFlag = #FALSE
                EndIf
            EndIf
            ExamineMouse()
            If MouseButton(1)
                If CursorType = 2
                    j = Random(100) - 50
                    j2 = Random(100) - 50
                  ElseIf CursorType = 4
                    Quit = #TRUE
                EndIf
              ElseIf MouseButton(2) And k > 0 And CursorType = 2
                k = -k
              Else
                MouseX = MouseX()
                MouseY = MouseY()
                If MouseX > ScreenXSize / 4 And MouseX < 3 * ScreenXSize / 4 And MouseY > ScreenYSize / 4 And MouseY < 3 * ScreenYSize / 4
                    DisplayTransparentSprite(#Pointer2, MouseX() - PointerXSize / 2, MouseY() - PointerYSize / 2)
                    CursorType = 2
                  ElseIf MouseX > ScreenXSize - 40 And MouseY < 30
                    DisplayTransparentSprite(#Pointer4, MouseX() - PointerXSize / 2, MouseY() - PointerYSize / 2)
                    MouseLocate(ScreenXSize - 2 * PointerXSize, PointerYSize)
                    CursorType = 4
                  ElseIf MouseY > 3 * ScreenYSize / 4
                    DisplayTransparentSprite(#Pointer3, MouseX() - 256 / 2, MouseY() - 256 / 2)
                    CursorType = 3
                  ElseIf (MouseX <= 0 Or MouseX => ScreenXSize) And (MouseY <= 0 Or MouseY => ScreenYSize) And MouseReleased = #FALSE And #FullScreen = #FALSE
                    ReleaseMouse(1)
                    MouseReleased = #TRUE
                    AdvertisingFlag = #TRUE
                  Else
                    DisplayTransparentSprite(#Pointer1, MouseX() - PointerXSize / 2, MouseY() - PointerYSize / 2)
                    CursorType = 1
                EndIf
            EndIf
            k + sk
            If k <= 50
                sk = 1
            EndIf
            If k => 250
                sk = -1
            EndIf
            If AdvertisingFlag
                x = 0.8 * ScreenXSize / lAdvertisingString
                For i = 1 To lAdvertisingString
                  Bend = lAdvertisingString - 2 * Abs(i - lAdvertisingString / 2)
                  DisplayTransparentSprite(#Advertising + i, i * x + 30 + Random(2) - 1, 40 + y + Random(2) - 1 + Bend)
                Next
            EndIf
          Until Quit
          Stop3D()
          If #FullScreen
              CloseScreen()
            Else
              CloseWindow(#Window_Main)
          EndIf
      EndIf
  EndIf
  TerminateProcess_(GetCurrentProcess_(), 0)
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai testé avec la 3.91 beta, le code fonctionne, mais:

- La croix rouge n'est pas visible, et quand on pointe la souris dessus, et un petit sprite de la couleur du fond s'affiche à sa place.
- Quand on place le curseur de la souris en bas à droite, cela provoque l'affichage d'un carré qui reprend le coin Haut-Gauche de la fenêtre.
- Le curseur reste invisible quand on le fait sortir de la fenêtre, bien qu'il apparaisse dans la capture d'écran.


Image

AMD Athlon XP2000+ 1.67 GHz
Win XP Home SP1 - Ram 256 Mo
GE-Force2-MX 64 Mo

Chris :)
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Oulala ! Y a un binz sur les sprites en 3.91 !

Ben je vais prendre le temps d'essayer de comprendre ce qui va pas ... je posterai une mise à jour dans qq temps.

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Répondre