FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Problème de math
par papydall Aujourd'hui à 1:53

» A propos des attributs de fichier
par papydall Hier à 14:33

» Problème de math
par Marc37 Sam 21 Oct 2017 - 23:04

» I Love You
par papydall Sam 21 Oct 2017 - 19:22

» Un petit "coucou" à tous les Panoramiciens !
par mindstorm Sam 21 Oct 2017 - 17:06

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Mer 18 Oct 2017 - 18:08

» mise a jour calculatrice
par joeeee2017 Mer 18 Oct 2017 - 15:57

» [solved] 3D_LINE How to ?
par Jicehel Mer 18 Oct 2017 - 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» Compilateur FBPano
par jean_debord Jeu 12 Oct 2017 - 9:53

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

» à propos de Panoramic_Editor [Résolu]
par Klaus Mar 10 Oct 2017 - 3:19

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Début d'un nouveau système de 2D et Sprites

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3
AuteurMessage
Jean Claude

avatar

Nombre de messages : 5040
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Sam 21 Mai 2016 - 13:27

Bonjour à tous,


@Klaus,

Il y a une erreur dans la doc.chm (au minimum sur celle en ligne, je n'ai pas vérifier les autres)

Il s'agit du tableau d'information pour le scene2D (ci-dessous)

Citation :
' 0 = taille du tableau       (doit être chargé avant d'établir le lien)
' 1 = nombre de sprites
' 2 = ID du sprite sélectionné
' 3 = x (position horizontale du coin en haut à gauche du sprite)
' 4 = y (position verticale du coin en haut à gauche du sprite)
' 5 = w (largeur du sprite)
' 6 = h (hauteur du sprite)
' 7 = flag "utilisation du viewport"
' 8 = flag "déplacement du viewport par la souris est autorisé"
' 9 = coordonnée x du viewport
' 10 = coordonnée y du viewport

les coordonnées x,y,w,h ne sont pas celles du sprite sélectionnée.
Je pense que c'est plutôt le viewport.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Dim 22 Mai 2016 - 10:17

Mince, ça marchait plutôt bien mais j'avais une erreur de pointeur.
J'ai essayé de triturer un peu les timers et les événements mais j'ai toujours des problèmes de pointeurs.
J'en appelle donc à vous et je pense surtout à Klaus pour m'expliquer ce qui peut planter dans les pointeurs par ce que je ne vois pas.
Je ne dis pas que le problème vient des nouvelles fonctions. C'est sans doute mon utilisation qui ne tient pas compte de quelque chose mais je ne vois pas quoi, peut être que ça sautera aux yeux de quelqu'un d'exterieur.

Le problème est plus ou moins aléatoire, c'est pouruoi j'ai essayé de couper les événements et les timers le temps des traitements. A priori, je n'en aurais pas besoin car ça marchait plutôt bien avant jusqu'au changement de niveau.

Je vous remets le code actuel ici:

Code:
' Panorabrique V3 par Jicehel
'
' Version utilisant les objets sprites et scene2D de KGF

label event,t1, t2, boucle

dim sversion$, iversion%: sversion$ = string$(255," ")
dim res%, SC2D%, SC2D_PS%, dx%, dy%, hnd%, MP% , titre$ : titre$  = "PANORABRIQUE - V3.0"
dim h,l : h=700: l=1000
dim hauteur_b, largeur_b : hauteur_b = 30 : largeur_b=60
dim c, xb, yb, i, j, r , N
dim Nb_b_ligne : Nb_b_ligne = int((l - 80)/(largeur_b+3))
dim Nb_lignes, Sprites_briques, Nb_points_brique$ : Nb_lignes = 7
dim x_r , y_r, hauteur_r, largeur_r, num_spr_raquette, v_raquette : hauteur_r = 30 : largeur_r=120 : y_r = h-30-hauteur_r : v_raquette = 25
dim vies : vies = 3
dim x_balle,y_balle, n_balle, num_spr_balle
dim v_x_balle%, v_y_balle% : v_x_balle% = 10 : v_y_balle% = 10 : ' Vitese de déplassement de la balle
dim score : score = 0
dim Nb_couleur%: Nb_couleur% = 6
dim num_bord_gauche%,num_bord_haut%, num_bord_droit%, largeur_bord% : largeur_bord% = 40
dim Boucle% : Boucle% = 6

' ***************************** COMMANDES CLAVIER *************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC" ==> MET FIN AU PROGRAMME:.. 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> ALLER À GAUCHE:....... 37  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> ALLER À DROITE:....... 39  *

