selection avec defilement d'image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

selection avec defilement d'image

Message par Thyphoon »

ça fait plusieur jour que je cherche a faire une barre de selection avec des images qui défilé horizontalement
Je m'explique

Un bandeau Horizontal qui fait la largeur de l'ecran
l'image du milieu est l'image selectionné
les images ne font pas toute obligatoirement la même taille
mais lorsqu'on s'approche de l'image selectioné l'image grossit et lorsqu'on s'eloigne de l'image selectioné l'image retrecie pour prendre la taille des autres images du bandeau
Lorsqu'on appuie sur la touche droite les images scroll dans un sens ou l'autre, s'agrandissant ou retrésissant selon si elle s'approche ou seloigne de l'image selectioné !
Voilà ce que j'essaye de faire en vain de puis plus d'une semaine...
voici le mieux que j'ai réussi a faire (voir le code)
Est ce quelqu'un sais ou trouver au moins le principe pour programmer ce genre de truc ? Je pensais que c'était tou bête a programmer et je me suis trompé ... :cry:

Code : Tout sélectionner

#Window = 0
#Width = 640
#Height = 480

#Mode_initSp = 1; lit les fichier un part un
; #Mode_initSp=1;créer en même temps les packs
; #Mode_initSp=2;lit les fichiers via le pack


