T'as d'beaux yeux tu sais !

Partagez votre expérience de PureBasic avec les autres utilisateurs.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

T'as d'beaux yeux tu sais !

Message par fweil »

Voila le truc des yeux revu et corrigé en version jolie avec un peu d'API

Code : Tout sélectionner

;
; Eyes 1
;
; F.Weil 20040616
;
; The well known "eyes" trick, where the eyes follow the mouse, and some nice effects using a standard window and 2D drawings
; Uses Windows API commands. In case you can't compile Windows API commands, just set #WindowsAPI = #FALSE
;
; Le truc bien connu des "yeux" qui suivent la souris, avec quelques effets intéressants qui n'utilisent qu'une fenêtre standard et le dessin 2D
; Utilisation de commandes Windows API. Dans le cas où vous ne pouvez pas compiler les commandes Windows API, mettez #WindowsAPI = #FALSE
;
#WindowsAPI = #TRUE

Enumeration
  #Window_Main
  #Font
  #Image
EndEnumeration

;
; Label : Draw Text, using FontName/FontSize/Attributes and Color for the drawing font, at x, y position
;
; If Times is set to a value higher than 0 the text is drawn decrementing x and incrementing y
; while the Color value is changed to generate a fading color. This renders a 3D effect of the text.
;
; RStep, GStep, BStep are the values to change Red, Green and Blue of Color while looping.
; =============================================================================
; Label : Dessine Text, en utilisant FontName/FontSize/Attributes et Color pour la police, à la position x, y
;
; Si Times est positionné à une valeur supérieure à 0, le texte est dessiné en décrémentant x et en incrémentant y
; tandis que la couleur est modifiée pour donner un effet de fondu. Cela permet d'obtenir un effet 3D sur le texte.
;
; RStep, GStep et BStep sont les valeurs permettant de changer les composantes Rouge, Vert et Bleu de la couleur.
;
Procedure Label(Text.s, FontName.s, FontSize.l, x.l, y.l, Color.l, Attributes.l, Times.l, RStep.l, GStep.l, BStep.l)
  DrawingFont(LoadFont(#Font, FontName, FontSize, Attributes))
  DrawingMode(1)
  ; Iterates if Times > 0
  ; On boucle si Times > 0
  For i = 0 To Times
    FrontColor(Red(Color), Green(Color), Blue(Color))
    Locate(x - i, y + i)
    DrawText(Text)
    ; Color is $BBGGRR based. This line is like Color = RGB(Red(Color) - RStep, Green(Color) - GStep, Blue(Color) - BStep)
    ; Color est basée sur une combinaison $BBGGRR. Cette ligne est équivalente à Color = RGB(Red(Color) - RStep, Green(Color) - GStep, Blue(Color) - BStep)
    Color - RStep - GStep << 8 - BStep << 16
  Next
EndProcedure

;
; Eye : draw a set of circles from largest to smallest in a faded color and a solid circle in black
;
; Circles centers are located on a vector corresponding to a given length in the same direction than the x, y point from cx, cy.
; This makes possible to give this direction the same than the pointer if x, y are mouse coordinates.
; =============================================================================
; Eye : dessine un jeu de cercles concentriques du plus large au plus petit avec une couleur en dégradé, puis un cercle solide en noir.
;
; Les centres des cercles sont calculés comme se trouvant à l'extrémité d'un rayon d'un longueur donnée ayant même direction que x, y depuis cx, cy
; Cela permet par exemple de suivre la direction du pointeur si x, y sont les coordonnées de la souris.
;
Procedure.f Eye(x.l, y.l, cx.l, cy.l, s.l)
  ; a is the angle between the line containing (x, y) and (cx, cy) and the x axis
  ; a est l'angle formé par la droite contenant (x, y) et (cx, cy) par rapoort à l'axe des abcisses
  a.f = ATan((y - cy) / (x - cx))
  ; if x < cx the angle is negated. sca and ssa are stored for use in the following lines
  ; si x < cx on prend la valeur négative de l'angle. sca et ssa sont mémorisées pour usage dans les lignes suivantes
  If x < cx
      sca = -s * Cos(a)
      ssa = -s * Sin(a)
    Else
      sca = s * Cos(a)
      ssa = s * Sin(a)
  EndIf
  For i = 0 To cy - 20
    Circle(sca / 2 + cx, ssa / 2 + cy, cy - i, $D04040 + i *$10000 + 4 * i * $100 + 2 * i)
  Next
  Circle(sca + cx, ssa + cy, s, $200000)
EndProcedure

;
;
;
  WindowXSize = 240
  WindowYSize = 100
  Quit = #FALSE
  If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, #PB_Window_BorderLess |#PB_Window_ScreenCentered , "Eyes")
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      CompilerIf #WindowsAPI = #TRUE
          ; 2 elliptic regions are created and combined to obtain transparency of the window outside this combined region
          ; 2 régions elliptiques sont créées et combinées pour obtenir une transparence de la fenêtre à l'extérieur de cette région combinée
          Circle1 = CreateEllipticRgn_(0, 0, 3 * WindowXSize / 5, WindowYSize)
          Circle2 = CreateEllipticRgn_(2 * WindowXSize / 5, 0, WindowXSize, WindowYSize)
          CombineRgn_(Circle1, Circle1, Circle2, #RGN_OR)
          SetWindowRgn_(WindowID(#Window_Main), Circle1, #TRUE)
          DeleteObject_(Circle1)
          DeleteObject_(Circle2)
      CompilerEndIf
      ; The main event loop contains first a check of window close and the drawing part
      ; La boucle évènementielle principale contient en premier les tests de fermeture de la fenêtre puis la partie dessin
      Repeat
        WindowEvent = WindowEvent()
        If WindowEvent = #PB_Event_CloseWindow Or (WindowEvent = #PB_Event_Menu And EventMenuID() = #PB_Shortcut_Escape)
            Quit = #TRUE
        EndIf
        ; All the drawing is based on the window dimension and the cursor position
        ; L'ensemble du dessin est basé sur les dimensions de la fenêtre et la position de la souris
        WindowMouseX = WindowMouseX()
        WindowMouseY = WindowMouseY()
        ; Create an image to draw first inside and copy the image to the window after in order to avoid flickering.
        ; On créé une image pour y dessiner avant de copier celle-ci dans la fenêtre, ceci permettant d'éviter le scintillement.
        ImageID = CreateImage(#Image, WindowXSize, WindowYSize)
        StartDrawing(ImageOutput())
          ; background is drawn with a color that depends on the cursor distance from the window
          ; un fond de couleur est choisi en fonction de la distance de la souris à la fenêtre
          Box(0, 0, WindowXSize, WindowYSize, (255 - Sqr(WindowMouseX * WindowMouseX + WindowMouseY * WindowMouseY) / 5))
          ; Each 'eye' is drawn using the called procedure
          ; Chaque oeil est dessiné en faisant appel à la procédure citée
          Eye(WindowMouseX, WindowMouseY, WindowXSize / 4, WindowYSize / 2, WindowXSize / 8)
          Eye(WindowMouseX, WindowMouseY, 3 * WindowXSize / 4, WindowYSize / 2, WindowXSize / 8)
          ; If the cursor is within a given rectangle a text is drawn
          ; Si le curseur est situé dans un périmètre défini un texte est ajouté
          If WindowMouseX > 0 And WindowMouseX < 40 And WindowMouseY > 0 And WindowMouseY < 40
              Label("Eyes", "Verdana", 24, 15, 9, $FFFFFF, #PB_Font_Bold | #PB_Font_HighQuality, 6, 40, 20, 4)
              Label("by F.Weil", "Verdana", 12, 55, 59, $FFFFFF, #PB_Font_Bold | #PB_Font_HighQuality, 3, 80, 60, 5)
          EndIf
        StopDrawing()
        ; Copy the image to the window
        ; Copie de l'image dans la fenêtre
        StartDrawing(WindowOutput())
          DrawImage(ImageID, 0, 0)
        StopDrawing()
        ; This delay is good enough to have a nice rendering. Maybe a bit short for PCs having a CPU less than 1GHz
        ; Ce délai est suffisant pour un bon rendu. Peut-être un peu court pour les PCs équipés d'une CPU de moins de 1 GHz
        Delay(30)
      Until Quit
  EndIf
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

dèsolé mais ton "revu et corrigé" a du mal a passer !! :(

et le " en version joli !!!" ça va les chevilles ??? :?


je prefere la version du Soldat inconu
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Mais quel rabat joie ce Dobro :lol:

ben moi je trouve ça intéressant d'avoir plusieurs solutions , et puis il y a toujours à apprendre d'un autre.C'est bien que François prenne le temps de nous concocter des exemples , ou d'autres façons de faire sur un thème précis.

entre ton code ,celui du soldat et celui ci , chacun peut y trouver son compte et apprendre des trucs :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je critique pas son code !!!

je critique la presentation de son code !! nuance !!
il aurai pu la jouer moins "donneur de lecon !!" :D
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

dobro, je ne donne pas de leçon ... de quoi que ce soit, ni d'informatique encore que je pense pouvoir transmettre quelques petites choses à ceux qui veulent bien en prendre, ni de capilliculture pour le cas où des poils se hérissent.

Donc il y aura ceux qui en veulent bien et ceux qui en veleulent pas, ça ne me fait ni chaud ni froid.

Je fais de mon mieux pour écrire des modèles, des exemples, des trucs plus étoffés que la doc qui permettent parfois de se faire plaisir en approchant d'un peu plus près des résultats visuels ou non.

Je titille mon ordi, pas toi. Alors ne te glisse pas dans les touches de mon clavier, tu te fais du mal pour rien. C'est PureBasic qui m'intéresse.
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je te rapelle que tu a rebondi sur une idee que J'AI lancé alors
le fait de refaire un programme dont JE suis le Precurseur en Purebasic

et de mettre dans ton Preambule "revu et corrigé" et " en version joli !!!"
et dans le listing " Le truc bien connu des "yeux" ; comme si je sous entendais que j'en avais ete l'inventeur !! (les yeux ont qusi toujours exixte sous Linux !! )
a eu de quoi m'echaufer les oreilles !!

je ne remet pas en causes tes capacités programmer !! loin de la !
Mais tu avouera que j'ai des raisons de me sentir visé !!! non ?

le Soldat inconu qui a fait une version de cette idée n'a pas cherché a m'ecraser avec son programme en sous entendant que le sien etait meilleurs
(et pourtant il l'est !! )

si tu veux pas que je me glisse sous tes touches , alors balance tes "reprises d'idees" sans faire d'allusion sur les idees precedantes !! , c'est la moindres des choses !!

:) (Mon 2eme Nom c'est ROCK 'N ROLL !!! ) :lol:
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

vous avez demandé un championnat de boxe de code purebasic, ne quittez pas, nous allons donner suite à votre appel !

Dans le coin bleu, 1m80, 90 kg, 10 combats dont 0,5 par procédures, j'ai nommé Dooooooooooooooooooooooobroooooooooooooooooooooooooo !

Dans le coin rouge, 10 cm, 500 g, 50 combats dont 2 par procédures, j'ai nommé Fffffffffffffffffffffffweeeeeeeeeeil !

Mis en jeu : un paire d'oeil qui ne louchent pas ! :lol: :lol: :lol: :lol:

Baaaah moi j'aime bien tout ce qui passe par ce site, comme ca je me forge la partie du cerveau qui me sert à coder en pure.
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

A propos, toujours pas de réponse : Comment rendre directement des sprites sur l'écran "courant". Ainsi, comment faire la même chose (yeux) sans fenêtre?
Forcément possible : il suffit d'agir sur le buffer video. (mais comment?)
de toute façon des choses comme la souris sont gérées comme ça.

@fweil : tu dois bien savoir, non?
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

hardy, je vais regarder, mais à ce que je crois, le drawingbuffer n'est adressable qu'en mode screen. Donc les sprites pourraient être stockés dans des tableaux mais je pense pas savoir faire mieux.

Je regarde ce que je sais faire.
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.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Erreur ... DrawingBuffer() & DrawingBufferPitch() sont valables pour Screen et Sprite !

Vais faire un petit exemple
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.
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Ben oui évidemment !!
En fait c'était pour voir si tu trouvais! :lol: :lol:
Ceci-dit comment fais-tu une fenêtre transparente?

pour fweil: j'attends impatiemment un exemple.
Je vais voir ce que je peux faire pendant ce temps.

modif : bizarre, j'ai l'impression qu'une réponse à laquelle je réponds au début a disparue (concernant une fenêtre transparente)
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Viens de voir qu'on récupère le DC (device context) de l'écran complet avec getdc_(0)
A partir de là, on doit pouvoir tracer directement sur l'écran...
Vais voir.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

hardy a écrit : Ceci-dit comment fais-tu une fenêtre transparente?
COMME ça !!!

source CodeFR



Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Rendre une fenêtre transparente, uniquement pour windows 2000 et XP mais le programme est compatible toute version de windows


Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
  SetWindowLong_(WinHandle, #GWL_EXSTYLE, GetWindowLong_(WinHandle, #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
  If OpenLibrary(0, "user32.dll")
    CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
    CloseLibrary(0)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 300, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Plein écran")
  
  SetWinTransparency (WindowID(), 180)
  ; Pour changer le niveau de transparence de la fenêtre
  ; Le niveau de transparence doit être compris entre 1 (transparence totale) et 255 (opaque)
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #WM_CLOSE
  
EndIf
; ExecutableFormat=Windows
; CursorPosition=13
; FirstLine=1
; EOF
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Merci bien.

J'avais cherché un peu dans la plateforme SDK, mais j'étais passé à côté!
(faut dire que vue la taille...)

Par contre ai trouvé quelques bricoles. Par exemple, j'arrive à afficher un texte sur l'écran sans fenêtre (magnifique, non!!!)
Mettrai un exemple quand j'aurai examiné tout ça plus en détail.
Pb actuel : n'ai rien trouvé encore concernant les pbs de rafraichissement, de "flipbuffer",... (l'écran "normal" a-t-il bien deux buffers video?)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

n'ai rien trouvé encore concernant les pbs de rafraichissement, de "flipbuffer",... (l'écran "normal" a-t-il bien deux buffers video?)
en theorie il faudrai qu'il y ai 3 buffers !!!
voila comment je vois ça !!
(enfin surtout grace au STOS BASIC) :)

le buffer du fond des sprites
le buffer de l'ecran logic (celui sur lequel on dessine !)
le buffer de l'ecran physic !! (l'ecran que l'on vois !!!)

tu dessine le sprite a afficher dans le buffer logic
tu swap l'ecran logic avec le physic (donc on vois le sprite)
le physic d'avant le swap se retrouve dans le logic
on efface le logic avec clearscreen
et on recommence !!


le flip (swap) a surement lieu entre le buffer logic et physic !!!

c'est la base theorique de toute annimation de sprite sur microordinateur !!
(dont les brevet appartenait a ATARI !! a une epoque il aurai pu couler toute l'industrie du jeux video ,car il detiennent les 3 quart des brevets utilisé dans le jeu video !!)

pour le Vsync (la synchro) il etait je crois question de l'implementer dans le pure !! peut etre existant dans la 3.91 (moi j'ai la 3.90) faudrai demander a Fred !!


:)
Dernière modification par Backup le ven. 18/juin/2004 23:25, modifié 1 fois.
Répondre