dim son_perdu : son_perdu = 20 : sound son_perdu : file_load son_perdu,"Perte_balle.wav"
dim son_gameover : son_gameover = 21 : sound son_gameover : file_load son_gameover,"Perdu.wav"
dim son_nouvelleballe : son_nouvelleballe = 22 : sound son_nouvelleballe : file_load son_nouvelleballe,"Nouvelle_balle.wav"
dim son_rebondmetal : son_rebondmetal = 23 : sound son_rebondmetal : file_load son_rebondmetal, "Rebond_bord_metal.mp3"
dim son_rebondraquette : son_rebondraquette = 24 : sound son_rebondraquette : file_load son_rebondraquette, "Rebond_raquette.mp3"
dim son_cassebrique : son_cassebrique = 25 : sound son_cassebrique : file_load son_cassebrique, "Brique_cassee.wav"
dim son_musique$ : son_musique$ = "Musique1.wav"

height 0, h+62: width 0,l+37 : border_small 0

dll_on "KGF.dll"

dim brique1$ : brique1$ = "b01_2.bmp"
dim brique2$ : brique2$ = "b02_2.bmp"
dim brique3$ : brique3$ = "b03_2.bmp"
dim brique4$ : brique4$ = "b04_2.bmp"
dim brique5$ : brique5$ = "b05_2.bmp"
dim brique6$ : brique6$ = "b06_2.bmp"
dim brique7$ : brique7$ = "b07_2.bmp"
dim raquette$ : raquette$ = "raquette_2.bmp"
dim balle$ : balle$ = "balle2.bmp"
dim barre_haut$ :  barre_haut$ = "barre_haut.bmp"
dim barre_cote$ :  barre_cote$ = "barre_cote.bmp"
dim fond$ : fond$ = "fond01.jpg"

' res% = dll_call1("GetVersionOfScene2D",dest%)
' Paramètres:
'    dest%      0  retourner l'information numérique de la version uniquement
'          adr(version$)  retourner également l'information textuelle
' Retour:
'    res%      version numérique  (1, 2, 3, ...)

iversion% = dll_call1("GetVersionOfScene2D",adr(sversion$))

MP% = dll_call5("CreateMultiPlayer",handle(0),0-1000,0,500,500)
res% = dll_call2("LoadFileIntoMultiPlayer",MP%,adr(son_musique$ ))
res% = dll_call2("LoopMultiPlayer",MP%,1)

' SC2D% = dll_call2("CreateScene2D",handle(dest%),VP%)
' Paramètres:
'     dest%      objet Panoramic recevant le Scene2D (form, Panel, ...)
'      VP% : indicateur d'utilisation du viewport (0=fond fixe  1=viewport mobile)
' Retour:
'    SC2D%   identifiant unique du Scene2D, servant de lien avec les autres fonctions
'
SC2D% = dll_call2("CreateScene2D",handle(0),0)

if 1 = 0
' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,x%)
' Paramètres:
'    SC2D%   identifiant de l'objet
'   x%      0  pour récupérer la longueur du tableau interface%
'         adr(interface%)  pour établir le lien avec l'objet
' Retour:
'   res%      -1=erreur  0=ok
'                                    ou n>0 si x%=0: retourne alors la longueur du tableau interface%
' Utilisation:
'    res% = dll_call2("SetInterfaceOfScene2D",SC2D%,0)
'   dim interface%(res%)
'    interface%(0) = res%
'   interface%(1) = handle(edit%)
'    res% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(interface%))
' Signification des cellules de l'interface:
'    offset  signification
'    0        taille du tableau      (doit être chargé avant d'établir le lien)
'    1        handle d'un EDIT        (doit être chargé pour recevoir les évènements)
'    2        ID du sprite sélectionné
'    3        x (position horizontale du coin en haut à gauche du sprite)
'    4        y (position verticale du coin en haut à gauche du sprite)
'    5        w (largeur du sprite)
'    6        h (hauteur du sprite)
'    7        ID du sprite collisionné
'    8        numéro de la zone de contact collisionné dans le sprite collisionné
'    9        flag "utilisation du viewport"
'    10      flag "déplacement du viewport par la souris est autorisé"
'    11      coordonnée x du viewport
'    12      coordonnée y du viewport
'    13      indice de l'image dans l'ImageList (-1 = ImageList non utilisée)
'    14      code action du sprite causant l'évènement
'    15      fréquence d'action du sprite causant l'évènement (ou 0 si pas d'action en cours)
'    16      type d'évènement:  0=normal  1=collision  2=contact bordure  3=téléporté
'    17      bordure pour type évènement 2 et 3:  1=gauche  2=haut  3=droite  4=ba
end_if

edit  98 : hide 98
' 98 est l'objet edit qui va permettre de recevoir les informations
' provenant du scene2d géré par KGF


SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,0)
dim SC2D_Panoramic%(SC2D_PS%)
SC2D_Panoramic%(0) = SC2D_PS%
SC2D_Panoramic%(1) = handle(98)
SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(SC2D_Panoramic%))

