FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Panorabrique pour Android Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
Panorabrique pour Android Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Panorabrique pour Android Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Panorabrique pour Android Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Panorabrique pour Android Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Panorabrique pour Android Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Panorabrique pour Android Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Panorabrique pour Android Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Panorabrique pour Android Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Panorabrique pour Android Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Panorabrique pour Android Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Panorabrique pour Android Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Panorabrique pour Android Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Panorabrique pour Android Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Panorabrique pour Android Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment :
Boutique Nike : -25% dès 50€ sur TOUT le ...
Voir le deal

 

 Panorabrique pour Android

Aller en bas 
3 participants
AuteurMessage
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Panorabrique pour Android   Panorabrique pour Android EmptyMar 18 Nov 2014 - 11:09

Bien , j'ai déjà posté mon code dans la partie lié à la version de test de Panoramic pour Android.
Actuellement, c'est une version de test limité à 20 objets et 20 subs, ce qui n'empèche pas de faire des tests et de petits programmes tout à fait opérationnel.
Pour le prouver, vous trouverez ci dessous un petit casse-brique (il y a des problèmes dessus de détection de collision qu iserait à améliorer, des problème d'effacement partiel de briques qui peut facilement être résolu en faisant par exemple une procédure retrace pour redessiner les briques non cassées) mais ce n'est pas l'objet de ce jeu / test.
L'objectif est de montrer que les fonctions de dessins fonctionne,
Que les boutons, les évenements, les timers, les sub, les sous programmes, les champs texte (alpha), les boucles et les tests fonctionnent. Il y a donc de quoi faire pour les tests ou les applis.
Code:
' Panorabric la version Android de test (limitée à 20 objets)
' Prevu pour Samsung S3
' Resolution de l'écran 600 x 380

label clic,fin, boucle_principale

' Déclarations
dim objet%, i, j, i2, j2, ecran%, aff_vies%, aff_score%
dim h,l : h=600: l=380
dim x_r , y_r, hauteur_r, largeur_r : ' Variables de la raquette
dim hauteur_b, largeur_b : hauteur_b = 8 : largeur_b=21  : ' constantes des briques
dim xb, yb, Nb_lignes, Nb_briques_restantes : ' variables pour la gestion des briques
dim x_ball,y_ball, r_ball, c, r, n_ball : r_ball = 10 : ' variables de la balle
dim vies, score : vies = 3 : score = 0
dim nom_couleur$, Nb_couleur% : Nb_couleur% = 18 : ' Tableau des couleurs
dim t_c(Nb_couleur%,3)
dim ombre, lumiere  : ombre=30 : lumiere = 30
dim marge_cote, marge_haut, hauteur_menu : marge_cote = 8 : marge_haut = 30 :hauteur_menu = 100
dim Nb_b_ligne : Nb_b_ligne = int((l - 3*marge_cote)/(largeur_b+5))

' Initialisation de la fenêtre
height 0, h: width 0,l : caption 0, "PANORABRIC Android - V1.0"
border_small 0 : i =  h - hauteur_menu + 20
button 1 : hide 1 : ' Creation du bouton gauche
top 1, i : left 1,10 : caption 1,"<" : on_click 1,clic
button 2 : hide 2 : ' Creation du bouton droite
top 2, i : left 2,50+width(1) : caption 2,">" : on_click 2,clic
button 3 : hide 3 : ' Creation du bouton quitter
top 3, i : left 3,l-width(3)-28 : caption 3,"Quitter" : on_click 3,clic
timer 4 : objet% = 5 : ' On prend 3 objets
hauteur_r = 10 : largeur_r=60 : y_r = h-120-hauteur_r

' Données à charger dans le tableau des couleurs
data "0 - Noir", 0,  0,  0,  "1 - Blanc", 255,255,255
data "2 - couleur de fond - kaki foncé", 155,155, 55
data "3 - Kaki", 180,180,80, "4 - gris foncé",  80, 80, 80
data "5 - bleu" ,80, 80,215, "6 - rouge", 215, 80, 80
data "7 - vert", 80,215, 80, "8 - gris", 155,133,155
data "9 - vert clair", 100,215,100, "10 - violet", 215, 80,215
data "11 - kaki clair", 215,215, 80, "12 - bleu cyan", 80,215,215
data "13 - bleu moyen", 100,100,215, "14 - vert moyen",55,215,133
data "15 - violet",133, 55,215,      "16 - marron clair",215,133, 55
data "17 - bleu nuit",  55, 55,133

' Chargement du tableau des couleurs
for i = 1 to Nb_couleur%
 read nom_couleur$
 for j = 1 to 3 : read c : t_c(i,j)=c : next j
next i

' Dessin de l'aire de jeu
ecran% = objet% : picture ecran%
top ecran%,0: left ecran%,1
h = h - hauteur_menu : height ecran%, h: width ecran%,l-2*marge_cote
2D_target_is ecran%: objet% = objet% +1

' Trace le contour
2d_pen_color t_c(3,1), t_c(3,2), t_c(3,3) : 2d_fill_color t_c(3,1), t_c(3,2), t_c(3,3)
2d_rectangle 0,h,marge_cote,0 : 2d_rectangle marge_cote,0,l-2*marge_cote,20
2d_rectangle l-3*marge_cote,h,l-2*marge_cote,0

' Créations des compteurs de vies et du score
aff_vies% = objet% : alpha aff_vies% : objet% = objet% + 1
color aff_vies%, t_c(3,1), t_c(3,2), t_c(3,3)
top aff_vies%,2 : left aff_vies%, 30 : width aff_vies%,140
caption aff_vies%, "Vies = "+str$(vies)

aff_score% = objet% : alpha aff_score% : objet% = objet% + 1
color aff_score%, t_c(3,1), t_c(3,2), t_c(3,3)
top aff_score%,2 : left aff_score%, 200 : width aff_score%,140
caption aff_score%, "Score = "+str$(score)

Init_niveau()

' timer pour deplacements
timer_interval 4,40 : on_timer 4,boucle_principale

' Tout est prêt, on affiche les boutons et on attend le démarrage de la boucle
show 1: show 2: show 3
end

Sub Dessine_raquette()
 ' On trace la forme de la raquette
 2d_pen_width 2 :   2d_pen_color t_c(5,1), t_c(5,2), t_c(5,3) :  2d_fill_color t_c(6,1), t_c(6,2), t_c(6,3)
 2d_rectangle x_r+4,y_r+4,x_r+largeur_r-3,y_r+hauteur_r-3
 ' On ajoute la partie claire
 2d_pen_color t_c(5,1)+lumiere, t_c(5,2)+lumiere, t_c(5,3)+lumiere
 2d_poly_from x_r+2,y_r+hauteur_r-2 : 2d_poly_to x_r+2,y_r+2 : 2d_poly_to x_r+largeur_r-2,y_r+2
 ' On ajoute les ombres
 2d_pen_color t_c(5,1)-ombre, t_c(5,2)-ombre, t_c(5,3)-ombre
 2d_poly_to x_r +largeur_r-2,y_r+hauteur_r-2 : 2D_poly_to x_r+2,y_r+hauteur_r-2: 2d_pen_width 1
End_sub

Sub Efface_raquette()
 2d_pen_color t_c(2,1), t_c(2,2), t_c(2,3) :  2d_fill_color t_c(2,1), t_c(2,2), t_c(2,3)
 2d_rectangle x_r,y_r,x_r+largeur_r,y_r+hauteur_r
End_sub

Sub init_niveau()
 Nb_lignes = 6: Dessine_briques()
 x_r = 0.5 * (l - largeur_r - 2*marge_cote)
 Dessine_raquette()
 Lance_balle()
End_sub

Sub Dessine_briques()
if variable("t_br")=1 then free t_br
dim t_br(Nb_lignes*Nb_b_ligne,5)
dim k: k=0 : Nb_briques_restantes = 0
for i= 1 to Nb_lignes
 yb = 2*marge_haut + (hauteur_b + 15) * i
 For j = 1 to Nb_b_ligne
   xb = 2*marge_cote + (largeur_b + 5) * (j-1)
   k=k+1 : t_br(k,1) = 1 : t_br(k,5) = 100
   t_br(k,2) = t_c(5+i,1): t_br(k,3) = t_c(5+i,2): t_br(k,4) = t_c(5+i,3)
   Nb_briques_restantes = Nb_briques_restantes + 1
   2d_pen_color t_br(k,2), t_br(k,3), t_br(k,4) : trace_brique()
 next j
next i
free k
End_sub

Sub retrace()
'  dim k: k=0
'  For i2= 1 to Nb_lignes
'    yb = 2*marge_haut + (hauteur_b + 15) * i2
'    For j2 = 1 to Nb_b_ligne
'      xb = 2*marge_cote + (largeur_b + 5) * (j2-1)
'      k=k+1 : if t_br(k,1)=1 then trace_brique()
'    Next j2
'  Next i2
'  free k
'  dessine_raquette()
End_sub

Sub trace_brique()
 2d_pen_width 3
 2d_pen_color t_br(k,2), t_br(k,3), t_br(k,4)
 2d_fill_color t_br(k,2), t_br(k,3), t_br(k,4)
 2d_rectangle xb+2,yb+2,xb+largeur_b-2, yb+hauteur_b-2
 2d_pen_color t_br(k,2)+lumiere, t_br(k,3)+lumiere, t_br(k,4)+lumiere
 2d_poly_from xb,yb+hauteur_b : 2d_poly_to xb,yb : 2d_poly_to xb+largeur_b,yb
 2d_pen_color t_br(k,2)-ombre, t_br(k,3)-ombre, t_br(k,4)-ombre
 2d_poly_to xb+largeur_b,yb+hauteur_b : 2d_poly_to xb,yb+hauteur_b
 2d_pen_width 1
End_sub

Sub efface_brique()
 2d_pen_width 3
 2d_pen_color t_c(2,1), t_c(2,2), t_c(2,3)
 xb = 2*marge_cote + (largeur_b + 5) * (i-1) : yb = 2*marge_haut + (hauteur_b + 15) * (temp)
 2d_rectangle xb,yb,xb+largeur_b+1, yb+hauteur_b+1
 2d_pen_width 1
End_sub

Sub Lance_balle()
 y_ball = y_r - 2*r_ball :  x_ball = int(rnd(l-60)) + 2*marge_cote : r=1
End_sub

Sub efface_balle()
 2d_pen_color t_c(2,1), t_c(2,2), t_c(2,3) :  2d_fill_color t_c(2,1), t_c(2,2), t_c(2,3)
 2d_circle x_ball+r_ball, y_ball+r_ball, r_ball
End_sub

Sub trace_balle()
 2d_pen_color t_c(3,1)-ombre, t_c(3,2)-ombre, t_c(3,3)-ombre
 2d_fill_color t_c(3,1), t_c(3,2), t_c(3,3)
 2d_Circle x_ball+r_ball, y_ball+r_ball, r_ball
 2d_pen_color t_c(4,1), t_c(4,2), t_c(4,3)
 2d_fill_color t_c(4,1)+lumiere, t_c(4,2)+lumiere, t_c(4,3)+lumiere
 2d_Circle x_ball+r_ball-3, y_ball+r_ball-3, r_ball-6
End_sub

Sub recommence()
 vies = 3 : score = 0 : Efface_raquette()
 Efface_balle() : Init_niveau()
 timer_on 4
End_sub

Sub Deplace_balle()
 If x_ball> l-4*marge_cote-2*r_ball then x_ball = l-4*marge_cote-2*r_ball : c = 2 : retrace()
 If x_ball < 2* marge_cote  Then x_ball = 2 * marge_cote : c = 1 : retrace()
 If y_ball < (marge_haut + r_ball) Then y_ball = marge_haut + r_ball : r = 2 : retrace()
 If c < 2 Then x_ball = x_ball + 5 : Else: x_ball = x_ball - 5
 If r < 2 Then y_ball = y_ball - 5 : Else: y_ball = y_ball + 5
End_sub

boucle_principale:
if variable("temp") = 0 then dim temp
 timer_off 4
 Efface_balle()
 Deplace_balle()
 ' Teste si collision avec une brique
 if (r= 1 and y_ball <= (2*marge_haut + hauteur_b + (hauteur_b + 15) * Nb_lignes))
   i = int((x_ball - 2*marge_cote) / (largeur_b + 5))+1
   temp = int ((y_ball - 2*marge_haut - hauteur_b) / (hauteur_b +15))+1
   j = (temp-1)*Nb_b_ligne +i
   if j <= (Nb_lignes*Nb_b_ligne) and j>0
     if t_br(j,1) = 1
         r=2 : t_br(j,1) = 0
         Efface_brique() : retrace()
         Nb_briques_restantes = Nb_briques_restantes - 1 : score = score + t_br(j,5)
     end_if
   end_if
 else
   if (r= 2 and  (y_ball  > (40 + hauteur_b)) and (y_ball < (25 + hauteur_b + (hauteur_b + 15) * Nb_lignes) ))
     i = int((x_ball - 30) / (largeur_b + 10)) +1
     temp = int (((y_ball+2*r_ball) -25 -hauteur_b) / (hauteur_b +15))
     j = (temp-1)*Nb_b_ligne +i
     if j <= (Nb_lignes*Nb_b_ligne) and j>0
       if t_br(j,1) = 1
         r=1 : t_br(j,1) = 0
         Efface_brique() : retrace()
         Nb_briques_restantes = Nb_briques_restantes - 1 : score = score + t_br(j,5)
       end_if
     end_if
   end_if
 end_if

' Verifie si la balle touche la raquette
 if r=2 and y_ball > y_r - 2 * r_ball - 4
     if ((x_ball > (x_r - r_ball)) and (x_ball < (x_r + largeur_r)))
       r = 1
           score=score+1
     else
       if r=2 and y_ball > y_r
           ' Balle perdue
           wait 100: Lance_balle()
           vies = vies-1
       end_if
     retrace()
     end_if
 end_if
 Trace_balle()
 caption aff_vies%, "Vies = "+str$(vies)
 caption aff_score%, "Score = "+str$(score)
 if Nb_briques_restantes = 0
   Message "Bravo, niveau suivant ..."
   Efface_balle() :  Init_niveau()
 end_if
 
 if vies < 1 then goto fin
 free temp
 timer_on 4
return

clic:
 timer_off 4
 select number_click

  case 1 : ' On test si l'on a appuyé sur la flèche de gauche
    Efface_raquette()            : ' Efface ancienne raquette
    x_r = x_r - (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
    if x_r < 10 then x_r=10      : ' Mais on ne doit pas dépasser les bords !!
    Dessine_raquette()           : ' Actualise l'affichage de la raquette

  case 2 : ' On test si l'on a appuyé sur la flèche de droite
    Efface_raquette()            : ' Efface ancienne raquette
    x_r = x_r + (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
    if x_r > l - largeur_r-26 then x_r = l - largeur_r-26  : ' Mais on ne doit pas dépasser les bords !!
    Dessine_raquette()          : ' Actualise l'affichage de la raquette

  case 3 : goto fin : ' On test si l'on a appuyé sur le bouton pour Quitter
 
 end_select
 timer_on 4
return

fin:
 timer_off 4
 terminate

Note: Ce qui est bien sur le Smartphone c'est que l'écran ne clignote pas. Ca c'est plus confortable visuellement.

Modifié avec la solution de Papydall pour le problème rencontré + ajout de la procédure retrace pour corriger le bug d'affichage de la balle / brique / raquette quand il y a chevauchement. Ca marche bien sur un PC, mais la procédure retrace consomme trop de ressources sur mon Smartphone pour la laisser active. J'ai donc mis son contenu en commentaire pour ne pas trop ralentir le jeu sur Smartphone.

Mise à jour pour gérer la souris / le clavier ou les boutons + gestion des images de sprites s'il existent.
Merci Ygeronimi pour l'aide sur la perte de focus, bien vu Smile


Dernière édition par Jicehel le Mar 25 Nov 2014 - 14:37, édité 3 fois
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Panorabrique pour Android Empty
MessageSujet: re   Panorabrique pour Android EmptyMar 18 Nov 2014 - 11:48

J' ai testé sur mon Pc mais la raquette ne veut pas se déplacer vers la droite... Sad
( Pour les clics, je ne me servirai pas du "else" mais seulement du if clicked(x%)=1 : instruction : end_if 
l' instruction serait plus claire)

edit :
Quand je déplace la raquette vers la droite, je ne peux plus aller à gauche et inversement
arrêtes tu bien ton timer lors d' un clic ?...
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 18 Nov 2014 - 12:28

Non, tu as raison, c'est une erreur de débutant Sad
Sur mon PC ou sur mon téléphone, je ne voyais pas le problème. Même si ça devrait marcher sur le téléphone, tu as parfaitement raison et il faut l'arréter pour traiter proprement. J'ai corrigé le code dans le post précédent.
Tu peux vérifier sur ton PC que ça marche.
Note: Sur le PC, l'écran "clignote" c'est un problème connu de Panoramic avec les pictures, mais je n'ai pas constaté ce problème sur mon Galaxy S3 (la balle clignote un peu dû à l'effacement / réaffichage mais ça c'est normal vu la façon dont je procède)
J'ai aussi mis les tests de la façon que tu disais. C'est vrai que c'est plus facile à lire et à commenter (du coup, j'ai rajouté quelques commentaires)
Dis moi si ça marche bien pour toi maintenant
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Panorabrique pour Android Empty
MessageSujet: re   Panorabrique pour Android EmptyMar 18 Nov 2014 - 12:52

J' ai toujours le problème de raquette...

Lorsque je clic sur droite ou gauche au départ, la raquette se déplace bien vers où je veux.
Si j' arrête mon déplacement pour repartir dans l' autre sens, impossible la raquette reste au même endroit.

( je teste sur W7, il y a peut être une différence avec Android )
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 18 Nov 2014 - 13:47

OK, je n'arrive pas à reproduire ton problème sur mon PC ou sur Android.
Pour moi, ça fonctionne bien. Si quelqu'un fait le test, merci de me dire si ça marche ou non pour lui.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 18 Nov 2014 - 16:56

Salut tout le monde
@Jicehel
J’ai testé ton code.
Je rencontre aussi l’erreur signalée par Ygeronimi (Coucou Ygeronimi !)
Ygeronimi a écrit:
J' ai toujours le problème de raquette...

Lorsque je clic sur droite ou gauche au départ, la raquette se déplace bien vers où je veux.
Si j' arrête mon déplacement pour repartir dans l' autre sens, impossible la raquette reste au même endroit.

Ma solution à ce type d’erreur :
J’ai recodé le sous-programme clic : comme ceci

Code:

rem ============================================================================
' Sous-programme modifié par Papydall
clic:
timer_off 4
select number_click
' On test si l'on a appuyé sur la flèche de gauche
  case 1
    Efface_raquette()            : ' Efface ancienne raquette
    x_r = x_r - (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
    if x_r < 10 then x_r=10      : ' Mais on ne doit pas dépasser les bords !!
    Dessine_raquette()           : ' Actualise l'affichage de la raquette

' On test si l'on a appuyé sur la flèche de droite
   case 2
     Efface_raquette()            : ' Efface ancienne raquette
     x_r = x_r + (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
     if x_r > l - largeur_r-26 then x_r = l - largeur_r-26  : ' Mais on ne doit pas dépasser les bords !!
     Dessine_raquette()          : ' Actualise l'affichage de la raquette
' On test si l'on a appuyé sur le bouton pour Quitter
   case 3 : goto fin
end_select

timer_on 4
return
rem ============================================================================



Maintenant ça marche comme il devrait l’être !!
C’est à vous de tester à nouveau (il n’y a pas de verbe retester !!!) Laughing
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Panorabrique pour Android Empty
MessageSujet: re   Panorabrique pour Android EmptyMar 18 Nov 2014 - 17:23

Bravo Papydall !!!
Tu as résolu le problème !

J' ai supprimé le timer_off 4 dans le label fin. 
Puisque le timer est inactivé au clic, il devenait inutile.

Voilà jicehel, plus qu' à affiner l' effacement des briques
et faire attention à ce que le cadre ne le soit pas sur un retour de la bille comme il me l' est arrivé.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 18 Nov 2014 - 17:39

Si déboguer  est synonyme  d’enlever les erreurs d’un programme, programmer ne pourrait être que l’art d’en créer !  Laughing
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 18 Nov 2014 - 18:01

J'ai mis à jour pour la gestion de la raquette avec la correction de Papydall.
Après pour l'amélioration du casse-brique, ça devient un autre sujet. Pour moi, ce jeu de test en restera là.
Ce que je voulez tester et tester, les instructions fonctionnent.
Le test avec la procédure 'retrace' sur le PC et sur Android font apparaitre qu'il faut être prudent par rapport au performances entre les tests sur les différentes machines.
Si quelqu'un veut continuer d'améliorer le source (en oubliant pas qu'il est prévu pour tourner sur un Smartphone) ou en refaire une version PC, les sources sont là. Servez-vous Wink
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyLun 24 Nov 2014 - 15:33

J'avais quelques minutes suite à une coupure réseau sur un site, du coup je mets ici la version PC du Panorabrique (gestion des sprites qui évite le clignotement de la version Android sur PC ou les effacement de briques / décors / raquette.
C'est améliorable, mais c'est le principe que j'utiliserais actuellement pour faire un jeu à sprites sur PC avec Panoramic.
Il y a 2 images qui peuvent être générées en retirant le commentaire devant creer_decor().
Je n'ai pas mis de test d'existence pour les créer, mais c'est facilement implémentable. Je mets surtout ce listing pour ne pas que les personnes qui ont vu le programme prévu pour Androïd utilisent cette méthode pour leurs jeux...
Code:
' Panorabric prévue pour PC (Resolution de l'écran 600 x 380)
' La résolution c'est par ce que je suis parti de la version Android de mon S3...

label clic,fin, boucle_principale, t1, t2

' Déclarations
dim i, j, i2, j2, ecran%, aff_vies%, aff_score%, zdj%, image%
dim h,l : h=600: l=380
dim x_r , y_r, hauteur_r, largeur_r : ' Variables de la raquette
dim hauteur_b, largeur_b : hauteur_b = 8 : largeur_b=21  : ' constantes des briques
dim xb, yb, Nb_lignes, Nb_briques_restantes : ' variables pour la gestion des briques
Nb_lignes = 6
dim x_ball,y_ball, r_ball, n_ball : r_ball = 10 : ' variables de la balle
dim c : ' donne la direction de la balle horizontalement
'        c=1 => la balle va vers la gauche
'        c=2 => elle va à droite
dim r : ' donne la direction de la balle verticalement
'        r=1 => la balle monte
'        r=2 => la balle descend
dim vies, score : vies = 3 : score = 0
dim nom_couleur$, Nb_couleur% : Nb_couleur% = 18 : ' Tableau des couleurs
dim t_c(Nb_couleur%,3)
dim ombre, lumiere  : ombre=30 : lumiere = 16
dim marge_cote, marge_haut, hauteur_menu : marge_cote = 8 : marge_haut = 30 :hauteur_menu = 100
dim Nb_b_ligne : Nb_b_ligne = int((l - 3*marge_cote)/(largeur_b+5))
dim t_br(Nb_lignes*Nb_b_ligne,5)
dim ctrl_mouse : ctrl_mouse = 0 : ' ctrl_mouse = 0 => clavier / boutons ; ctrl_mouse = 1 => souris
'
' ****************************** COMMANDES CLAVIER **************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC" ==> MET FIN AU PROGRAMME:.... 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> DEPLACER À GAUCHE:...... 37  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> DEPLACER À DROITE:...... 39  *
' ***************************************************************************


' Initialisation de la fenêtre
height 0, h: width 0,l : caption 0, "PANORABRIC Android - V1.0"
border_small 0 : i =  h - hauteur_menu + 20

if ctrl_mouse = 0
  button 1 : hide 1 : ' Creation du bouton gauche
  top 1, i : left 1,10 : caption 1,"<" : on_click 1,clic
  button 2 : hide 2 : ' Creation du bouton droite
  top 2, i : left 2,50+width(1) : caption 2,">" : on_click 2,clic
  button 3 : hide 3 : ' Creation du bouton quitter
  top 3, i : left 3,l-width(3)-28 : caption 3,"Quitter" : on_click 3,clic
  ' On détecte le changement d'état des touches
end_if

timer 4 : hauteur_r = 10 : largeur_r=60 : y_r = h-120-hauteur_r


' Données à charger dans le tableau des couleurs
data "0 - Noir", 0,  0,  0,  "1 - Blanc", 255,255,255
data "2 - couleur de fond - kaki foncé", 155,155, 55
data "3 - Kaki", 180,180,80, "4 - gris foncé",  80, 80, 80
data "5 - bleu" ,80, 80,215, "6 - rouge", 215, 80, 80
data "7 - vert", 80,215, 80, "8 - gris", 155,133,155
data "9 - vert clair", 100,215,100, "10 - violet", 215, 80,215
data "11 - kaki clair", 215,215, 80, "12 - bleu cyan", 80,215,215
data "13 - bleu moyen", 100,100,215, "14 - vert moyen",55,215,133
data "15 - violet",133, 55,215,      "16 - marron clair",215,133, 55
data "17 - bleu nuit",  55, 55,133

' Chargement du tableau des couleurs
for i = 1 to Nb_couleur% :  read nom_couleur$
    for j = 1 to 3 : read c : t_c(i,j)=c : next j
next i

' On retire la taille du menu à h pour créer nos objets
h= h - hauteur_menu

' Dessin de l'aire de jeu dans une image cachée qui sert aussi à créer les sprites
ecran% = 5 : picture ecran% : hide ecran%

' Créer l'objet scene2d qui sera notre zone de jeu
zdj% = 6 : scene2d zdj%
top zdj%,0: left zdj%,1
height zdj%, h: width zdj%,l-2*marge_cote

' On creer notre image de transfert
image% = 7 : image image%

' Activer cette ligne pour creer une image de fond basique si besoin (Creer_fond)
' Cette image est modifiable à volonté selon vos goût.
' Je vous en ai fourni une faite rapidement, a vous de faire mieux si vous voulez
'
Creer_fond()

file_load zdj%,"fond.bmp"

x_r = 0.5 * (l - largeur_r - 2*marge_cote) : Dessine_raquette()
Creer_brique()
Trace_balle()

caption 0, " Panorabric version PC  -  Vies restantes: " + str$(vies) + "          Score = "+str$(score)

Init_niveau()

' timer pour deplacements
timer_interval 4,30 : on_timer 4,boucle_principale
on_close 0,fin : ' Si on ferme, on ferme par la procédure de sortie

' Tout est prêt, on affiche les boutons et on attend le démarrage de la boucle
if ctrl_mouse = 0
  show 1: show 2: show 3
end_if
on_key_down 0,t1 : on_key_up 0,t2
end

Sub Dessine_raquette()
  2d_target_is ecran%
  color ecran%,0,0,0 : sprite 1 : sprite_hide 1
  if file_exists("raquette.bmp") = 0
    ' On trace la forme de la raquette
    2d_pen_width 2 :  2d_pen_color t_c(5,1), t_c(5,2), t_c(5,3) :  2d_fill_color t_c(6,1), t_c(6,2), t_c(6,3)
    2d_rectangle 4,4,largeur_r-3,hauteur_r-3
    ' On ajoute la partie claire
    2d_pen_color t_c(5,1)+lumiere, t_c(5,2)+lumiere, t_c(5,3)+lumiere
    2d_poly_from 2,-2 : 2d_poly_to 2,2 : 2d_poly_to largeur_r-2,2
    ' On ajoute les ombres
    2d_pen_color t_c(5,1)-ombre, t_c(5,2)-ombre, t_c(5,3)-ombre
    2d_poly_to largeur_r-2,hauteur_r-2 : 2D_poly_to 2,hauteur_r-2: 2d_pen_width 1
    ' file_save ecran%,"raquette.bmp"
  else
    file_load ecran%,"raquette.bmp"
  end_if
  2d_image_copy image%,0,0, largeur_r,hauteur_r
  sprite_image_load 1,image%
End_sub

Sub init_niveau()
  Dessine_briques()
  x_r = 0.5 * (l - largeur_r - 2*marge_cote)
  sprite_position 1,x_r,y_r : sprite_show 1
  Dessine_briques()
  Lance_balle()
End_sub

Sub Creer_fond()
  2d_target_is ecran% :  top ecran%,0: left ecran%,0
  height ecran%, h: width ecran%,l - 2*marge_cote
  ' Créait un fond noir si besoin
  color ecran%,0,0,0
  if file_exists("fond_noir.jpg") = 0 then file_save ecran%,"fond_noir.jpg"
  ' Trace le contour
  if file_exists("fond.bmp")=0
    2d_pen_color t_c(3,1), t_c(3,2), t_c(3,3) : 2d_fill_color t_c(3,1), t_c(3,2), t_c(3,3)
    2d_rectangle 0,h,marge_cote,0 : 2d_rectangle marge_cote,0,l-2*marge_cote,20
    2d_rectangle l-3*marge_cote,h,l-2*marge_cote,0
    2d_image_copy image%,0,0,l-2*marge_cote,h
    file_save ecran%,"fond.bmp"
  end_if
End_sub

Sub Creer_brique()
  dim k: k=0
  ' Trace le contour
  2d_target_is ecran%
  top ecran%,0: left ecran%,0 :  color ecran%,0,0,0
  height ecran%, hauteur_b : width ecran%,largeur_b
  for i= 1 to Nb_lignes
    for j = 1 to Nb_b_ligne
      k=k+1
      t_br(k,2) = t_c(5+i,1): t_br(k,3) = t_c(5+i,2): t_br(k,4) = t_c(5+i,3)
      2d_pen_color t_br(k,2), t_br(k,3), t_br(k,4)
      2d_pen_width 3
      2d_pen_color t_br(k,2), t_br(k,3), t_br(k,4) : 2d_fill_color t_br(k,2), t_br(k,3), t_br(k,4)
      2d_rectangle 2,2,largeur_b-2, hauteur_b-2
      2d_pen_color t_br(k,2)+lumiere, t_br(k,3)+lumiere, t_br(k,4)+lumiere
      2d_poly_from 0, hauteur_b : 2d_poly_to 0,0 : 2d_poly_to largeur_b, 0
      2d_pen_color t_br(k,2)-ombre, t_br(k,3)-ombre, t_br(k,4)-ombre
      2d_poly_to  largeur_b, hauteur_b : 2d_poly_to 0, hauteur_b
      2d_pen_width 1
      2d_image_copy image%,0,0,largeur_b,hauteur_b
      sprite 10+k : sprite_image_load 10+k,image% : sprite_hide 10 + k
    next j
  next i
free k
End_sub

Sub Dessine_briques()
dim k: k=0 : Nb_briques_restantes = 0
for i= 1 to Nb_lignes
  yb = 2*marge_haut + (hauteur_b + 15) * i
  For j = 1 to Nb_b_ligne
    xb = 2*marge_cote + (largeur_b + 5) * (j-1)
    k=k+1 : t_br(k,1) = 1 : t_br(k,5) = 100
    Nb_briques_restantes = Nb_briques_restantes + 1
    sprite_position 10+k, xb, yb : sprite_show 10+k
  next j
next i
free k
End_sub

Sub Lance_balle()
  y_ball = y_r - 2*r_ball :  x_ball = int(rnd(l-60)) + 2*marge_cote : r=1
  sprite_show 2
End_sub

Sub Trace_balle()
  2d_target_is ecran%
  top ecran%,0: left ecran%,0 :  height ecran%, 2*r_ball
  width ecran%,2*r_ball : color ecran%, 0,0,0
  if file_exists("balle.bmp")=0
    2d_pen_color t_c(3,1) - ombre, t_c(3,2) - ombre, t_c(3,3) - ombre
    2d_fill_color t_c(3,1), t_c(3,2), t_c(3,3) : 2d_circle r_ball, r_ball, r_ball
    2d_fill_color t_c(4,1)+lumiere, t_c(4,2)+lumiere, t_c(4,3)+lumiere
    2d_pen_color t_c(4,1), t_c(4,2), t_c(4,3) :  2d_circle r_ball-3, r_ball-3, r_ball-6
    file_save ecran%,"balle.bmp"
  else
    file_load ecran%,"balle.bmp"
  end_if
  2d_image_copy image%,0,0,2*r_ball,2*r_ball
  sprite 2 : sprite_image_load 2,image% : sprite_hide 2
End_sub

Sub recommence()
  vies = 3 : score = 0 : sprite_hide 1
  sprite_hide 2 : Init_niveau()
  timer_on 4
End_sub

Sub Deplace_balle()
  If x_ball> l-4*marge_cote-2*r_ball then x_ball = l-4*marge_cote-2*r_ball : c = 2
  If x_ball < 2* marge_cote  Then x_ball = 2 * marge_cote : c = 1
  If y_ball < (marge_haut + r_ball) Then y_ball = marge_haut + r_ball : r = 2
  If c < 2 Then x_ball = x_ball + 5 : Else: x_ball = x_ball - 5
  If r < 2 Then y_ball = y_ball - 5 : Else: y_ball = y_ball + 5
End_sub

boucle_principale:
if variable("temp") = 0 then dim temp
  timer_off 4
  Deplace_balle() : sprite_position 2,x_ball,y_ball
  ' Teste si collision avec une brique
  if (r= 1 and y_ball <= (2*marge_haut + hauteur_b + (hauteur_b + 15) * Nb_lignes))
    i = int((x_ball - 2*marge_cote) / (largeur_b + 5))+1
    temp = int ((y_ball - 2*marge_haut - hauteur_b) / (hauteur_b +15))+1
    j = (temp-1)*Nb_b_ligne +i
    if j <= (Nb_lignes*Nb_b_ligne) and j>0
      if t_br(j,1) = 1
          r=2 : t_br(j,1) = 0
          sprite_hide j+10 : Nb_briques_restantes = Nb_briques_restantes - 1 : score = score + t_br(j,5)
      end_if
    end_if
  else
    if (r= 2 and  (y_ball  > (2*marge_haut + hauteur_b)) and (y_ball < (2*marge_haut + hauteur_b + (hauteur_b + 15) * Nb_lignes) ))
      i = int((x_ball - 2*marge_cote) / (largeur_b + 5)) +1
      temp = int (((y_ball+2*r_ball) -2*marge_haut -hauteur_b) / (hauteur_b +15))
      j = (temp-1)*Nb_b_ligne +i
      if j <= (Nb_lignes*Nb_b_ligne) and j>0
        if t_br(j,1) = 1
          r=1 : t_br(j,1) = 0
          sprite_hide j+10 : Nb_briques_restantes = Nb_briques_restantes - 1 : score = score + t_br(j,5)
        end_if
      end_if
    end_if
  end_if

  if ctrl_mouse = 1
      x_r = mouse_x_position(zdj%)
      if x_r < 10 then x_r=10      : ' Mais on ne doit pas dépasser les bords !!
      if x_r > l - largeur_r-26 then x_r = l - largeur_r-26  : ' Mais on ne doit pas dépasser les bords !!
      sprite_x_position 1,x_r
  else
    if tfg=1
      x_r = x_r - (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
      if x_r < 10 then x_r=10      : ' Mais on ne doit pas dépasser les bords !!
    end_if
    if tfd=1
      x_r = x_r + (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
      if x_r > l - largeur_r-26 then x_r = l - largeur_r-26  : ' Mais on ne doit pas dépasser les bords !!
    end_if
    sprite_x_position 1,x_r
  end_if

' Verifie si la balle touche la raquette
  if r=2 and y_ball > y_r - 2 * r_ball - 4
      if ((x_ball > (x_r - r_ball)) and (x_ball < (x_r + largeur_r)))
        r = 1
            score=score+1
      else
        if r=2 and y_ball > y_r
            ' Balle perdue
            wait 400: Lance_balle()
            vies = vies-1
        end_if
      end_if
  end_if
  caption 0, " Panorabric version PC  -  Vies restantes = " + str$(vies) + "  - Score = "+str$(score)
  if Nb_briques_restantes = 0
    message "Bravo, niveau suivant ..."
    hide 2 :  Init_niveau()
  end_if

  if vies < 1 then goto fin
  free temp
  timer_on 4
return

clic:
  timer_off 4
  select number_click
  case 1 : ' On test si l'on a appuyé sur la flèche de gauche
    x_r = x_r - (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
    if x_r < 10 then x_r=10      : ' Mais on ne doit pas dépasser les bords !!
  case 2 : ' On test si l'on a appuyé sur la flèche de droite
    x_r = x_r + (largeur_r / 2)  : ' Mise à jour de la position de la raquette suite à l'appuie sur la flèche
    if x_r > l - largeur_r-26 then x_r = l - largeur_r-26  : ' Mais on ne doit pas dépasser les bords !!
  case 3 : goto fin : ' On test si l'on a appuyé sur le bouton pour Quitter
  end_select
  sprite_x_position 1,x_r
  set_focus 0
  timer_on 4
return

' ****** Procédures événementielles de gestion du clavier

t1:
  if key_down_code=cesc then goto fin
  if key_down_code=ctfg then tfg=1
  if key_down_code=ctfd then tfd=1
return

t2:
  if key_down_code=ctfg then tfg=0
  if key_down_code=ctfd then tfd=0
return

fin:
  timer_off_all : ' Je sais que l'on va faire un terminate, mais arréter les timers évite les messages d'erreur
  caption 0, " Panorabric version PC  -  Vies restantes = " + str$(vies) + "  - Score = "+str$(score)
  wait 2000:  sprite_hide_all
  caption 0, " Panorabric version PC  -  Partie terminée  - Score = "+str$(score)
  file_load zdj%,"fond_noir.jpg" :  wait 3000
  terminate

Bon le réseau est revenu depuis 10 mn , je retourne bosser ....


Dernière édition par Jicehel le Mer 26 Nov 2014 - 1:29, édité 2 fois
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Panorabrique pour Android Empty
MessageSujet: re   Panorabrique pour Android EmptyLun 24 Nov 2014 - 17:36

Chouette !!! un jeu de plus... Laughing

J' ai juste rétréci les boutons et je les ai rapproché l' un de l' autre.
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyLun 24 Nov 2014 - 18:16

Pas de problème Ygeronimi. Le jeu est largement améliorable (fond d'écran, couleurs, affichage des scores, contrôle par la souris, le clavier ou les boutons, gestion des scores, gestion des niveaux (forme des dessins de briques, vitesse de la balle), gestion des meilleurs scores, etc ...)
Là dans cette version, je voulais juste montrer que sur PC, on ne gérait pas le jeu de la même façon que dans le test sur Android et que le résultat était plus adapté.
(Après, ce sera sans doute possible aussi sous Android dans pas longtemps, mais c'est une autre histroire)
Si j'ai un peu de temps, je verrais pour avancer un peu sur la version pc à l'occasion (pas sur la gestion des niveaux qui demande un peu de temps et d'imagination pour les dessins, mais sur les couleurs qui sont un peu pourries là. Pour la balle et la raquette, je génère dans le programme, mais je ferais aussi un truc directement dans le menu pour générer les graphiques ou en utiliser des tous prêt pour le fond, la raquette et la balle pour que ce soit plus joli. Pareil pour les vies et le score. Mais surtout la gestion des touches du clavier et de la souris dans les options car ça change complétement la façon de jouer et ça demande juste quelques lignes de code ..
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 25 Nov 2014 - 11:58

J'ai un problème technique. Quelqu'un a-t-il une solution ?
Problème: Dans le programme si dessous, la gestion à la souris fonctionne si l'on mets ctrl_mouse à 1
Pour le clavier / bouton, j'ai un problème: la gestion au clavier fonctionne. La gestion avec les boutons fonctionne.
Quand on utilise le clavier, si on clique sur un bouton, ça marche, mais le contraire n'est pas vrai.
Si on clic sur un bouton, on ne peut plus utiliser le clavier et je ne comprends pas pourquoi.
Si quelqu'un comprend pourquoi, je prends et je prends aussi si il a une solution technique.

Vous trouverez dans le spoiler si dessous le code incréminé:
Code:

Merci par avance.
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Panorabrique pour Android Empty
MessageSujet: re   Panorabrique pour Android EmptyMar 25 Nov 2014 - 14:10

2 remarques qui je l' espère te seront utiles.

1 / tu n' arrêtes pas ton timer le temps du traîtement.
2 / tu fais ton on_key_down et on_key_up sur le form 0 mais est ce bien lui qui a le focus ?...
( vu que tu as un objet en mouvement qui lui dépend du scene_2d... )
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMar 25 Nov 2014 - 14:36

Merci Ygeronimi. Tu as mis le doigt dessus, trop fort. En cliquant sur le bouton, on perd le focus.
J'ai donc juste rajouté un set_focus 0 en fin de procédure clic. Ce problème est résolu   Smile
Je mets à jour le source dans le listing qui n'est pas en spoiler du coup (celui du Lun 24 Nov 2014 - 15:33)

Prochaine étape, corriger le test de collisions des briques car en modifiant, j'ai laissé le programme a moitié modifié. Je revois ça pour que ce soit plus clair et corrigé, par ce que là, la détection c'est n'importe quoi dans cette version (mais pas pour longtemps Wink )
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Panorabrique pour Android Empty
MessageSujet: re   Panorabrique pour Android EmptyMer 26 Nov 2014 - 12:36

Est ce normal que le déplacement par les touches du clavier soit si violent ?... Laughing
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android EmptyMer 26 Nov 2014 - 14:46

Oui, c'est normal car les valeurs de déplacements sont assez arbitraire. Il y a plusieurs moyen de régler ça : ajuster la valeur ou empécher le réappui sur une touche avant un certain temps en bloquant la prise en compte pendant n boucles principales.
J'allais modifier le source plus haut mais c'est vrai que du coup je commence un peu un hors sujet par rapport au titre. Du coup je vais poster le source dans un autre sujet pour la version PC.
Revenir en haut Aller en bas
Contenu sponsorisé





Panorabrique pour Android Empty
MessageSujet: Re: Panorabrique pour Android   Panorabrique pour Android Empty

Revenir en haut Aller en bas
 
Panorabrique pour Android
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Panorabrique 3D
» Projet pour Android
» Panoramic pour Android : instantané du développement
» Aide en français / anglais Panoramic pour Android
» Panorabrique

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Les jeux faits avec Panoramic-
Sauter vers: