Essai de Panorama mobile :)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Essai de Panorama mobile :)

Message par Frenchy Pilou »

Je balbutie :lol:
Comment augmenter la vitesse de défilement sans perdre la finesse de l'image ?
Comment rendre possible le chargement de n'importe taille d'image?
( parceque là, toutes autres images chargées sont adaptées à celle de ce Panorama - c'est déjà pas si mal :roll:
Y a-t-il une méthode plus subtile que cette "bestiale" tentative? :wink:
Tappez pas trop fort! :lol:

Ps Il faut évidemment charger l'image jointe :)

Code : Tout sélectionner

;essai de Panorama mobile
#img = 0
  spr=1
  UseJPEGImageDecoder(); on charge l'image
  Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)
If LoadImage(#img, Fichier) = 0
  End
EndIf
Dim ecran(1024,217)
  Resultat = InitSprite()
  EcranX = 1024 ; = largeur de l'ecran
  EcranY = 217  ; = hauteur de l'ecran 
  WindowID = OpenWindow(1, 0, 0, 1024, 217,  #PB_Window_SystemMenu|#PB_Window_BorderLess  , "Souris Bord gauche Ecran = pause; Haut de l'image repart :)")
  WindowID = WindowID(1)
  Result = OpenWindowedScreen(WindowID,0,0, 1024, 217, 1, 0,0)
  StartDrawing(WindowOutput())  ; affichage de l'image 
  DrawImage(UseImage(0), 0, 0,1024,217) 
For x = 0 To 1023 
  For y = 0 To 216 ; on récupère la couleur du point en x et y 
    c = Point(x, y) 
    ecran(x,y)= c
  Next y 
Next x
  StopDrawing()
  CreateSprite(1, 1024, 217)  ; cree 1 sprites qui sert d'ecran 1
  CreateSprite(2, 1024, 217)  ; cree 1 sprites qui sert d'ecran 2   
 
Repeat  ;Boucle principale
  Event=WindowEvent()
  GetCursorPos_(CursorPos.POINT)    ; position de la souris
  MouseX = CursorPos\x 
  MouseY = CursorPos\y
  mx = MouseX-4 : my = MouseY-29  ; - épaisseur en pixel du cadre bleu de la fenêtre
  If mx <1 : Delay(800): mx=0: EndIf ; pause relative
  If mx>1024 :mx = 1024: EndIf
  If my>216 :my = 216 : w = w-1 : If w<1 :w=1: EndIf: EndIf ; w = mouvement géré par le
  If my<1 : my= 0 : w = w + 1 : If w>2 :w=0: EndIf: EndIf    ; mouvement vertical de la souris
  Gosub m_ouvement ;******** Vers Déplacement ********
  StartDrawing(SpriteOutput(spr) ) ; on dessine dedans
  For x = 0 To 1023 
    For y = 0 To 216 
      c= ecran(x,y) ; couleur du point
      Plot(x,y,c)   ; on affiche le pixel avec la nouvelle couleur
    Next y 
  Next x  
   StopDrawing() 
   spr = spr + 1: If spr>2: spr=1: EndIf
   DisplaySprite(spr, 0, 0)      
   FlipBuffers():         ; affiche l'ecran
   ClearScreen(0, 0, 0) : ; efface l'ecran
   
Until Event = #PB_Event_CloseWindow ; Fin par fermeture fenêtre
End ; fin 
  m_ouvement :
  For x = 0 To 1023        ; on  bouge les couleurs des points
    For y = 0 To 216      
      k = x + w: If k>1023: k = 0 : EndIf
      c = ecran(k,y)      ; les couleurs sont "déplacées" en x
      ecran (x,y)= c      ; réaffectation de la nouvelle couleur
    Next y 
  Next x
  Return

Image
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 »

on peu faire beaucoup plus simple :D

la solution de déplacer chaque pixel par chaque pixel est bien trop lente même si elle fonctionne :wink:

tu charges 2 sprites (ou plus en fonction de la fenêtre et de la largeur du panorama) de ton panorama que tu mets à la suite sur l'écran et tu les déaplaces vers la gauche

dès qu'un sprite est entièrement sorti de la zone d'affichage, tu le mets après le dernier sprites à droite

je vais te faire un exemple rapido :

il s'adapte en auto à la taille du panorama

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 = 600 ; largeur de la fen
WindowY = PanoramaY ; même hauteur que le panorama

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

; On calcul le nombre de Panorama nécessaire pour remplir l'écran
NbPanorama = Round(WindowX / PanoramaX, 1) + 1
; On arrondi au dessus pour avoir un nombre d'image réel
; le + 1 sert car si il faut 2 images pour recouvrir entièrement la fenêtre
; cela signifie qu'on a la fin d'une image à gauche, une image complête au milieu et un début d'image à droite dans le cas le plus défavorable
; soit 3 images

; on crée les prites nécessaires
CreateSprite(1, PanoramaX, PanoramaY) ; on crée le premier sprite avec l'image du panorama
StartDrawing(SpriteOutput(1))
  DrawImage(UseImage(0), 0, 0)
StopDrawing()

For n = 2 To NbPanorama ; puis on fait des copies de cette image
  CopySprite(1, n)
Next

; On crée une liste qui va contenir la position des sprites
Dim PosPanorama(NbPanorama)

; On charge la position initiale des panorama
For n = 1 To NbPanorama
  PosPanorama(n) = PanoramaX * (n - 1)
Next

SetFrameRate(50) ; 50 image par seconde

Repeat ; Boucle principale
  Event = WindowEvent()
  If Event = 0
    ; On affiche les panoramas
    For n = 1 To NbPanorama
      DisplaySprite(n, PosPanorama(n), 0)
    Next
    
    ; on déplace les panoramas
    For n = 1 To NbPanorama
      PosPanorama(n) - 1
      If PosPanorama(n) + PanoramaX < 0 ; Si le panorama est en dehors de l'écran, on le met à la fin à droite
        PosPanorama(n) + PanoramaX * NbPanorama
      EndIf
    Next
    
    FlipBuffers() ; affiche l'ecran
  EndIf
Until Event = #PB_Event_CloseWindow ; Fin par fermeture fenêtre

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 »

Inutile de dire que je vais essayer de ce pas et étudier le code 8)
Merci pour tout :)
Un truc m'étonne, la vitesse maximum semble plafonner !
(quand on augmente le frame rate, maximun 400 ? ....)
Et le défilement aumente certe mais n'est pas ultra rapide :)
Pas moyen de passer cette barre? :roll:
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 »