if 1=0
' res% = dll_call6("ResizeScene2D",SC2D%, l%,t%,w%,h%,v)
' Paramètres:
'   SC2D%   identifiant de l'objet
'   l%,t%      coin en haut à gauche de l'objet
'   w%,h%   dimensions de l'objet
'   v%      visibilité  (0=invisible  1=visible)  défaut: invisible
' Retour:
'   res%      -1=erreur  0=ok
end_if

res% = dll_call6("ResizeScene2D",SC2D%,10,10,l,h,1)

if 1=0
' res% = dll_call2("LoadBackgroundToScene2D",SC2D%,adr(img$))
' Paramètres:
'    SC2D%   identifiant de l'objet
'    img$      chaîne de caractères pour l'image JPG de fond
' Retour:
'   res%      -1=erreur  0=ok
end_if

if 1=0
' res% = dll_call4("LoadMosaicBackgroundToScene2D",SC2D%,w%,h%,org%)
' Paramètres:
'      SC2D%          identifiant du Scene2D
'      w%,h%          dimensions de l'image résultante
'      org%            origine de l'image
'                      0 = presse-papier
'                      adr(img$) = fichier JPG ou BMP contenant la vignette
'      res%            -1 si erreur    0 si ok
end_if

res% = dll_call4("LoadMosaicBackgroundToScene2D",SC2D%,100,100,adr(fond$))


x_r = l/2
num_spr_raquette =  dll_call6("CreateSpriteInScene2D",SC2D%,x_r , y_r,0,50,adr(raquette$))

num_bord_gauche% = dll_call6("CreateSpriteInScene2D",SC2D%,0 , 40,0,50,adr(barre_cote$))
num_bord_haut%=    dll_call6("CreateSpriteInScene2D",SC2D%,0 , 0,0,50,adr(barre_haut$))
num_bord_droit% =  dll_call6("CreateSpriteInScene2D",SC2D%,960 , 40,0,50,adr(barre_cote$))


' On détecte le changement d'état des touches
  on_key_down 0,t1 : on_key_up 0,t2

' Création du timer principal du jeu, c'est le coeur du jeu, le temps de base d'un cycle
  timer Boucle%: timer_interval Boucle%,40 : on_timer Boucle%, Boucle
 
  Nouveau_Niveau()
  lance_balle()

end


' ====================================== Capture et traitement des évènements:
event:
timer_off Boucle%
off_change 98
  if text$(98)="status"
' Si contact avec le bord de l'écran
  if SC2D_Panoramic%(2) = num_spr_balle
    if SC2D_Panoramic%(16)= 1

      if SC2D_Panoramic%(7) = num_bord_gauche% or SC2D_Panoramic%(7) = num_bord_droit%
        play son_rebondmetal : dx% = 0 - dx%
      else
        if SC2D_Panoramic%(7) = num_bord_haut%
            play son_rebondmetal :dy% = 0 - dy%
        else
          if SC2D_Panoramic%(7) = num_spr_raquette
              play son_rebondraquette :dy% = 0 - dy%
          else
              play son_cassebrique
             
'              res% = dll_call3("GetTextOfSpriteInScene2D",SC2D%,ind%,adr(txt$))
'
' Paramètres:
' SC2D%      identifiant du Scene2D
' ind%        Sprite identifyer (0=selected sprite; >0=sprite ind%)
' txt$        chaîne de caractères recevant le texte libre
' res%        -1 si erreur; 0 si ok

              res% = dll_call3("GetTextOfSpriteInScene2D",SC2D%,SC2D_Panoramic%(7),adr(Nb_points_brique$))
              score = score + val(Nb_points_brique$)
             
'            res% = dll_call2("DeleteSpriteInScene2D",SC2D%,ind%)
'
' Paramètres:
'            SC2D%  identifiant du Scene2D
'            ind%  identifiant du Sprite (0=sprite sélectionné  >0=sprite ind%)
'            res%  -1 si Scene2D non définie ou invalide; -2 si erreur ou sprite inexistant; 0 si ok

              res% = dll_call2("DeleteSpriteInScene2D",SC2D%,SC2D_Panoramic%(7))
              Sprites_briques = Sprites_briques - 1
              dy% = 0 - dy%
              if Sprites_briques = 0 then Nouveau_Niveau()
          end_if
        end_if
      end_if
    end_if
    if SC2D_Panoramic%(16)=2
      select SC2D_Panoramic%(17)
        case 4: ' bottom
          res% = dll_call1("StopMultiPlayer",MP%)
          vies = vies - 1 : play son_perdu : tfg=0 : tfd=0
          caption 0, titre$ + "    Vies : " + str$(vies) + "    Score : " + str$(score)
         