Procedure StartScreen()
  ;- Init DirectX
  If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
    MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
    CloseWindow(#Window) : End
  EndIf
  
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "ArcaThy" + ver$)
    OpenWindowedScreen(res, 0, 0, #Width, #Height, 0, 0, 0)
  Else
    OpenScreen( #Width, #Height, 16, "Arcadthy" + ver$ )
  EndIf
EndProcedure



StartScreen()


CreateImage(0,320,200)
StartDrawing(ImageOutput())
UseImage(0)
DrawingMode(1|4)
Box(1,1,319,199,RGB(255,255,255))
StopDrawing()
Procedure show(im,x,y,H)
UseImage(im)
W=ImageWidth()*H/ImageHeight()
CreateSprite(im,W,H)
StartDrawing(SpriteOutput(im))
DrawImage(UseImage(im),0,0,W,H)
StopDrawing()
DisplaySprite(im,x,y)
EndProcedure

Repeat ; Jeu
  
  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_right) And id_game=old_id_game
  id_game=id_game+1
  EndIf

  If KeyboardPushed(#PB_Key_left) And id_game=old_id_game
  id_game=id_game-1
  EndIf

If id_game>old_id_game
zx=zx+1
If zx=SpriteWidth(0)
  old_id_game=id_game
  zx=0
EndIf
EndIf

If id_game<old_id_game
zx=zx-1
If zx=SpriteWidth(0)
  old_id_game=id_game
  zx=0
EndIf
EndIf
    
  
    
  LScreen=640 ; largeur du bandeau ou de l'ecran
  MScreen=Int(LScreen/2) ; calcul du milieu du bandeau là ou sera l'image selectionné
  Hsnap=50 ; hauteur des images affiché
  DX=180 ; largeur avant et apres l'image selectionné ou l'image doit grossir ou retressir 
  
  X=-150 ; coordonnée ou on commence a affiché les images
  Debug"---"
  While X<LScreen
  H=Hsnap
  If X+zx>=(MScreen-DX) And X+zx<=(MScreen+DX) ; si on est dans la zonne au tour del'image selectionné on calcul l'agrandissement de ces dernière
  Debug (DX-Sqr(Pow((MScreen-X+zx),2)))/10
    H=H+(DX-Sqr(Pow((MScreen-X+zx),2)))/10
  EndIf 
  
  show(0,X+zx,200,H)
  X=X+SpriteWidth(0)+10 
  Wend
    
  FlipBuffers(0)
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    While WindowEvent() : Wend ; evite le plantage clic gauche
  EndIf
Until KeyboardPushed(#PB_Key_Escape)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

j'ai réussi a faire un peu mieux mais c'est pas encore ça ...

Code : Tout sélectionner

#Window = 0
#Width = 640
#Height = 480

#Mode_initSp = 1; lit les fichier un part un
; #Mode_initSp=1;créer en même temps les packs
; #Mode_initSp=2;lit les fichiers via le pack

Global MScreen
Global DX

Procedure StartScreen()
  ;- Init DirectX
  If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
    MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
    CloseWindow(#Window) : End
  EndIf
  
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "ArcaThy" + ver$)
    OpenWindowedScreen(res, 0, 0, #Width, #Height, 0, 0, 0)
  Else
    OpenScreen( #Width, #Height, 16, "Arcadthy" + ver$ )
  EndIf
EndProcedure



StartScreen()


CreateImage(0,320,200)
StartDrawing(ImageOutput())
UseImage(0)
DrawingMode(1|4)
Box(1,1,319,199,RGB(255,255,255))
StopDrawing()
Procedure show(im,x,y)
UseImage(im)
H=50+(DX-Sqr(Pow((MScreen-x),2)))/10
W=ImageWidth()*H/ImageHeight()
CreateSprite(im,W,H)
StartDrawing(SpriteOutput(im))
DrawImage(UseImage(im),0,0,W,H)
StopDrawing()
x=x-Int(W/2)
y=y-Int(H/2)
DisplaySprite(im,x,y)
ProcedureReturn W
EndProcedure

Repeat ; Jeu
  
  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_right) And id_game=old_id_game
  id_game=id_game+1
  EndIf

  If KeyboardPushed(#PB_Key_left) And id_game=old_id_game
  id_game=id_game-1
  EndIf

If id_game>old_id_game
zx=zx+5
If zx>ini
  old_id_game=id_game
  zx=0
EndIf
EndIf

If id_game<old_id_game
zx=zx-5
If zx<(0-ini)
  old_id_game=id_game
  zx=0
EndIf
EndIf
    
  
    
  LScreen=640
  MScreen=Int(LScreen/2)
  Hsnap=50
  DX=320
  
  X=MScreen
  If id_game=old_id_game:ini=0:EndIf;
  While X<LScreen+150
  
  w=show(0,X+zx,200)
  If ini=0 And id_game=old_id_game :ini=w:EndIf
  X=X+w
  Wend
  
  X=MScreen
  While X>-150
  
  w=show(0,X+zx,200)
  If ini=0 And id_game=old_id_game :ini=w:EndIf
  X=X-w
  Wend

  
    
  FlipBuffers(0)
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    While WindowEvent() : Wend ; evite le plantage clic gauche
  EndIf
Until KeyboardPushed(#PB_Key_Escape)
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

#Window = 0
#Width = 640
#Height = 480

#Mode_initSp = 1 ; lit les fichier un part un
; #Mode_initSp=1;créer en même temps les packs
; #Mode_initSp=2;lit les fichiers via le pack

Global MScreen
Global DX

Procedure StartScreen()
  ;- Init DirectX
  If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
    MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
    CloseWindow(#Window) : End
  EndIf
  
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "ArcaThy" + ver$)
    OpenWindowedScreen(res, 0, 0, #Width, #Height, 0, 0, 0)
  Else
    OpenScreen( #Width, #Height, 16, "Arcadthy" + ver$ )
  EndIf
EndProcedure



StartScreen()

CreateSprite(0, 320, 200, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
  Box(0, 0, 320, 200, RGB(255, 0, 0))
  Box(4, 4, 310, 190, RGB(255, 255, 255)) ; La taille du rectangle en param 2 et 3, pas la position du coin bas droit
StopDrawing()
CreateSprite3D(0, 0)

Procedure show(im, x, y)
  Coef.f = (#Width / 2 - Abs(x)) / #Width
  If Coef < 0.2
    Coef = 0.2
  EndIf 
  w = SpriteWidth(im) * Coef
  H = SpriteHeight(im) * Coef
  x = x - Int(w / 2) + #Width / 2
  y = y - Int(H / 2) + #Height / 2
  Start3D()
    ZoomSprite3D(im, w, H)
    DisplaySprite3D(im, x,y)
  Stop3D()
  ProcedureReturn w
EndProcedure


Repeat ; Jeu
  
  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_Right)
    Deplacement = 1
  EndIf
  
  If KeyboardReleased(#PB_Key_Left)
    Deplacement = -1
  EndIf
  
  Decalage + Deplacement
  If Decalage = 0
    Deplacement = 0
  ElseIf Int(Abs(Decalage)) % 50 = 0
    Decalage = -Decalage
  EndIf
  
  For n = 9 To 0 Step -1
    show(0, -100 * n + Decalage, 0)
  Next
  For n = 9 To 0 Step -1
    show(0, 100 * n + Decalage, 0)
  Next
  show(0, Decalage, 0)
  
  FlipBuffers()
  
  While WindowEvent() : Wend ; evite le plantage clic gauche

Until KeyboardPushed(#PB_Key_Escape)
je commente pas de suite, je vais au lit, je repondrais à tes questions demain en espérant que ma solution répond à ton problème
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)]
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

c'est génial ....j'examine ton code demain... Merci beaucoup
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

a partir de ton code j'essaye de faire en sorte que l'espace entre les images soit en proportionel a la taille de l'image affiché. Car je vais avoir des images de taille et de proportion différente.Mais du coup j'ai des sacades voilà ce que j'ai changé

Code : Tout sélectionner

  sep=0
  For n = 9 To 0 Step -1 
    w=show(0, sep + Decalage, 0) 
    sep=sep+w+10
  Next
  sep=0 
  For n = 9 To 0 Step -1 
    w=show(0, sep + Decalage, 0) 
    sep=sep-w-10
  Next 
  show(0, Decalage, 0) 

Sinon j'ai juste une petite Question :
a qu'est ce que tu verifie avec cette ligne ?
a quoi correspond le 50 ?

Code : Tout sélectionner

  ElseIf Int(Abs(Decalage)) % 50 = 0 
En tout cas un tres tres grand merci pour ton aide
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

en fait, je décale chaque image de 100 pixels

pour afficher l'image la plus grosse toujours en dernier (pour quelle apparaisse devant les autres), il faut passer d'une image à une autre quand on fait tourner

on a l'ancienne image du milieu qui passe derrière la nouvelle image centrale.
ce changement se fait 50 pixel (la moitié de la distance entre chaque image)

donc quand on arrive à 50 pixel (Deplacement % 50 = 0) on change d'image de premier plan, pour cela, je passe le décalage de 50 à -50.

en fait, je triche, comme c'est toujours la même image dans cet exemple, quand on a déplacé de 50 pixel l'image centrale, je la décale à -50 (donc un saut de pixel pour la placer à la place de l'image qui arrivait au centre)

tu comprends la bidouille ? c'est pas facile à expliquer.

le mieux pour tes test serait de faire une 10 dixaine de sprite numéroté (avec un drawtext) et de taille différente, ensuite de mettre en place l'animation correctement avec les images avant d'essayer de bidouiller pour mettre des espaces constants. enfin, moi je ferais comme ça. car avec des images qui ont toutes la m^mes taille, on vaoit pas ce qu'on fait
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)]
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

tu as raison merci pour les explication c'est super claire je vais tester ça !!!
Merci beaucoup
Répondre