si, augmenter le pas d'avance des images ici

Code : Tout sélectionner

PosPanorama(n) - 1
tu mets 2 pour aller 2 fois plus vite

Code : Tout sélectionner

PosPanorama(n) - 2
Pour le framerate, il ne dépasseras pas la fréquence max de ton écran :wink:

donc 85hz ou 100hz
voir 60hz sur un portable

85 pixels par seconde (si 85 écran hz) sur une largeur de 800, oui, ça ne va pas vite :wink: il faut 10 seconde pour faire un tour. donc il faut augmenter le pas d'avance


Si tu veux un affichage plus fluide et plus rapide, il faut passer en plein écran plutot que le mode fenêtré
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 »

Bien, bien :)
Effectivement cela change tout :D
Est beau ce qui plaît sans concept :)
Speedy Galerie
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Existe-t-il une fonction directe pour les Sprites qui les inverses ou les "flip" ?
Horizontalement ou verticalement, ou en rotation de 90° ?
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 »

j'ai fait un lib qui peut le faire avec les images mais pas les sprites
il suffit de partir avec l'image puis de créer les sprites à partir de cette image

voir sur mon site pour la lib, elle est fournit avec un exemple
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 »

Je suppose qu'il s'agit de la "librairie Effect" ?
Je viens d'aller sur le site :)
Et donc de la charger pour en comprendre l'utilisation :roll:
Ah que c'est dûr, quand on est "rouillé" :D
La dose d'information à mettre en place est pharaonique :)

Autre petite question en passant:)
J'ai utilisé la "console" dans le langage PB, et n'obtient qu'une vingtaine de lignes visibles, une fois le programme lancé!
Est-ce normal, alors que l'on voit que l'ascenceur vertical de la fenêtre de la console a du champ libre?
J'avais évidemment demandé plus de 20 lignes de réponses :)
Dernière modification par Frenchy Pilou le sam. 12/févr./2005 3:14, modifié 1 fois.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Quelque chose m'échappe :)
Ce ne doit pas être grand chose mais....
Il n'y a pas de chemins, ou d'indication à donner pour dire au programme qu'il doit utilisé telle bibliothèque ?
Ces fonctions de rotations sont des fonctions natives deWindows, PB...? ...ou elles ont été écrites spécialement?
Et concrètement elles se trouvent dans dossiers \PureLibraries\Users Libraries mais éclatées ou pas du dossier "effect" ?
Quand je fais fonctionner votre programme, tout marche :)
Quand je fais fonctionner ce qui suit, je n'ai pas l'image symétrisée :roll:
Evidemment je fais cette symétrie pour construire automatiquement les panoramas à partir d'une moitié :)
Pour l'instant j'essaie déjà de "tourner" une simple image mais celle-ci reste rétive à mes tentatives :)
Il doit y avoir quelque chose qui cloche la-dedans, j'y retourne immédiatement,, comme dans la chanson de la java des bombes atomiques :lol:

Code : Tout sélectionner