'        res% = dll_call2("DeleteSpriteInScene2D",SC2D%,ind%)
'
' Paramètres:
'        SC2D%  identifiant du Scene2D
'        ind%  identifiant du Sprite (0=sprite sélectionné  >0=sprite ind%)
'        res%  (-1 si Scene2D non définie ou invalide; -2 si erreur ou sprite inexistant; 0 si ok)

          res% = dll_call2("DeleteSpriteInScene2D",SC2D%,num_spr_balle) : wait 1500
          if vies > 0 then lance_balle() : else: play son_gameover : wait 3000 : quitte()
      end_select
    end_if
  end_if
 end_if
 
 caption 0, titre$ + "    Vies : " + str$(vies) + "    Score : " + str$(score)
 
 
 res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20)
timer_on Boucle%
on_change 98,event
return

' ====================================== Traitement des appuis sur le clavier:

t1:
  if key_down_code=cesc then esc=1
  if key_down_code=ctfg then tfg=1
  if key_down_code=ctfd then tfd=1
  off_key_down 0
return


t2:
  if key_up_code=cesc then esc=0
  if key_up_code=ctfg then tfg=0
  if key_up_code=ctfd then tfd=0
  off_key_up 0
return

boucle:
timer_off Boucle%      : ' On coupe le timer le temps de traiter la boucle principale du jeu

 if esc=1 then quitte()  : ' On sort si on a appuyé sur la touche 'Esc'
 
  ' Si on a détecté que la touche flèche gauche avait été enfoncée
  if tfg=1 and tfd = 0
    if x_r > (largeur_bord% + v_raquette) then x_r = x_r - v_raquette : else : x_r = largeur_bord%
  end_if

  ' Si on a détecté que la touche flèche droite avait été enfoncée
  if tfd=1 and tfg = 0
    if x_r < l-(largeur_bord% + v_raquette) then x_r = x_r + v_raquette : else : x_r = l-largeur_bord%
  end_if

'  res% = dll_call4("ChangeSpritePositionInScene2D",SC2D%,ind%,x%,y%)
'
' Paramètres :
' SC2D%      identifiant du Scene2D
' ind%      identifiant du Sprite  (0=sprite sélectionné; >0=sprite ind%)
' x%,y%      nouvelle position du Sprite
' res%      ( -1 si Scene2D non définie ou invalide; -2 si erreur; -3 si collision bloquante (position du sprite inchangée); 0 si ok)

  res% =  dll_call4("ChangeSpritePositionInScene2D",SC2D%,num_spr_raquette,x_r , y_r)

  ' On n'oublie pas de remettre en route le timer qui redéclenchera la boucle principale
on_key_down 0,t1 : on_key_up 0,t2
timer_on Boucle%
return

sub lance_balle()
          dx% = v_x_balle% : dy% = 0 - v_y_balle%
          x_balle = l/2 : y_balle = y_r - 60
          play son_nouvelleballe : wait 1000
          num_spr_balle =  dll_call6("CreateSpriteInScene2D",SC2D%,x_balle , y_balle,0,50,adr(balle$))
         
' res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,ind%,act%,par1%,par2%,ms%)
' Paramètres :
'        SC2D%  identifiant du Scene2D
'        ind%    identifiant du Sprite(0=sprite sélectionné  >0=sprite ind%)
'        act%
'            code action:
'                0 = stopper l'action en cours
'                1 = déplacer le sprite de façon relative: dx=par1%, dy=par2%, répéter toutes les ms% millisecondes
'                    arrêt automatique sur tout contact ou en "sortie du monde"
'                2 = déplacer le sprite de façon relative: dx=par1%, dy=par2%, répéter toutes les ms% millisecondes
'                    arrêt automatique sur tout contact bloquant ou en "sortie du monde"
'      par1%,par2%  paramètres en fonction du code action
'      ms%      nombre de millisecondes entre chaque répétition
'      res%      (-1 si erreur;  longueur de tableau si x%=0;  0 si ok)

          res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20)
'          res% = dll_call1("PlayMultiPlayer",MP%)
end_sub


