Essai de Panorama mobile :)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Code : Tout sélectionner

UseJPEGImageDecoder() ; on charge l'image
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)
LoadImage(0, Fichier)
PanoramaX = ImageWidth() ; largeur du panorama
PanoramaY = ImageHeight() ; hauteur du panorama
WindowX = PanoramaX ; largeur de la fenêtre
WindowY = PanoramaY ; même hauteur que le panorama
; CreateImage(#PB_Any, WindowX, WindowY);  fenêtre horizontale pour symétrie H
CreateImage(#PB_Any, WindowY, WindowX) ; fenêtre verticale pour Rotation 90

InitSprite()
WindowID = OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_BorderLess, "Panorama")
OpenWindowedScreen(WindowID, 0, 0, WindowX, WindowY, 1, 0, 0)


If OpenWindow(0, 0, 0, WindowY, WindowX, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Effect - Rotation d'image") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; ImageSymetrieH = ImageSymmetryH(UseImage(0))
; TextGadget( #PB_Any, 0, 0, 100, 15, "Symétrie Horizontale")
; ImageGadget( #PB_Any,0, 0,WindowX,  WindowY, UseImage(ImageSymetrieH))

ImageRotation90 = RotateImage(UseImage(0), 90)
TextGadget( #PB_Any, 0, 0, 100, 15, "Rotation 90")
ImageGadget(#PB_Any, 0, 0, WindowY, WindowX, UseImage(ImageRotation90))

Repeat
  Event = WindowEvent()
  
  StartDrawing(ScreenOutput())
    ; affichage de l'image de départ
    DrawImage(UseImage(0), 0, 0)
  StopDrawing()
  FlipBuffers()
  
Until Event = #PB_Event_CloseWindow
End

bon alors tu es prêt, je t'explique tes erreurs

Code : Tout sélectionner

WindowID = OpenWindow(1, 0, 0, ...
WindowID = WindowID(1)
La deuxième ligne est inutile car openwindow te renvoie déjà le WindowID
donc ceci suffit

Code : Tout sélectionner

WindowID = OpenWindow(1, 0, 0, ...
par contre, si tu utilises PB_Any, il faut faire comme ça

Code : Tout sélectionner

WindowNumero = OpenWindow(#PB_Any, 0, 0, ...
WindowID = WindowID(WindowNumero)[/

Code : Tout sélectionner

StartDrawing(WindowOutput()) 
  ; affichage de l'image de départ 
  DrawImage(UseImage(0), 0, 0) 
StopDrawing()
Il faut mettre le stop drawing dès qu'on a finit le dessin
Il faut éviter d'avoir des openwindow ou des fonctions du genre au milieu d'un dessin ;)
Sinon, tu dessines sur la fenêtre alors qu'on a un OpenWindowedScreen dessus
mieux vaut dessiner sur le screen et faire un flipbuffers
Quand on dessine directement sur la fen, l'image n'est pas stable, si tu passe une autre fenêtre par dessus l'image, elle disparait

Code : Tout sélectionner

Result = OpenWindowedScreen(WindowID, ...
Si on ne vérifie pas le Result autant mettre directement ceci

Code : Tout sélectionner

OpenWindowedScreen(WindowID, ...
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)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Merci, merci,et non, non, les erreurs ne me font pas peur ! :lol:
Encore un bout de code à examiner à la loupe ;)

Quel est le mot "magique" qui permet au programme de savoir qu'il doit utiliser une bibliothèque spécifique, ici pour faire une rotation ?
(je supose "RotateImage" : ce mot devient-il interdit pour la déclaration d'une variable qui aurait par hasard le même nom ?
Et ajoute-t-on dans l'Exe toute la bibliothèque ou juste la partie qui fait la rotation ? (je suppose que dans l'absolu, il faudrait des mini-bibliothèques n'utilisant qu'une fonction?)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

je pense que ça n'ajoute que la fonction dont tu as besoin. Mais la je ne suis pas sur.
faut essayer plusieur prog, un utilisant une seule fonction de la lib et l'autre en utilisant plusieurs, puis comparer la taille l'exe.

Après essai, visblement, on a que la fonction utilisée qui est inclu dans l'exe



Sinon les noms de procedure utilisé dans une lib sont réservés.

En clair tu ne peux pas faire une Procedure Machin si machin est une fonction d'une lib, que ce soit une lib perso et une lib de Pure

Par contre, rien ne t'empèche de faire une liste s'appellant Machin() ou de faire une variable Machin.l
ça ne pose aucun problème, après, a toi de pas de perdre dans le code, c'est tout.
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)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Autre incendie pour les pompiers :)
Je voulais simplement rentrer des données jusqu'à l'appui du Bouton Ok !
mais.... :roll:

Code : Tout sélectionner

UseJPEGImageDecoder() ; on charge l'image
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)

LoadImage(0, Fichier)
PanoramaX = ImageWidth() ; largeur du panorama
PanoramaY = ImageHeight() ; hauteur du panorama
WindowX = PanoramaX ; largeur de la fen
WindowY = PanoramaY ; même hauteur que le panorama
Enumeration
   #Window_0
  #Window_1
EndEnumeration
Enumeration
#Gadget_0
#Gadget_1  
#Gadget_2
#Gadget_3 
#Gadget_4 
#Gadget_5
#Gadget_6
EndEnumeration
InitKeyboard()
InitSprite()

a$= "Votre fenêtre de départ fait  " + Str(WindowX)+ "*" + Str(WindowY)+ " pixels"
 OpenWindow(#Window_0, 0, 0, 400, 200,#PB_Window_ScreenCentered | #PB_Window_SystemMenu, a$)
  
  Repeat
        Event = WindowEvent()
    If CreateGadgetList(WindowID()) 
      TextGadget(#Gadget_3, 20, 10,300, 30, "Quelle taille souhaitez-vous pour votre Panorama?") 
      StringGadget(#Gadget_0, 20, 70, 150, 30, "") 
      TextGadget(#Gadget_4, 200, 70, 270, 30, "en  X  pixels")
      StringGadget(#Gadget_1, 20, 100, 150, 30, "")
      TextGadget(#Gadget_5, 200, 100, 270, 30, "en  Y  pixels")
      TexteX$ = GetGadgetText(#Gadget_0) 
      TexteY$ = GetGadgetText(#Gadget_1)
      ButtonGadget(#Gadget_6, 100, 150, 200, 20, "OK")
    EndIf 
    Gadget = EventGadgetID()
  Until  Gadget=6
;************************************
 
WindowX = Val(TexteX$); nouvelle valeur en X
WindowY =Val(TexteY$); nouvelle valeur en Y
OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Fin = Escape...Souris à gauche freine")
OpenWindowedScreen(WindowID(1), 0, 0, WindowX, WindowY, 1, 0, 0)

; On calcul le nombre de Panorama nécessaire pour remplir l'écran etc..
Est beau ce qui plaît sans concept :)
Speedy Galerie
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Code : Tout sélectionner

  Repeat 
        Event = WindowEvent() 
    If CreateGadgetList(WindowID()) 
      TextGadget(#Gadget_3, 20, 10,300, 30, "Quelle taille souhaitez-vous pour votre Panorama?") 
      StringGadget(#Gadget_0, 20, 70, 150, 30, "") 
      TextGadget(#Gadget_4, 200, 70, 270, 30, "en  X  pixels") 
      StringGadget(#Gadget_1, 20, 100, 150, 30, "") 
      TextGadget(#Gadget_5, 200, 100, 270, 30, "en  Y  pixels") 
      TexteX$ = GetGadgetText(#Gadget_0) 
      TexteY$ = GetGadgetText(#Gadget_1) 
      ButtonGadget(#Gadget_6, 100, 150, 200, 20, "OK") 
      Gadget = EventGadgetID()
   Else
      Gadget = 0
   EndIf  
  Until  Gadget=6
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)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Non, cela ne marche pas :) Rien ne s'affiche (ou n'a le temps de s'afficher)

Mais étant un peu plus en forme, j'ai trouvé une solution :)
Le problème maintenant c'est que la 2ème fenêtre n'a pas l'air de prendre en compte les données introduites! :roll:
Et que s'il on remet le mot "repeat" au dessus on retombe dans le même travers, on ne voit pas les boîtes d'entrées, ni le bouton!
Il y a quelque chose qui cloche :wink:

Code : Tout sélectionner

  If CreateGadgetList(WindowID())
    TextGadget(#Gadget_3, 20, 10,300, 30, "Quelle taille souhaitez-vous pour votre Panorama?")
    StringGadget(#Gadget_0, 20, 70, 150, 30, "")
    TextGadget(#Gadget_4, 200, 70, 270, 30, "en  X  pixels")
    StringGadget(#Gadget_1, 20, 100, 150, 30, "")
    TextGadget(#Gadget_5, 200, 100, 270, 30, "en  Y  pixels")
    TexteX$ = GetGadgetText(#Gadget_0)
    TexteY$ = GetGadgetText(#Gadget_1)
    ButtonGadget(#Gadget_6, 100, 150, 200, 20, "OK")
  EndIf
Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadgetID()
Until  Gadget=6
;************************************

WindowX = Val(TexteX$); nouvelle valeur en X
WindowY =Val(TexteY$); nouvelle valeur en Y
 CloseWindow(#Window_0)
OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Fin = Escape...Souris à gauche freine")
OpenWindowedScreen(WindowID(1), 0, 0, WindowX, WindowY, 1, 0, 0)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

désolé, j'avais pas bien régardé ton code

regarde donc ou tu as mis la créatioon des gadgets :lol: , en plein milieu de la boucle de gestion des évènements

Code : Tout sélectionner

OpenWindow(0, 0, 0, 400, 200, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "test")
If CreateGadgetList(WindowID())
    TextGadget(#PB_Any, 20, 10, 300, 30, "Quelle taille souhaitez-vous pour votre Panorama?")
    StringGadget(0, 20, 70, 150, 30, "")
    TextGadget(#PB_Any, 200, 70, 270, 30, "en  X  pixels")
    StringGadget(1, 20, 100, 150, 30, "")
    TextGadget(#PB_Any, 200, 100, 270, 30, "en  Y  pixels")
    TexteX$ = GetGadgetText(0)
    TexteY$ = GetGadgetText(1)
    ButtonGadget(2, 100, 150, 200, 20, "OK")
  EndIf
  
  Gadget = 0
Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Gadget = EventGadgetID()
  ElseIf  Event = #PB_Event_CloseWindow
    End ; On quitte
  EndIf
  
Until Gadget = 2

Si tu veux plus d'explication, va voir ici :
http://purebasic.hmt-forum.com/viewtopic.php?t=185
Il y a plein d'exmple différent tout commenté
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)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Il me semblait bien qu'il devait y avoir un truc monstrueux de ce style :)
Mais...
Il doit y avoir encore un gros vice de forme :lol:
Car ces nouveaux paramètres ne "passent pas" à la 2ème fenêtre !
Quelle pataugeoire :)

Code : Tout sélectionner

UseJPEGImageDecoder() ; on charge l'image
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)

LoadImage(0, Fichier)
PanoramaX = ImageWidth() ; largeur du panorama
PanoramaY = ImageHeight() ; hauteur du panorama
WindowX = PanoramaX ; largeur de la fen
WindowY = PanoramaY ; même hauteur que le panorama
Enumeration
   #Window_0
  #Window_1
EndEnumeration
Enumeration
#Gadget_0
#Gadget_1  
#Gadget_2

EndEnumeration
InitKeyboard()
InitSprite()

a$= "Votre fenêtre de départ fait  " + Str(WindowX)+ "*" + Str(WindowY)+ " pixels"
OpenWindow(#Window_0, 0, 0, 400, 200,#PB_Window_ScreenCentered | #PB_Window_SystemMenu, a$)

If CreateGadgetList(WindowID())
  TextGadget(#PB_Any, 20, 10, 300, 30, "Quelle taille souhaitez-vous pour votre Panorama?")
  StringGadget(0, 20, 70, 150, 30, "")
  TextGadget(#PB_Any, 200, 70, 270, 30, "en  X  pixels")
  StringGadget(1, 20, 100, 150, 30, "")
  TextGadget(#PB_Any, 200, 100, 270, 30, "en  Y  pixels")
  TexteX$ = GetGadgetText(0)
  TexteY$ = GetGadgetText(1)
  ButtonGadget(2, 100, 150, 200, 20, "OK")
EndIf
 
Gadget = 0
Repeat
  Event = WaitWindowEvent()
   If Event = #PB_EventGadget
    Gadget = EventGadgetID()
  ElseIf  Event = #PB_Event_CloseWindow
    End ; On quitte
  EndIf
 Until Gadget = 2

WindowX = Val(TexteX$); nouvelle valeur en X
WindowY =Val(TexteY$); nouvelle valeur en Y
OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Fin = Escape...Souris à gauche freine")
OpenWindowedScreen(WindowID(1), 0, 0, WindowX, WindowY, 1, 0, 0)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

deéaplce ceci après la boucle d'évènement

Code : Tout sélectionner

TexteX$ = GetGadgetText(0) 
  TexteY$ = GetGadgetText(1)
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)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Bingo ce coup-ci cela marche impec :D
Tout n'est qu'une question d'ordre en fait :roll:
J'attaque le dernier morceau de bravoure qui va être, je n'en doute pas source de nouvelles bourdes mirifiques :)
(à savoir collage de l'original + son symétrique vertical ) (vive la biblio Effect :)
Je sens déjà les sprites s'exciter d'impatience sur ma carcasse :lol:

Qu'appelle t-on ouvrir "un écran" dans une fenêtre ?
OpenWindowedScreen
Est-ce le fond de la fenêtre, peut-il être plus petit que la fenêtre ?...
J'ai vu qu'il peut y en avoir 2 par fenêtres
Cela me laisse perplexe :)

Il n'y a pas dans un coin un schéma récapitulatif explicatif visuel qui résume tout ce galimatias "Windosique"?
Merci de votre patience!
Ps Il n'y a pas de petites biblio spécialisées dans les cases "d'entrées numériques" ou "alphabétiques" ?
Ca je crois que j'ai trouvé #PB_String_Numeric :idea:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Pour l'openwindowedscreen, oui, on peut le réduire pour qu'il ne prenne pas toute la fenêtre, regarde l'aide :roll: :lol:

A savoir que l'OpenWindowedScreen est plus lent qu'un openscreen.

Mais l'intérêt est de pouvoir faire des animations simplement est sans scintillement (comparé a une imagegadget ou l'on change l'image affiché pour l'animé)
Par contre, il faut gérer son rafraichissement, à savoir que son réduit la fen et qu'on la réagrandie, le screen est vide si on a pas réactualiser l'affichage, idem quand une fenêtre passe par dessus la tienne.
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)]
Répondre