;essai de symétrie verticale
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)
InitSprite()
  WindowID = OpenWindow(1, 0, 0, WindowX,WindowY,  #PB_Window_SystemMenu|#PB_Window_BorderLess  , "Panorama")
  WindowID = WindowID(1)
  Result = OpenWindowedScreen(WindowID,0,0, WindowX, WindowY , 1, 0,0) 
  StartDrawing(WindowOutput()) 
      ; affichage de l'image 
  DrawImage(UseImage(0), 0, 0)
  If OpenWindow(0, 0, 0,  WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Effect - Rotation d'image") = 0 Or CreateGadgetList(WindowID()) = 0
    End
  EndIf
 
  ImageSymetrieV = ImageSymmetryV(UseImage(0));ImageSymmetryV(ImageID.l)
  TextGadget( #PB_Any, 0, 0, 100, 15, "Symétrie Verticale")
  ImageGadget( #PB_Any, WindowX,  WindowY+15,0, 0, UseImage(ImageSymetrieV))
    StopDrawing()
Repeat 
  Event=WindowEvent()
    
Until Event=#PB_Event_CloseWindow 
  End
Est beau ce qui plaît sans concept :)
Speedy Galerie
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Frenchy Pilou a écrit :Il n'y a pas de chemins, ou d'indication à donner pour dire au programme qu'il doit utilisé telle bibliothèque ?
non , tu mets la lib dans le répertoire userlibrairies et c'est tout .
si tu avais l'éditeur ouvert ,tu relances le compilateur(dans le menu de l'éditeur) pour prendre en compte cette nouvelle lib .

tu as inversé position et dimension dans

Code : Tout sélectionner

ImageGadget( #PB_Any, 0,0,WindowX,  WindowY, UseImage(ImageSymetrieV))
ensuite utilise plutôt

Code : Tout sélectionner

ImageSymetrieV = ImageSymmetryH(UseImage(0))
pour voir quelque chose, parce que ton image c'est déjà le résultat d'une symétrie alors tu ne verras rien (euh en fait ça dépend de l'image , j'ai testé avec ton panorama ) :)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

8)
C'était cela ! Pas simple, simple, faut penser à tout :)
Maintenant j' attaque le miroir vertical pour créer en fait la première image à partir d'une image normale pour qu'elle donne un effet de glissement infini :)
Voyons voir comment cela se passe :)
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 ma lib, c'est programmé entièrement.

Il existye une API qui pourrait faire l'affaire mais uniquement compatible win 2000 et XP.
donc j'ai préféré tout coder et le résultat en terme de vitesse est largement satisfaisant vu que je ne travaille qu'avec les mémoires.

Il existe une autre lib sur PureArea qui fait la même chose il me semble, je ne l'ai jamais essayé. elle est peut-être plus rapide mais je préfère faire moi même, on est plus heureux du résultat :D


Pour info, j'ai commencé une fonction pour faire des rotations de 30° par exemple, enfin, toute les valeurs possible
elle marche sans antialiazing mais c'est moche
pour l'antialiasing, j'ai un problème dans la méthode de calcul, les bords de l'image bug après rotation, il faut que je revoie ça
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 de ces précisions :)Le tunnel commence a s'éclaircir!

Voyant que la symétrie Horizontale marchait parfaitement, j'ai voulu essayé une rotation de 90°
L'image elle- même a bien tournée, mais la 2ème fenêtre, elle, reste obstinément horizontale!
Quel est ce nouveau mystère :)

Code : Tout sélectionner

;essai de symetrie verticale
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")
  WindowID = WindowID(1)
  Result = OpenWindowedScreen(WindowID,0,0, WindowX, WindowY , 1, 0,0) 
  StartDrawing(WindowOutput()) 
  ; affichage de l'image de départ
  DrawImage(UseImage(0), 0, 0)
  If OpenWindow(0, 0, 0,  WindowX, WindowY, #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))
    StopDrawing()
Repeat 
  Event=WindowEvent()
    
Until Event=#PB_Event_CloseWindow 
  End
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 »

Regarde ou est rendu ton stopdrawing() :lol:

Code : Tout sélectionner

; essai de symetrie verticale
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

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))
; ImageGadget( #PB_Any,0, 0,WindowX,  WindowY, UseImage(ImageSymetrieH))

ImageRotation90 = RotateImage(UseImage(0), 90)
ImageGadget(#PB_Any, 0, 0, WindowY, WindowX, UseImage(ImageRotation90))

Repeat
  Event = WindowEvent()
  
Until Event = #PB_Event_CloseWindow
End
Ca marche très bien :wink:

C'esst juste que tu devrais faire attention, ton code est un vrai bazar. essaye de le ranger un peu mieux et verras de suite tes erreurs :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)]
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

En fait je voulais la première image de départ "en haut"
Et sa rotation plus bas sur l'écran. (donc 2 fenêtres)
Dans l'exemple que tu me donne on ne voit plus que le résultat ! :)
(une seule fenêtre)
Comment procéder ? Ce stopDrawing doit avoir une place particulière ?
Est beau ce qui plaît sans concept :)
Speedy Galerie
Répondre