sub Nouveau_Niveau()
Sprites_briques = 0
timer_off Boucle%
off_change 98
caption 0, titre$ + "    Vies : " + str$(vies) + "    Score : " + str$(score)
for i = 1 to nb_lignes
  for j = 1 to nb_b_ligne

    if 1=0
    ' res% = dll_call6("CreateSpriteInScene2D",SC2D%, x%,y%,niv%,resist%, adr(img$))
    ' Paramètres:
    '   SC2D%   identifiant de l'objet
    '   x%,y%      coin en haut à gauche du sprite
    '   niv%      (pas encore géré, mais obligatoire - passer un 0)
    '   resist%      résistance à la pénétration (0=immatériel  >0 augmente la résitance)
    '   img$      image BMP du sprite
    'Retour:
    '   res%      -1=erreur  >=0 = ok  ID du sprite créé
    end_if

    select i
      case 1 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (hauteur_b +1),0,50,adr(brique1$))
      case 2 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (2 * (hauteur_b +1)),0,50,adr(brique2$)) : Nb_points_brique$ = "250"
      case 3 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (3 * (hauteur_b +1)),0,50,adr(brique3$)) : Nb_points_brique$ = "200"
      case 4 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (4 * (hauteur_b +1)),0,50,adr(brique4$)) : Nb_points_brique$ = "175"
      case 5 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (5 * (hauteur_b +1)),0,50,adr(brique5$)) : Nb_points_brique$ = "140"
      case 6 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (6 * (hauteur_b +1)),0,50,adr(brique6$)) : Nb_points_brique$ = "120"
      case 7 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (7 * (hauteur_b +1)),0,50,adr(brique7$)) : Nb_points_brique$ = "100"
    end_select

    N = res% :  Sprites_briques = Sprites_briques + 1

'    res% = dll_call3("SetTextOfSpriteInScene2D",SC2D%,ind%,adr(txt$))
'
' Paramètres:
' SC2D%      identifiant du Scene2D
' ind%        Sprite identifyer (0=selected sprite; >0=sprite ind%)
' txt$        chaîne de caractères recevant le texte libre
' res%        -1 si erreur; 0 si ok

    res% = dll_call3("SetTextOfSpriteInScene2D",SC2D%,N,adr(Nb_points_brique$))

    if 1=0
    ' res% = dll_call6("ChangeSpriteAttributesInScene2D",SC2D%,ind%,vis%,sel%,mov%,ord%)
    '
    ' Paramètres:
    '
    '   SC2D%   identifiant de l'objet
    '   ind%      indice du sprite  0=sprite sélectionné  >0=sprite ind%
    '            -1=tous les sprites, pour vis%, sel% et mov%
    '   vis%      visibilité  (1=visible  0=invisible)
    '   sel%      sélectionnable  (1=sélectionnable  0=non sélectionnable)
    '   mov%      déplaçable par la souris  (1=déplaçable  0=non déplaçable)
    '   ord%      ordre Z (0=pas de changement  1=en avant  -1=en arrière)
    ' Retour:
    '   res%      -1=Scene2D non défini ou invalide  -2=erreur  0=ok
    end_if
   
    res% = dll_call6("ChangeSpriteAttributesInScene2D",SC2D%,res%,1,0,0,0)
  next j
next i
on_change 98,event
timer_on Boucle%
end_sub

sub quitte()
    res% = dll_call1("KillProcessByHandle",handle(0))
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Dim 22 Mai 2016 - 20:15

Citation :
Il y a une erreur dans la doc.chm (au minimum sur celle en ligne, je n'ai pas vérifier les autres)
En effet. La doc est incomplète, et le programme comporte une erreur, par-dessus le marché. Je corrigerai les deux pour la prochaine version.
Le problème de doc:
Les cellules 3,4,5,et 6 reflètent les informations du dernier élément cliqué (sélectionné). Si c'est un sprite, alors ce sont celles du sprite. Si c'est le fond, alors ce sont celles du viewport.
Le bug:
en cas de sprite sélectionné, les cellules 3 et 4 ne donnent pas la position du sprite, mais celle du clic dans le sprite, rapporté au viewport. Ceci est évidemment un non-sens, même si techniquement, j'ai besoin de cette information en interne.

En ce qui concerne ton dernier poste au sujet des timers, je regarderai cela prochainement. Ce week-end, j'étais complètement absorbé pour raisons familiales.

EDIT

Erreur d'appréciation sur le "bug":
Le bug n'en est pas un... En cas de clic sur un sprite, on retourne réellement les coordonnées du sprite, pas celles du dernier clic. Ceci est vrai pour le clic dans le fond (et là, ça fait sens). Mais pour un sprite, on retourne dans les mots 3 et 4 ma position du sprite clique. Ce qui est correct.

Donc, j'ai la doc à compléter, et ce sera fait prochainement.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Lun 23 Mai 2016 - 10:03

Sinon pour le problème de programme, je pense qu'il doit quand même y avoir un problème de gestion des timers ou de conflit entre les timers du programme et de kgf pour les objets 2D.

Pour m'en assurer, j'ai modifié la version précédente en retirant la boucle faisant appel au timer et là je n'ais plus de problème de pointeur. Donc soit j'ai fait une bêtise dans ma boucle (ce qui entre parenthèse est absolument possible), soit l'utilisation de ce timer bien qu'arrêté lors du traitement, provoque un conflit avec ceux utilisé pour la gestion des objets 2D de KGF.

Je mets ici la version sans musique ni timer du programme:
Code:
' Panorabrique V3 par Jicehel
'
' Version utilisant les objets sprites et scene2D de KGF sans timer

label event,touche

dim sversion$, iversion%: sversion$ = string$(255," ")
dim res%, SC2D%, SC2D_PS%, dx%, dy%, hnd%, MP%
dim h,l : h=700: l=1000
dim hauteur_b, largeur_b : hauteur_b = 30 : largeur_b=60
dim c, xb, yb, i, j, r , N, n_picture
dim Nb_b_ligne : Nb_b_ligne = int((l - 80)/(largeur_b+3))
dim Nb_lignes, Nb_briques_restantes, Sprites_briques : Nb_lignes = 7
dim x_r , y_r, hauteur_r, largeur_r, num_spr_raquette, v_raquette : hauteur_r = 30 : largeur_r=120 : y_r = h-30-hauteur_r : v_raquette = 25
dim vies : vies = 3
dim x_balle,y_balle, n_balle, num_spr_balle, r_balle : r_balle = 15
dim score : score = 0
dim ecran%, aff_vies%, aff_score%
dim Nb_couleur%: Nb_couleur% = 6
dim num_bord_gauche%,num_bord_haut%, num_bord_droit%, largeur_bord% : largeur_bord% = 40
dim Boucle% : Boucle% = 6

' ***************************** COMMANDES CLAVIER *************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC" ==> MET FIN AU PROGRAMME:.. 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> ALLER À GAUCHE:....... 37  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> ALLER À DROITE:....... 39  *

dim son_perdu : son_perdu = 20 : sound son_perdu : file_load son_perdu,"Perte_balle.wav"
dim son_gameover : son_gameover = 21 : sound son_gameover : file_load son_gameover,"Perdu.wav"
dim son_nouvelleballe : son_nouvelleballe = 22 : sound son_nouvelleballe : file_load son_nouvelleballe,"Nouvelle_balle.wav"
dim son_rebondmetal : son_rebondmetal = 23 : sound son_rebondmetal : file_load son_rebondmetal, "Rebond_bord_metal.mp3"
dim son_rebondraquette : son_rebondraquette = 24 : sound son_rebondraquette : file_load son_rebondraquette, "Rebond_raquette.mp3"
dim son_cassebrique : son_cassebrique = 25 : sound son_cassebrique : file_load son_cassebrique, "Brique_cassee.wav"
dim son_musique$ : son_musique$ = "Musique1.wav"

height 0, h+62: width 0,l+37 : caption 0, "PANORABRIQUE - V3.0" : border_small 0

dll_on "KGF.dll"

dim brique1$ : brique1$ = "b01_2.bmp"  : dim brique2$ : brique2$ = "b02_2.bmp"      : dim brique3$ : brique3$ = "b03_2.bmp"
dim brique4$ : brique4$ = "b04_2.bmp"  : dim brique5$ : brique5$ = "b05_2.bmp"        : dim brique6$ : brique6$ = "b06_2.bmp"
dim brique7$ : brique7$ = "b07_2.bmp"  : dim raquette$ : raquette$ = "raquette_2.bmp" : dim balle$ : balle$ = "balle2.bmp"
dim barre_haut$ :  barre_haut$ = "barre_haut.bmp"    : dim barre_cote$ :  barre_cote$ = "barre_cote.bmp" : dim fond$ : fond$ = "fond01.jpg"

SC2D% = dll_call2("CreateScene2D",handle(0),0)

if 1 = 0
' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,x%)
' Paramètres:
'    SC2D%   identifiant de l'objet
'   x%      0  pour récupérer la longueur du tableau interface%
'         adr(interface%)  pour établir le lien avec l'objet
' Retour:
'   res%      -1=erreur  0=ok
'                                    ou n>0 si x%=0: retourne alors la longueur du tableau interface%
' Utilisation:
'    res% = dll_call2("SetInterfaceOfScene2D",SC2D%,0)
'   dim interface%(res%)
'    interface%(0) = res%
'   interface%(1) = handle(edit%)
'    res% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(interface%))
' Signification des cellules de l'interface:
'    offset  signification
'    0        taille du tableau      (doit être chargé avant d'établir le lien)
'    1        handle d'un EDIT        (doit être chargé pour recevoir les évènements)
'    2        ID du sprite sélectionné
'    3        x (position horizontale du coin en haut à gauche du sprite)
'    4        y (position verticale du coin en haut à gauche du sprite)
'    5        w (largeur du sprite)
'    6        h (hauteur du sprite)
'    7        ID du sprite collisionné
'    8        numéro de la zone de contact collisionné dans le sprite collisionné
'    9        flag "utilisation du viewport"
'    10      flag "déplacement du viewport par la souris est autorisé"
'    11      coordonnée x du viewport
'    12      coordonnée y du viewport
'    13      indice de l'image dans l'ImageList (-1 = ImageList non utilisée)
'    14      code action du sprite causant l'évènement
'    15      fréquence d'action du sprite causant l'évènement (ou 0 si pas d'action en cours)
'    16      type d'évènement:  0=normal  1=collision  2=contact bordure  3=téléporté
'    17      bordure pour type évènement 2 et 3:  1=gauche  2=haut  3=droite  4=ba
end_if
edit  98 : hide 98 : on_change 98,event
SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,0)
dim SC2D_Panoramic%(SC2D_PS%)
SC2D_Panoramic%(0) = SC2D_PS%
SC2D_Panoramic%(1) = handle(98)
SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(SC2D_Panoramic%))
res% = dll_call6("ResizeScene2D",SC2D%,10,10,l,h,1)
res% = dll_call4("LoadMosaicBackgroundToScene2D",SC2D%,100,100,adr(fond$))
x_r = l/2
num_spr_raquette =  dll_call6("CreateSpriteInScene2D",SC2D%,x_r , y_r,0,50,adr(raquette$))
num_bord_gauche% = dll_call6("CreateSpriteInScene2D",SC2D%,0 , 40,0,50,adr(barre_cote$))
num_bord_haut%=    dll_call6("CreateSpriteInScene2D",SC2D%,0 , 0,0,50,adr(barre_haut$))
num_bord_droit% =  dll_call6("CreateSpriteInScene2D",SC2D%,960 , 40,0,50,adr(barre_cote$))
Nouveau_Niveau()
  on_key_down 0,touche : ' On détecte le changement d'état des touches
end


' ====================================== Capture et traitement des évènements:
event:
  ' caption 0,text$(98) + "    : " +str$(  SC2D_Panoramic%(2))  + "    : " +str$( num_spr_balle)+ "    : " +str$(  SC2D_Panoramic%(16))
  if text$(98)="status"
' Si contact avec le bord de l'écran
  if SC2D_Panoramic%(2) = num_spr_balle
    if SC2D_Panoramic%(16)= 1

      if SC2D_Panoramic%(7) = num_bord_gauche% or SC2D_Panoramic%(7) = num_bord_droit%
        play son_rebondmetal : dx% = 0 - dx%
      else
        if SC2D_Panoramic%(7) = num_bord_haut%
            play son_rebondmetal :dy% = 0 - dy%
        else
          if SC2D_Panoramic%(7) = num_spr_raquette
              play son_rebondraquette :dy% = 0 - dy%
          else
              play son_cassebrique : res% = dll_call2("DeleteSpriteInScene2D",SC2D%,SC2D_Panoramic%(7))
              dy% = 0 - dy%
              Sprites_briques = Sprites_briques - 1
              if Sprites_briques = 0 then Nouveau_Niveau()
          end_if
        end_if
      end_if
    end_if
    if SC2D_Panoramic%(16)=2
      select SC2D_Panoramic%(17)
        case 4: ' bas
          res% = dll_call1("StopMultiPlayer",MP%)
          vies = vies - 1 : play son_perdu
          tfg= 0 : tfd=0
'        res% = dll_call2("DeleteSpriteInScene2D",SC2D%,ind%)
'
' Paramètres:
'        SC2D%  identifiant du Scene2D
'        ind%  identifiant du Sprite (0=sprite sélectionné  >0=sprite ind%)
'        res%  (-1 si Scene2D non définie ou invalide; -2 si erreur ou sprite inexistant; 0 si ok)

          res% = dll_call2("DeleteSpriteInScene2D",SC2D%,num_spr_balle) : wait 1500
          if vies > 0 then lance_balle() : else: play son_gameover : wait 3000 : quitte()
      end_select
    end_if
  end_if
 end_if

 res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20)

return

' ====================================== Traitement des appuis sur le clavier:

touche:
  if key_down_code=cesc then quitte()  : ' On sort si on a appuyé sur la touche 'Esc'
  if key_down_code=ctfg  :  ' Si on a détecté que la touche flèche gauche avait été enfoncée
      if x_r > (largeur_bord% + v_raquette) then x_r = x_r - v_raquette : else : x_r = largeur_bord%
  end_if
  if key_down_code=ctfd  :  ' Si on a détecté que la touche flèche droite avait été enfoncée
      if x_r < l-(largeur_bord% + v_raquette) then x_r = x_r + v_raquette : else : x_r = l-largeur_bord%
  end_if
  res% =  dll_call4("ChangeSpritePositionInScene2D",SC2D%,num_spr_raquette,x_r , y_r)
return


sub lance_balle()
          dx% = 10 : dy% = 0 - 10
          x_balle = l/2 : y_balle = y_r - 60
          play son_nouvelleballe : wait 1000
          num_spr_balle =  dll_call6("CreateSpriteInScene2D",SC2D%,x_balle , y_balle,0,50,adr(balle$))
          res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20)
          res% = dll_call1("PlayMultiPlayer",MP%)
end_sub

sub Nouveau_Niveau()

Sprites_briques = 0
for i = 1 to nb_lignes
  for j = 1 to nb_b_ligne
    select i
      case 1 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (hauteur_b +1),0,50,adr(brique1$))
      case 2 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (2 * (hauteur_b +1)),0,50,adr(brique2$))
      case 3 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (3 * (hauteur_b +1)),0,50,adr(brique3$))
      case 4 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (4 * (hauteur_b +1)),0,50,adr(brique4$))
      case 5 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (5 * (hauteur_b +1)),0,50,adr(brique5$))
      case 6 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (6 * (hauteur_b +1)),0,50,adr(brique6$))
      case 7 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (7 * (hauteur_b +1)),0,50,adr(brique7$))
    end_select
   
    Sprites_briques = Sprites_briques + 1
    res% = dll_call6("ChangeSpriteAttributesInScene2D",SC2D%,res%,1,0,0,0)
  next j
next i

lance_balle()
end_sub

sub quitte()
    res% = dll_call1("KillProcessByHandle",handle(0))
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Lun 23 Mai 2016 - 10:21

Je n'ai pas encore eu le temps de me plonger vraiment sans ton code. Mais à première vue, je ne comprends pas pourquoi tu utilises une action automatique pour la balle et en même temps un timer pour une "boucle". Cela fait double emploi et crée forcément des conflits. Et il ne sert à tien d'inactiver le ON_CHANGE du edit 98 - les évènements du Scene2D passent simplement à la trappe, mais l'action elle-même continue.

Il faut que tu utilises uniquement les évènements reçus par le edit 98, il faut déduire la nature de l'évènement des valeurs de l'interface et réagir en fonction de cela. En fait, ton programme deviendra encore plus simple.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Lun 23 Mai 2016 - 13:16

En fait du coup un événement de l'édit 98 pourrait être une sorte de tick de timer (pour éviter d'utiliser le timer Panoramic)

On fixerait le timer et tout les x ms on recevrait l'événement disant que le temps s'est écoulé (en fait s'est pour permettre de synchroniser les actions et d'avoir une vitesse de jeu constante pour les déplacement de la raquette par exemple. Si je reste comme dans l'exemple ci dessus, le nombre de déplacement de la raquette dépend de la vitesse de l'ordinateur, mais ce serait encore plus vrai avec des système de jeux plus complexes ou on a besoin de synchroniser les événements du jeu avec la logique du jeu)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Lun 23 Mai 2016 - 13:27

Si tu utilises les déplacements automatiques des sprites, la notion de "ticks" n'a plus de sens. Du moins pas pour la gestion des sprites se mouvant automatiquement. Ils sont entièrement gérés en interne par l'objet Scene2D qui ne fait que signaler les collisions avec un autre sprite ou avec une bordure.

Tu peux utiliser un timer Panoramic pour gérer autre chose, sans rapport direct avec les sprites en mouvement automatique. Sinon, tu produits un sac de noeuds épouvantable.

Sans avoir approfondo ton source, comment déplaces-tu la raquette ? Avec la souris, je suppose ? Si ce n'est pas le cas, essaie - ce sera une nouvelle expérience de jeu.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Lun 23 Mai 2016 - 15:18

Si tu regardes mon code (pas le dernier mais celui d'avant), la boucle ne (le timer) sert qu'à contrôler la raquette qui n'est pas en déplacement automatique. Ca n'aurait en effet aucun sens de contrôler la balle via un timer dans Panoramic.

Et ça marchait bien jusqu'au changement de niveau où j'avais un problème de pointeur.
En faisant des tests divers, j'ai vu que l'on avait assez facilement des problèmes de pointeur en combinant un timer Panoramic et les déplacements automatiques. Par contre c'est un peu aléatoire, chez moi, ça c'est surtout produit quand ma machine avait des ralentissements ou lors du changement de niveau.

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   Lun 23 Mai 2016 - 16:29

Ok, je vais regarder ton premier code un peu plus en profondeur, ce soir.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Début d'un nouveau système de 2D et Sprites   

Revenir en haut Aller en bas
 
Début d'un nouveau système de 2D et Sprites
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 3 sur 3Aller à la page : Précédent  1, 2, 3
 Sujets similaires
-
» OS X Mavericks : voici le nouveau système des Mac
» Nouveau système de configuration en ligne
» Mazda "i-ELOOP": nouveau système de récupération d'énergie au freinage
» Accordéon nouveau système MIDI pour arrangeur et expandeur
» Nouveau virus : Win32.Induc.A. Surveillez vos logiciels !

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: