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
» PanExpress : l'éditeur Panoramic avec création d'objet
par Jean Claude Aujourd'hui à 8:06 pm

» Projet de planétarium virtuel.
par Pedro Alvarez Aujourd'hui à 4:46 pm

» Quantité de mémoire utilisée par un exe
par Jack Aujourd'hui à 4:39 pm

» Problème avec 'file_load'.
par Pedro Alvarez Hier à 8:12 am

» Version instantanée V 0.9.28i20 du 13/06/2018
par jjn4 Sam 16 Juin 2018, 2:25 pm

» string$(0,chr$(32)) sans erreur
par silverman Ven 15 Juin 2018, 7:56 pm

» Version instantanée V 0.9.28i19 du 13/06/2018
par Minibug Ven 15 Juin 2018, 7:14 pm

» Mes souhaits d'amélioration de Panoramic.
par Pedro Alvarez Jeu 14 Juin 2018, 8:17 pm

» [RÉSOLU] Message d'erreur impossible à indentifier
par Minibug Mer 13 Juin 2018, 8:52 pm

» Cadre pour image
par Jean Claude Mar 12 Juin 2018, 4:31 pm

» Créateur d'objets Panoramic
par Minibug Mar 12 Juin 2018, 2:02 pm

» Planétarium gratuit.
par Jean Claude Sam 09 Juin 2018, 6:50 pm

» Comment afficher une image sans fond.
par JL35 Sam 09 Juin 2018, 2:16 pm

» image_width(n) et image_height(n)
par silverman Sam 09 Juin 2018, 11:22 am

» Site sur la programmation sympa
par Jean Claude Jeu 07 Juin 2018, 11:20 am

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2018
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 Générateur / editeur de donjon (les débuts)

Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Générateur / editeur de donjon (les débuts)   Sam 26 Nov 2011, 2:35 pm

Bon, je repars de la base du programme de bignono pour faire mon propre truc.

Bignono, peux-tu me corriger mon prog ? je merdouille un peu dans la reprise de l'algorithme / tracé du laby (la partie que tu avais faites)

Code:
DIM Chemin$ : Chemin$ = "C:\temp"  : ' Chemin de base du programme
DIM Max_cases_X, Max_cases_Y, Nb_cases_X, Nb_Cases_Y: ' Fixe la taille du labyrinthe
Max_cases_X = 4: Max_cases_Y = 4: ' Initialisation des valeurs maximales
DIM NbCases, d : d=1
Dim i,j,k,r,s : ' Compteurs temporaires
' h => Nb_cases_X et v => Nb_cases_Y
Nb_cases_X = Max_cases_X : Nb_cases_Y = Max_cases_Y : NbCases = Nb_cases_X * Nb_cases_Y
DIM T_Cases(Nb_cases_X+1, Nb_cases_Y+1), mur(Nb_cases_X+1, Nb_cases_Y+1)
DIM c(4), debug

label lab,r1,r6,r7,r8,r9,r10,r11
label trace,mur_gauche, mur_bas, mur_haut, mur_droit

debug = 1

width 0, 50 * (Nb_cases_X+2) : height 0, 50 * (Nb_cases_Y+2)

if Debug = 1
  Dim Text_debug$
  i = width(0) + left (0) + 10
  form 500: width 500, 250 : height 500, 230: top 500, 3  : left 500,i
  j = top(500) + height(500) + 10
  form 520: width 520, 250 : height 520, 230: top 520, j  : left 520,i : hide 520
  for i = 1 to 10
    alpha 500 + i: parent 500 + i,500: height 500 + i, 17 : top 500 + i, (17*i) - 14  : left 500 + i,3
  next i
  for i = 1 to 12
    alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
  next i
  caption 501,"Début du programme"
end_if
gosub lab
gosub trace
end



' GÉNÉRATION DU LABYRINTHE
lab:
' Initialise le côté
for j=1 to Nb_cases_Y
T_Cases(0,j)=4 : ' Initialise la valeur pour le coté gauche (mur à droite de la case)
T_Cases(Nb_cases_X+1,j)=1 : ' Initialise la valeur pour le coté droit (mur à gauche de la case)
next j
for i=1 to Nb_cases_X
  T_Cases(i,Nb_cases_Y+1)=8 : ' Initialise la valeur pour le coté bas (mur à haut de la case)
  T_Cases(i,0)=2            : ' Initialise la valeur pour le coté haut (mur à bas de la case)
for j=1 to Nb_cases_Y:T_cases(i,j)=15:next j :' Rempli le labyrinthe avec des cases fermée
next i
r =int(Nb_cases_X/2+1): s =int(Nb_cases_Y/2+1)

for k=1 to (NbCases - 1)

r1:
  i=0
  if T_Cases(r-1, s )=15 then i=i+1 : c(i)=1
  if T_Cases(r,  s-1)=15 then i=i+1 : c(i)=2
  if T_Cases(r+1, s )=15 then i=i+1 : c(i)=3
  if T_Cases(r,  s+1)=15 then i=i+1 : c(i)=4
  if i=0 then goto r6
  if i<>1 then i=int(rnd(i)+1)
  select c(i)
      case 1 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s))  -int(int(T_Cases(r,s))/2)*2)    :r=r-1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/4)-int(int(T_Cases(r,s)/4)/2)*2)*4
      case 2 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/8)-int(int(T_Cases(r,s)/8)/2)*2)*8:s=s-1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/2)-int(int(T_Cases(r,s)/2)/2)*2)*2
      case 3 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/4)-int(int(T_Cases(r,s)/4)/2)*2)*4:r=r+1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s))  -int(int(T_Cases(r,s))/2)*2)
      case 4 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/2)-int(int(T_Cases(r,s)/2)/2)*2)*2:s=s+1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/8)-int(int(T_Cases(r,s)/8)/2)*2)*8
  end_select

if Debug = 1
  caption 501,"Boucle R1;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s))+ "              "
  caption 502,"NbCases = " + str$(NbCases) + "  ; k = " + str$(k) + "      "
  wait 20
end_if

  goto r11

r6:
  if d=-1 then goto r7
  if r<>Nb_cases_X then goto r9
  if s<>Nb_cases_Y then goto r8
  r=1:s=1:goto r10

  if Debug = 1
    caption 501,"Boucle R6;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s))+ "              "
    caption 502,"NbCases = " + str$(NbCases) + "  ; k = " + str$(k) + "      "
  wait 20
  end_if

r7:
  if r<>1 then goto r9
  if s<>Nb_cases_Y then goto r8
  r=Nb_cases_Y:s=1: goto r10
r8:
  s=s+1:d=-1*d:goto r10
r9:
  r=r+d
r10:
  if T_Cases(r,s)=15 then goto r6

  if Debug = 1
    caption 501,"Boucle R10;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s)) + "            "
    caption 502,"NbCases = " + str$(NbCases) + "  ; k = " + str$(k)  + "      "
    wait 20
  end_if
  goto r1

r11:
  mur(r,s)=int(rnd(6)+1)
  if mur(r,s)=mur(r-1,s) or mur(r,s)=mur(r+1,s) or mur(r,s)=mur(r,s-1) or mur(r,s)=mur(r,s+1) then goto r11

if Debug = 1
  show 520

  for j=0 to Nb_cases_Y+1
    Text_debug$ = "!"
    for i=0 to Nb_cases_X+1
      Text_debug$ = Text_debug$ + right$("00"+str$(t_cases(i,j)),2)+"!"
    next i
    caption 521+j, Text_debug$
  next j

  caption 501,"Boucle R11;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s)) + "            "
  wait 20
end_if

next k

return

' TRACÉ DU LABYRINTHE DE COULEUR BLEU
trace:

if Debug = 1
  caption 501,"Boucle TRACE                                          "
end_if

2d_pen_color 0,0,192:2d_pen_width 3
for j=1 to Nb_cases_Y
  for i=1 to Nb_cases_X
    select T_Cases(i,j)
      case 1 : gosub mur_gauche                                      : ' mur de gauche (G)
      case 2 : gosub mur_bas                                          : ' mur du bas    (B)
      case 3 : gosub mur_gauche : gosub mur_bas                      : ' murs G+B
      case 4 : gosub mur_droit                                        : ' mur de droite (D)
      case 5 : gosub mur_gauche : gosub mur_droit                    : ' murs G+D
      case 6 : gosub mur_bas    : gosub mur_droit                    : ' murs B+D
      case 7 : gosub mur_gauche : gosub mur_bas    : gosub mur_droit  : ' murs G+B+D (u)
      case 8 : gosub mur_haut                                        : ' mur du haut  (H)
      case 9 : gosub mur_gauche : gosub mur_haut                      : ' murs G+H
      case 10: gosub mur_bas    : gosub mur_haut                      : ' murs B+H
      case 11: gosub mur_gauche : gosub mur_bas    : gosub mur_haut  : ' murs G+B+H ([)
      case 12: gosub mur_droit  : gosub mur_haut                      : ' murs D+H
      case 13: gosub mur_gauche : gosub mur_droit  : gosub mur_haut  : ' murs G+D+H (n)
      case 14: gosub mur_bas    : gosub mur_droit  : gosub mur_haut  : ' murs B+D+H (])
    end_select
  next i
next j
return

mur_gauche:
  2d_line  i  *50,(j-1)*50, i  *50, j    *50
return

mur_bas:
  2d_line  i  *50,(j-1)*50,(i+1)*50,(j-1) *50
return

mur_droit:
  2d_line (i+1)*50,(j-1)*50,(i+1)*50,  j  *50
return

mur_haut:
  2d_line  i  *50, j  *50,(i+1)*50,  j  *50
return


Dernière édition par Jicehel le Sam 26 Nov 2011, 5:42 pm, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Sam 26 Nov 2011, 4:41 pm

Bon, bignono, si tu as le temps de jeter un œil sur le début du programme, je suis preneur ... ce n'est pas la partie sur laquelle je maitrise le mieux et en plus c'est l'heure du café avec ma femme Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1127
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Sam 26 Nov 2011, 6:14 pm

Bonjour Jicehel

J'ai regardé vite fait ton prog bien que je n'ai pas beaucoup de temps aujourd'hui.
A priori tu as oublié 2 choses. Je te les ai indiquées dans le code que je te renvoie, et j'ai renommé les r6 à r11 en r2 à r7, comme ça, ça se suit!

J'ai pas eu le temps de regarder le tracé, mais maintenant tu sors des boucles et tu arrives à la routine trace.
A toi maintenant.
Code:
DIM Chemin$ : Chemin$ = "C:\temp"  : ' Chemin de base du programme
DIM Max_cases_X, Max_cases_Y, Nb_cases_X, Nb_Cases_Y: ' Fixe la taille du labyrinthe
Max_cases_X = 10 : Max_cases_Y = 10 : ' Initialisation des valeurs maximales
DIM NbCases, d : d=1
Dim i,j,k,r,s : ' Compteurs temporaires
' h => Nb_cases_X et v => Nb_cases_Y
Nb_cases_X = Max_cases_X : Nb_cases_Y = Max_cases_Y : NbCases = (Nb_cases_X * Nb_cases_Y)-1
Nb_cases_X = Nb_cases_X + 1:Nb_cases_Y = Nb_cases_Y + 1 :' <------------------------------------- tu as oublié ceci ********************!!!!!!!!!!!!!
DIM T_Cases(Nb_cases_X+1, Nb_cases_Y+1), mur(Nb_cases_X+1, Nb_cases_Y+1)
DIM c(4), debug

' label cpos1,cpos2,debut,jeu,lab,termine,trace
label lab,r1,r2,r3,r4,r5,r6,r7
label trace

debug = 1

if Debug = 1
  Dim Text_debug$
  form 500: width 500, 250 : height 500, 230: top 500, 3  : left 500,3
  form 520: width 520, 250 : height 520, 230: top 500, 3  : left 500,260 : hide 520
  for i = 1 to 10
    alpha 500 + i: parent 500 + i,500: height 500 + i, 17 : top 500 + i, (17*i) - 14  : left 500 + i,3
  next i
  for i = 1 to 12
    alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
  next i
  caption 501,"Début du programme"
end_if
gosub lab
gosub trace
end

' GÉNÉRATION DU LABYRINTHE
lab:
' Initialise le côté
for j=0 to Nb_cases_Y
T_Cases(0,j)=4 : ' Initialise la valeur pour le coté gauche (mur à droite de la case)
T_Cases(Nb_cases_X+1,j)=1 : ' Initialise la valeur pour le coté droit (mur à gauche de la case)
next j
for i=1 to Nb_cases_X
  T_Cases(i,Nb_cases_Y+1)=8 : ' Initialise la valeur pour le coté bas (mur à haut de la case)
  T_Cases(i,0)=2            : ' Initialise la valeur pour le coté haut (mur à bas de la case)
for j=2 to Nb_cases_Y:T_Cases(i,j)=15:next j :' Rempli le labyrinthe avec des cases fermée
next i
r =int(Nb_cases_X/2+1): s =int(Nb_cases_Y/2+1)

T_Cases(r,s)=15:' <------------------------------------- tu as oublié ceci aussi ***************!!!!!!!!!!!!!

for k=1 to NbCases

r1:
  i=0
  if T_Cases(r-1, s  )=15 then i=i+1 : c(i)=1
  if T_Cases(r,  s-1)=15 then i=i+1 : c(i)=2
  if T_Cases(r+1, s  )=15 then i=i+1 : c(i)=3
  if T_Cases(r,  s+1)=15 then i=i+1 : c(i)=4
  if i=0 then goto r2
  if i<>1 then i=int(rnd(i)+1)
  select c(i)
      case 1 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s))  -int(int(T_Cases(r,s))/2)*2)    :r=r-1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/4)-int(int(T_Cases(r,s)/4)/2)*2)*4
      case 2 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/8)-int(int(T_Cases(r,s)/8)/2)*2)*8:s=s-1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/2)-int(int(T_Cases(r,s)/2)/2)*2)*2
      case 3 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/4)-int(int(T_Cases(r,s)/4)/2)*2)*4:r=r+1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s))  -int(int(T_Cases(r,s))/2)*2)
      case 4 : T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/2)-int(int(T_Cases(r,s)/2)/2)*2)*2:s=s+1:T_Cases(r,s)=T_Cases(r,s)-(int(T_Cases(r,s)/8)-int(int(T_Cases(r,s)/8)/2)*2)*8
  end_select

if Debug = 1
  caption 501,"Boucle R1;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s))+ "              "
  caption 502,"NbCases = " + str$(NbCases) + "  ; k = " + str$(k) + "      "
  wait 20
end_if

  goto r7

r2:
  if d=-1 then goto r3
  if r<>Nb_cases_X then goto r5
  if s<>Nb_cases_Y then goto r4
  r=1:s=1:goto r6

  if Debug = 1
    caption 501,"Boucle r2;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s))+ "              "
    caption 502,"NbCases = " + str$(NbCases) + "  ; k = " + str$(k) + "      "
  wait 20
  end_if

r3:
  if r<>1 then goto r5
  if s<>Nb_cases_Y then goto r4
  r=Nb_cases_X:s=1: goto r6
r4:
  s=s+1:d=-1*d:goto r6
r5:
  r=r+d
r6:
  if T_Cases(r,s)=15 then goto r2

  if Debug = 1
    caption 501,"Boucle r6;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s)) + "            "
    caption 502,"NbCases = " + str$(NbCases) + "  ; k = " + str$(k)  + "      "
    wait 20
  end_if
  goto r1

r7:
  mur(r,s)=int(rnd(6)+1)
  if mur(r,s)=mur(r-1,s) or mur(r,s)=mur(r+1,s) or mur(r,s)=mur(r,s-1) or mur(r,s)=mur(r,s+1) then goto r7

if Debug = 1
  show 520

  for j=0 to Nb_cases_Y+1
    Text_debug$ = "!"
    for i=0 to Nb_cases_X+1
      Text_debug$ = Text_debug$ + right$("00"+str$(mur(i,j)),2)+"!"
    next i
    caption 520+j, Text_debug$
  next j

  caption 501,"Boucle r7;  r = " + str$(r) +"  ; s = " + str$(s) +"  ; T_cases(r,s) = " + str$(T_cases(r,s)) + "            "
  wait 20
end_if

next k

return

' TRACÉ DU LABYRINTHE DE COULEUR BLEU
trace:
full_space 0
if Debug = 1
  caption 501,"Boucle TRACE                                          "
end_if

2d_pen_color 0,0,192:2d_pen_width 3
for j=2 to Nb_cases_Y
  for i=2 to Nb_cases_X
    select T_Cases(i,j)
      case 1 :2d_line i*50,j*50, i  *50,(j+1)*50
      case 2 :2d_line i*50,j*50,(i+1)*50, j  *50
      case 3 :2d_line i*50,j*50, i  *50,(j+1)*50 : 2d_line i*50,j*50,(i+1)*50, j  *50
'      case 4 :2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40
'      case 5 :2d_line ax(i,j),ay(i,j),ax(i,j),ay(i,j)+40:2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40
'      case 6 :2d_line ax(i,j),ay(i,j),ax(i,j)+50,ay(i,j):2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40
'      case 7 :2d_line ax(i,j),ay(i,j)+40,ax(i,j),ay(i,j):2d_line ax(i,j),ay(i,j),ax(i,j)+50,ay(i,j):2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40
'      case 8 :2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40
'      case 9 :2d_line ax(i,j),ay(i,j),ax(i,j),ay(i,j)+40:2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40
'      case 10:2d_line ax(i,j),ay(i,j),ax(i,j)+50,ay(i,j):2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40
'      case 11:2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40:2d_line ax(i,j),ay(i,j)+40,ax(i,j),ay(i,j):2d_line ax(i,j),ay(i,j),ax(i,j)+50,ay(i,j)
'      case 12:2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40:2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40
'      case 13:2d_line ax(i,j),ay(i,j),ax(i,j),ay(i,j)+40:2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40:2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40
'      case 14:2d_line ax(i,j),ay(i,j),ax(i,j)+50,ay(i,j):2d_line ax(i,j)+50,ay(i,j),ax(i,j)+50,ay(i,j)+40:2d_line ax(i,j),ay(i,j)+40,ax(i,j)+50,ay(i,j)+40
    end_select
  next i
next j
return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Sam 26 Nov 2011, 7:52 pm

Ben, je n'arrive pas à comprendre certains trucs, comme à quoi sert: la ligne que j'ai "oublié": T_Cases(r,s)=15: (por mo, la case a déja cete valeur par l'initialisation que l'on fait juste avant ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1127
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Sam 26 Nov 2011, 8:31 pm

Oups! effectivement, elle sert même à rien du tout confused ! mille excuses Embarassed . donc t'avais oublié qu'un seul truc.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Sam 26 Nov 2011, 9:37 pm

Pas de problème bignono, je reprend ton programme depuis le début mais en essayant vraiment de me l'accaparer à part la formule de calcul du labyrinthe que je n'ai pas compris, c'est pour ça que j'ai du mal à la debugger ..

mais bon, au pire, je reste comme ça, ça génère des murs, comme après dans ma version de tout façon, on doit l'éditer, ce n'est pas très grave
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Dim 27 Nov 2011, 2:04 am

Bon, j'ai bossé un peu sur mon éditeur, en fait j'ai changé un peu la façon de procéder.
Là, le programme n'est qu'un bout du programme, demain il faut que j'ajoute le menu en haut avec le menu fichier (ouvrir / enregistrer /nouveau / quitter) et le menu labyrinthe dans un premier temps, uniquement Vue 3D dedans.
Après, il faudrait pouvoir coder les portes (le plus joli effet serait un mur fixe avec une porte rotative comme dans le château de bignono mais ça je verrais après
Code:
DIM Chemin$ : Chemin$ = "C:\temp"  : ' Chemin de base du programme
DIM Max_cases_X, Max_cases_Y, Nb_cases_X, Nb_Cases_Y: ' Fixe la taille du labyrinthe
Max_cases_X = 6 : Max_cases_Y = 6 : ' Initialisation des valeurs maximales X=19 Y=17
DIM NbCases, d : d=1
DIM Dec_aff_X, Dec_aff_Y : Dec_aff_X = 35 : Dec_aff_Y = 35 : ' Correction pour l'affichage du plan (X et Y)
Dim i,j,k,l,r,s : ' Compteurs temporaires
' h => Nb_cases_X et v => Nb_cases_Y
Nb_cases_X = Max_cases_X : Nb_cases_Y = Max_cases_Y : NbCases = (Nb_cases_X * Nb_cases_Y)-1
DIM T_Cases(Nb_cases_X+1, Nb_cases_Y+1), mur(Nb_cases_X+1, Nb_cases_Y+1)
DIM c(4), debug

' label cpos1,cpos2,debut,jeu,lab,termine,trace
label lab,trace,mur_gauche, mur_bas, mur_haut, mur_droit, aff_souris
label clic_souris

debug = 2

width 0, 50 * (Nb_cases_X+1) : height 0, 50 * (Nb_cases_Y+1.5)

if Debug > 0
  i = width(0) + left (0) + 5
  form 500: width 500, 250 : height 500, 230: top 500, 3  : left 500,i
  if debug = 2 then j = top(500) + height(500) + 10 : form 520: width 520, 250 : height 520, (Nb_cases_Y+5) * 17: top 520, j  : left 520,i : hide 520
  for i = 1 to 10
    alpha 500 + i: parent 500 + i,500: height 500 + i, 17 : top 500 + i, (17*i) - 14  : left 500 + i,3
  next i
  if debug = 2
    Dim Text_debug$
    for i = 1 to Nb_cases_Y+2
      alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
    next i
  end_if
  caption 501,"Début du programme"
end_if
gosub lab
gosub trace
if Debug > 0 then timer 2:timer_interval 2,100:on_timer 2,aff_souris
on_click 0, clic_souris
end

' GÉNÉRATION DU LABYRINTHE
lab:
' Initialise le côté

for i=0 to Nb_cases_X+1
  if i> 0 and i< Nb_cases_X+1 then T_Cases(i,0)=8  : ' Initialise la valeur pour le coté haut (mur à bas de la case)
  for j=1 to Nb_cases_Y
    if i = 0
      T_Cases(0,j)=4 : ' Initialise la valeur pour le coté gauche (mur à droite de la case)
    else
      T_Cases(i,j) = int(rnd(16))
      if i=Nb_cases_X+1
        T_Cases(i,j)=1 : ' Initialise la valeur pour le coté droit (mur à gauche de la case)
      else
        if (bin_and(T_Cases(i,j-1),8)) > 0 then T_Cases(i,j)=bin_or(T_Cases(i,j),2)
        if (bin_and(T_Cases(i-1,j),4)) > 0 then T_Cases(i,j)=bin_or(T_Cases(i,j),1)
      end_if
    end_if
  next j : ' Rempli le labyrinthe avec des cases fermée
  if i> 0 and i< Nb_cases_X+1 then T_Cases(i,Nb_cases_Y+1)=2 : ' Initialise la valeur pour le coté bas (mur à haut de la case)
next i

return

' TRACÉ DU LABYRINTHE DE COULEUR BLEU
trace:
if Debug > 0
  caption 501,"Boucle TRACE                              "
end_if
if Debug > 1
  show 520
  for j=0 to Nb_cases_Y+1
    Text_debug$ = "!"
    for i=0 to Nb_cases_X+1
      Text_debug$ = Text_debug$ + right$("00"+str$(T_cases(i,j)),2)+"!"
    next i
    caption 521+j, Text_debug$
  next j
end_if
cls
2d_pen_width 12
for j=0 to Nb_cases_Y + 1
2d_pen_color odd(j)*150,0,50+j*5
  for i=0 to Nb_cases_X + 1
    2d_pen_color odd(j)*150,odd(i)*150,50+j*5
    select T_Cases(i,j)
      case 1 : gosub mur_gauche                                      : ' mur de gauche (G)
      case 2 : gosub mur_bas                                        : ' mur du bas    (B)
      case 3 : gosub mur_gauche : gosub mur_bas                      : ' murs G+B
      case 4 : gosub mur_droit                                      : ' mur de droite (D)
      case 5 : gosub mur_gauche : gosub mur_droit                    : ' murs G+D
      case 6 : gosub mur_bas    : gosub mur_droit                    : ' murs B+D
      case 7 : gosub mur_gauche : gosub mur_bas    : gosub mur_droit : ' murs G+B+D (u)
      case 8 : gosub mur_haut                                        : ' mur du haut  (H)
      case 9 : gosub mur_gauche : gosub mur_haut                    : ' murs G+H
      case 10: gosub mur_bas    : gosub mur_haut                    : ' murs B+H
      case 11: gosub mur_gauche : gosub mur_bas    : gosub mur_haut  : ' murs G+B+H ([)
      case 12: gosub mur_droit  : gosub mur_haut                    : ' murs D+H
      case 13: gosub mur_gauche : gosub mur_droit  : gosub mur_haut  : ' murs G+D+H (n)
      case 14: gosub mur_bas    : gosub mur_droit  : gosub mur_haut  : ' murs B+D+H (])
      case 15: gosub mur_gauche:gosub mur_bas:gosub mur_droit:gosub mur_haut: ' murs G+B+D+H([])
    end_select
  next i
  if debug > 2 then message "ligne = " + str$(j) + "  ; colonne = " + str$(i)
next j
return

mur_gauche:
  2d_line  i*50 -Dec_aff_X,j*50 -Dec_aff_Y, i*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y
return

mur_bas:
  2d_line  i*50 -Dec_aff_X,j*50 -Dec_aff_Y,(i+1)*50-Dec_aff_X,j*50 -Dec_aff_Y
return

mur_droit:
  2d_line (i+1)*50 -Dec_aff_X, j*50 -Dec_aff_Y,(i+1)*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y
return

mur_haut:
  2d_line  i*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y,(i+1)*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y
return

aff_souris:
 r=mouse_x_position(0):  s=mouse_y_position(0)
 caption 503, "Souris Pos_X = " + Str$(r) + "  Pos_y = " + Str$(s) + "      "

 s = s - (50 -(Dec_aff_Y + 5)) :  k = mod(s,50) : s=int(s / 50) + 1
 caption 504, "ligne selectionnée = " + str$(s) + "  : Y_case =  " + str$(K) + "    "
 
 r = r - (50 -(Dec_aff_X + 5)) :  k = mod(r,50) : r=int(r / 50) + 1
 caption 505, "colonne selectionnée = " + str$(r) + "  : X_case =  " + str$(K) + "    "
return

clic_souris:
 if debug > 1 then caption 501,"Traite clic": timer_off 2
 r=mouse_x_position(0):  s=mouse_y_position(0)
 s = s - (50 -(Dec_aff_Y + 5)) :  k = mod(s,50) : s=int(s / 50) + 1
 r = r - (50 -(Dec_aff_X + 5)) :  l = mod(r,50) : r=int(r / 50) + 1

 if k<10
    if s <1 or s > Nb_cases_Y
      ' On ne fait rien si on est dehors
    else
      if (bin_and(T_Cases(r,s),2)) > 0
        T_Cases(r,s) = T_Cases(r,s) - 2
        if bin_and(T_Cases(r,s-1),8) > 0 then T_Cases(r,s-1)=T_Cases(r,s-1)-8
      else
        T_Cases(r,s) = T_Cases(r,s) + 2
        if bin_and(T_Cases(r,s-1),8) = 0 then T_Cases(r,s-1)=T_Cases(r,s-1)+8
      end_if
    end_if
 end_if
 
 if l<10
    if r < 1 or r > Nb_cases_X
      ' On ne fait rien si on est dehors
    else
      if (bin_and(T_Cases(r,s),1)) > 0
        T_Cases(r,s) = T_Cases(r,s) - 1
        if bin_and(T_Cases(r-1,s),4) > 0 Then T_Cases(r-1,s)= T_Cases(r-1,s)-4
      else
        T_Cases(r,s) = T_Cases(r,s) + 1
        if bin_and(T_Cases(r-1,s),4) = 0 Then T_Cases(r-1,s)= T_Cases(r-1,s)+4
      end_if
    end_if
 end_if
 wait 200
 gosub trace
 timer_on 2
return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1127
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Dim 27 Nov 2011, 10:16 am

Bonjour, Jicehel et à tous les panoramiciens,

J'ai regardé un peu ton prog, mais je dois dire que je n'y comprend pas grand chose. C'est bien loin de mon générateur de labyrinthe. D'abord je comprend rien du tout à l'instruction Question bin_and et c'est pareil pour bin_or et bin_xor. Question Je ne comprend pas du tout comment elles fonctionnent, quels opérations faut-il faire pour savoir le résultat à l'avance qu'elles vont donner? Question Je me suis fait des tableaux de chaque instruction (ex: bin_and (i,j) avec i et j de 0 à 20) et les résultats qui en sortent sont surprenants. Quel logique là-dedans? affraid
Si quelqu'un peut m'expliquer ou me donner un lien vers une aide à ce sujet, je serais content. Merci d'avance.
Question Question Question
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Dim 27 Nov 2011, 11:02 am

Pas de problème, ces 3 instruction travaillent au niveau des bits d'un octet (le principe que tu utilises pour tes murs)
On a donc Bin_and(V1,V2) qui fait un et binaire, le résultat pour chaque bit suit la logique suivante
1 ET 1 => 1 => Les 2 sont vrai (1) => le résultat est vrai (1)
1 ET 0 => 0
0 ET 1 => 0 =>Si l'un des bit est à 0 (faux), le résultat est faux (0)
0 ET 0 => 0

donc Bin_and(4,1) vaut 0 et bin_and(5,1) vaut 1

Le Bin_or(v1,v2) c'est le ou binaire, si l'une des valeurs égale 1, le résultat vaut 1
1 ou 1 => 1
1 ou 0 => 1
0 ou 1 => 1
0 ou 0 => 0

donc bin_or(4,1) vaut 5 et bin_or(5,1) vaut 5


Pour bin_xor, c'est un ou exclusif, très utilisé entre autre pour le cryptage etc ... Le résultat est vrai si les 2 valeur sont différentes
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0
donc bin_xor(4,1) vaut 5 et bin_xor(5,1) vaut 4

Voilà, monsieur, j'espère que ça t'aidera
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1127
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Dim 27 Nov 2011, 4:29 pm

J'ai bien compris l'opération logique, mais ce que je ne comprend pas, c'est le résultat de cette opération, comment est-il calculé. Je crois que c'est sur 4 bits?
Vois le code que j'ai fait et regarde en détail le résultat de chaque opération pour chaque valeur. C'est ça qui me chiffone.
Code:
dim i,j
full_space 0:width 0,screen_x:height 0,screen_y
grid 1:caption 0,"BIN_AND"
width 1,screen_x:height 1,screen_y
' met 52 lignes avec 1 ligne fixe
grid_row 1,52:grid_row_fixed 1,1
' met 52 colonnes avec 1 colonne fixe
grid_column 1,52:grid_column_fixed 1,1
' largeur des colonnes hauteur des lignes
grid_column_width 1,29:grid_row_height 1,15

grid_one_column_width 1,1,35:grid_write 1,1,1,"V1\V2"
for i=0 to 50:grid_write 1,i+2,1,i:grid_write 1,1,i+2,i:next i

for i=2 to 52:for j=2 to 52:grid_write 1,i,j,bin_and(i-2,j-2):next j:next i
while scancode=0:end_while

caption 0,"BIN_OR"
for i=2 to 52:for j=2 to 52:grid_write 1,i,j,bin_or(i-2,j-2):next j:next i
while scancode=0:end_while

caption 0,"BIN_XOR"
for i=2 to 52:for j=2 to 52:grid_write 1,i,j,bin_xor(i-2,j-2):next j:next i
while scancode=0:end_while

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

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Dim 27 Nov 2011, 4:35 pm

Bon, ça avance pour mon éditeur de niveau de donjon, menu ok (charge, enregistre, génère une base, affiche, édition activable (désactivé par défaut).
Bon, je n'implémente pas la vue 3D dedans pour le moment, je vais directement utiliser le programme d'exploration de bignono avec le niveau édité.

Après, au programme, quand on clique sur nouveau => ouverture d'une fenêtre pour choisir les paramètres (hauteur, largeur uniquement à ce stade)
Code:

' *****************************
' **    Donjons Editor      **
' *    par: Jean-Charles      *
' * Version 4.0 - le 27/11/11 *
' *  Programme en Panoramic  *
' *****************************

DIM Max_cases_X, Max_cases_Y, Nb_cases_X, Nb_Cases_Y, NbCases
' Initialisation des valeurs maximales autorisées en X et Y
Max_cases_X = 19 : Max_cases_Y = 17
' Initialisation de la taille réelle du labyritnhe
Nb_cases_X = 6 : Nb_cases_Y = 6 : NbCases = (Nb_cases_X * Nb_cases_Y)-1
' Ajustement de la position du labyrinthe dans la fenêtre
DIM Dec_aff_X, Dec_aff_Y : Dec_aff_X = 35 : Dec_aff_Y = 35 : ' Correction pour l'affichage du plan (X et Y)
' Compteurs temporaires
DIM i,j,k,l,r,s
' Autres variables
DIM T_Cases(Max_cases_X+1, Max_cases_Y+1), c(4), debug, laby_dispo, editer
' Initialisation des chaines de caractères
DIM Chemin$ : Chemin$ = "C:\temp"  :                        ' Chemin de base du programme
DIM F_level$, Chaine$ : F_level$ = Chemin$ + "\level.dat" : ' Fichier de data du niveau

' label cpos1,cpos2,debut,jeu,lab,termine,trace
label lab,trace,mur_gauche, mur_bas, mur_haut, mur_droit, aff_souris
label clic_souris, clic_nouveau, clic_editer, Quitter, Enregistrer, Charger

debug = 2 : laby_dispo = 0 : editer = 0

width 0, 50 * (Nb_cases_X+1) : height 0, 50 * (Nb_cases_Y+1.5)

if Debug > 0
  i = width(0) + left (0) + 5
  form 500: width 500, 250 : height 500, 230: top 500, 3  : left 500,i
  if debug = 2 then j = top(500) + height(500) + 10 : form 520: width 520, 250 : height 520, (Nb_cases_Y+5) * 17: top 520, j  : left 520,i : hide 520
  for i = 1 to 10
    alpha 500 + i: parent 500 + i,500: height 500 + i, 17 : top 500 + i, (17*i) - 14  : left 500 + i,3
  next i
  if debug = 2
    Dim Text_debug$
    for i = 1 to Nb_cases_Y+2
      alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
    next i
  end_if
  caption 501,"Début du programme"
end_if
main_menu 100
sub_menu 110 : parent 110,100 : caption 110,"Fichier"
sub_menu 111 : parent 111,110 : caption 111,"Ouvrir": on_click 111, Charger
sub_menu 112 : parent 112,110 : caption 112,"Enregistrer" : on_click 112, Enregistrer
sub_menu 113 : parent 113,110 : caption 113,"Nouveau" : on_click 113, clic_nouveau
sub_menu 114 : parent 114,110 : caption 114,"Quitter" : on_click 114, Quitter
sub_menu 130 : parent 130,100 : caption 130,"Labyrinthe"
sub_menu 131 : parent 131,130 : caption 131,"Editer" : on_click 131, clic_editer
sub_menu 132 : parent 132,130 : caption 132,"Vue 3D"

if Debug > 0 then timer 2:timer_interval 2,100:on_timer 2,aff_souris

end

' GÉNÉRATION DU LABYRINTHE
lab:
' Initialise le côté

for i=0 to Nb_cases_X+1
  if i> 0 and i< Nb_cases_X+1 then T_Cases(i,0)=8  : ' Initialise la valeur pour le coté haut (mur à bas de la case)
  for j=1 to Nb_cases_Y
    if i = 0
      T_Cases(0,j)=4 : ' Initialise la valeur pour le coté gauche (mur à droite de la case)
    else
      T_Cases(i,j) = int(rnd(16))
      if i=Nb_cases_X+1
        T_Cases(i,j)=1 : ' Initialise la valeur pour le coté droit (mur à gauche de la case)
      else
        if (bin_and(T_Cases(i,j-1),8)) > 0 then T_Cases(i,j)  =bin_or(T_Cases(i,j),2)
        if (bin_and(T_Cases(i,j),2))  > 0 then T_Cases(i,j-1)=bin_or(T_Cases(i,j-1),8)
        if (bin_and(T_Cases(i-1,j),4)) > 0 then T_Cases(i,j)  =bin_or(T_Cases(i,j),1)
        if (bin_and(T_Cases(i,j),1))  > 0 then T_Cases(i-1,j)=bin_or(T_Cases(i-1,j),4)
      end_if
    end_if
  next j : ' Rempli le labyrinthe avec des cases fermée
  if i> 0 and i< Nb_cases_X+1 then T_Cases(i,Nb_cases_Y+1)=2 : ' Initialise la valeur pour le coté bas (mur à haut de la case)
next i
laby_dispo = 1
return

' TRACÉ DU LABYRINTHE DE COULEUR BLEU
trace:
if Debug > 0
  caption 501,"Boucle TRACE                              "
end_if
if Debug > 1
  show 520
  for j=0 to Nb_cases_Y+1
    Text_debug$ = "!"
    for i=0 to Nb_cases_X+1
      Text_debug$ = Text_debug$ + right$("00"+str$(T_cases(i,j)),2)+"!"
    next i
    caption 521+j, Text_debug$
  next j
end_if
cls
2d_pen_width 12
for j=0 to Nb_cases_Y + 1
2d_pen_color odd(j)*150,0,50+j*5
  for i=0 to Nb_cases_X + 1
    2d_pen_color odd(j)*150,odd(i)*150,50+j*5
    select T_Cases(i,j)
      case 1 : gosub mur_gauche                                      : ' mur de gauche (G)
      case 2 : gosub mur_bas                                        : ' mur du bas    (B)
      case 3 : gosub mur_gauche : gosub mur_bas                      : ' murs G+B
      case 4 : gosub mur_droit                                      : ' mur de droite (D)
      case 5 : gosub mur_gauche : gosub mur_droit                    : ' murs G+D
      case 6 : gosub mur_bas    : gosub mur_droit                    : ' murs B+D
      case 7 : gosub mur_gauche : gosub mur_bas    : gosub mur_droit : ' murs G+B+D (u)
      case 8 : gosub mur_haut                                        : ' mur du haut  (H)
      case 9 : gosub mur_gauche : gosub mur_haut                    : ' murs G+H
      case 10: gosub mur_bas    : gosub mur_haut                    : ' murs B+H
      case 11: gosub mur_gauche : gosub mur_bas    : gosub mur_haut  : ' murs G+B+H ([)
      case 12: gosub mur_droit  : gosub mur_haut                    : ' murs D+H
      case 13: gosub mur_gauche : gosub mur_droit  : gosub mur_haut  : ' murs G+D+H (n)
      case 14: gosub mur_bas    : gosub mur_droit  : gosub mur_haut  : ' murs B+D+H (])
      case 15: gosub mur_gauche:gosub mur_bas:gosub mur_droit:gosub mur_haut: ' murs G+B+D+H([])
    end_select
  next i
  if debug > 2 then message "ligne = " + str$(j) + "  ; colonne = " + str$(i)
next j
return

mur_gauche:
  2d_line  i*50 -Dec_aff_X,j*50 -Dec_aff_Y, i*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y
return

mur_bas:
  2d_line  i*50 -Dec_aff_X,j*50 -Dec_aff_Y,(i+1)*50-Dec_aff_X,j*50 -Dec_aff_Y
return

mur_droit:
  2d_line (i+1)*50 -Dec_aff_X, j*50 -Dec_aff_Y,(i+1)*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y
return

mur_haut:
  2d_line  i*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y,(i+1)*50 -Dec_aff_X,(j+1)*50 -Dec_aff_Y
return

aff_souris:
 r=mouse_x_position(0):  s=mouse_y_position(0)
 caption 503, "Souris Pos_X = " + Str$(r) + "  Pos_y = " + Str$(s) + "      "

 s = s - (50 -(Dec_aff_Y + 5)) :  k = mod(s,50) : s=int(s / 50) + 1
 caption 504, "ligne selectionnée = " + str$(s) + "  : Y_case =  " + str$(K) + "    "

 r = r - (50 -(Dec_aff_X + 5)) :  k = mod(r,50) : r=int(r / 50) + 1
 caption 505, "colonne selectionnée = " + str$(r) + "  : X_case =  " + str$(K) + "    "
return

clic_souris:
 if laby_dispo = 0 then return
 if debug > 1 then caption 501,"Traite clic": timer_off 2
 r=mouse_x_position(0):  s=mouse_y_position(0)
 s = s - (50 -(Dec_aff_Y + 5)) :  k = mod(s,50) : s=int(s / 50) + 1
 r = r - (50 -(Dec_aff_X + 5)) :  l = mod(r,50) : r=int(r / 50) + 1

 if k<10
    if s <1 or s > Nb_cases_Y
      ' On ne fait rien si on est dehors
    else
      if (bin_and(T_Cases(r,s),2)) > 0
        T_Cases(r,s) = T_Cases(r,s) - 2
        if bin_and(T_Cases(r,s-1),8) > 0 then T_Cases(r,s-1)=T_Cases(r,s-1)-8
      else
        T_Cases(r,s) = T_Cases(r,s) + 2
        if bin_and(T_Cases(r,s-1),8) = 0 then T_Cases(r,s-1)=T_Cases(r,s-1)+8
      end_if
    end_if
 end_if

 if l<10
    if r < 1 or r > Nb_cases_X
      ' On ne fait rien si on est dehors
    else
      if (bin_and(T_Cases(r,s),1)) > 0
        T_Cases(r,s) = T_Cases(r,s) - 1
        if bin_and(T_Cases(r-1,s),4) > 0 Then T_Cases(r-1,s)= T_Cases(r-1,s)-4
      else
        T_Cases(r,s) = T_Cases(r,s) + 1
        if bin_and(T_Cases(r-1,s),4) = 0 Then T_Cases(r-1,s)= T_Cases(r-1,s)+4
      end_if
    end_if
 end_if
 wait 200
 gosub trace
 timer_on 2
return

clic_nouveau:
  gosub lab
  gosub trace
return

clic_editer:
  if laby_dispo > 0
    if editer = 0
      caption 131,"Editer (actif)"
      on_click 0, clic_souris
      editer = 1
    else
      caption 131,"Editer"
      off_click 0
      editer = 0
    end_if
  end_if
return

Enregistrer:
If laby_dispo = 1
  FILE_OPEN_WRITE 50, F_level$
  File_Writeln 50, "Fichier de niveau pour le programme 'donjons'"
  File_Writeln 50, ""
  File_Writeln 50, "Dimensions:"
  Chaine$ = Right$("00" + STR$(Nb_cases_X), 2)+";"+Right$("00" + STR$(Nb_cases_Y), 2)
  File_Writeln 50, Chaine$
  File_Writeln 50, "Donées:"
  for j=0 to Nb_cases_Y+1
    Chaine$ = "!"
    for i=0 to Nb_cases_X+1
      Chaine$ = Chaine$ + right$("00"+str$(T_cases(i,j)),2)+"!"
    next i
    File_Writeln 50, Chaine$
  next j
end_if
file_close 50
return

Charger:

  FILE_OPEN_READ 50, F_level$
  for i = 1 to 3 :  File_readln 50, chaine$ : Next i
  File_readln 50, chaine$
  if debug > 1 then Caption 507,chaine$
  Nb_Cases_X = val(Left$ (Chaine$,2))
  Nb_cases_Y = val(Right$(Chaine$,2))
  if debug > 1 then Caption 508, Left$(Chaine$,2)+";"+Right$(Chaine$,2)
  File_Readln 50, chaine$:  File_Readln 50, chaine$
  for j=0 to Nb_cases_Y+1
  chaine$=Right$(Chaine$, len(Chaine$) - 1)
  i=0
  while len(chaine$) > 2
    if debug > 1 then Caption 507,chaine$
    T_cases(i,j)=val(Left$(Chaine$,2))
    chaine$=Right$(Chaine$, len(Chaine$) - 3)
    i=i+1
  end_while
  File_Readln 50, chaine$
  next j
  laby_dispo = 1
  file_close 50
  gosub trace
return


Quitter:
  Terminate


Dernière édition par Jicehel le Mer 30 Nov 2011, 2:02 am, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Dim 27 Nov 2011, 4:46 pm

OK, je vois, en fait, il ne se fait pas sur 4 bits, je pense, mais il faudrait voir avec chaque pour être plus sûr, voilà comment moi, je le comprends.
mais je n'en suis en effet pas certain: il converti les chiffres en chaine de caractères binaire et fait l'opération sur le nombre de bits utilisés par cette chaine
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Mer 30 Nov 2011, 2:11 am

Bonsoir, j'ai corrigé le source de mon éditeur de niveau (petite erreur de logique) et j'ai remplacé le source (post du Dim 27 Nov 2011 - 15:35).

Je vous mets ci dessous le code tiré du programme de Bignono
Modifications:
- Retrait des boulettes oranges et du gloutton
- Retrait de la génération auto des labyrinthes
- Retrait de l'entrée et de la sortie
- Ajout du chargement du niveau
- Modification pour que la taille des murs soit réglable par une variable
Code:
' ******************************************************************************
' ******************************************************************************
' **********************  DONJONS V1.0 par Jicehel  **************************
' ***********  basé sur: LABYRINTHE 3D version 12 (Créé par Bignono) **********
' *******************  EN BASIC PANORAMIC le 28/11/11  ***********************
' ******************************************************************************
' ******************************************************************************

dim c_gauche,c_droite,c_avant,espace,pas,pasv,pas_trace
dim ang,d,dtn,gd,h,v,i,j,k,pt,rot,w, a(30,30),debug

' Initialisation des chaines de caractères
dim Chemin$ : Chemin$ = "C:\temp"  :                        ' Chemin de base du programme
dim F_level$, Chaine$ : F_level$ = Chemin$ + "\level.dat" : ' Fichier de data du niveau


label affiche,droite,gauche,moteur,pan1,pan2,pan4,pan8,pivot,termine,trace, charge_laby

scene3d 1: ' full_space 0
full_space 1:light_position 0,1500,0
3d_skybox 1:' ---> Si vous voulez définir un "SKYBOX 1" ici sur cette ligne
' N'oubliez pas d'habiller votre skybox avec les commandes 3d_load_texture_back, bottom, front, left, right et top
3d_plane 2:3d_scale 2,500,500,1:3d_x_rotate 2,90:3d_y_position 2,0:3d_color 2,0,0,32: ' ---> CHANGEZ LE 3D_COLOR 2 PAR 3D_LOAD_TEXTURE 2,"FICHIER BMP OU JPG" ET N'OUBLIEZ PAS LES COMMANDES 3D_U_TILES & 3D_v_TILES
3d_cube 3,1:3d_cube 4,1:3d_hide 3:3d_hide 4: ' CRÉATION DES VÉHICULES MOTEUR ET CAMÉRA


' ******************************************************************************
' ************************ INITIALISATION DES VARIABLES ************************
' ******************************************************************************
' ** h et v représentent les dimensions du labyrinthe (vous pouvez les modifier,
' mais plus le labyrinthe est grand, plus le programme ralentit!) **************
' ****** pas : sert à règler la vitesse de déplacement dans le labyrinthe ******
' ****** pasv: sert à règler la vitesse du zoom vertical ***********************

debug = 1

if debug > 0
  v = 22
  form 520: width 520, 400 : height 520, (V+5) * 17: top 520, 0  : left 520,800
  for i = 1 to 30
      alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
  next i
end_if

gosub charge_laby
d=1:w=4:espace=0:c_gauche=0:c_droite=0:c_avant=0: pas=1:pasv=2 : pas_trace = 8

' ******************************************************************************
' ******************************************************************************



' ******************************************************************************
' ****************    CONSTRUCTION DU LABYRINTHE EN 3D  ***********************
' ******************************************************************************

' CAS 1 = MUR GAUCHE, CAS 2 = MUR ARRIÈRE, CAS 4 = MUR DROIT, CAS 8 = MUR FACE
' LES AUTRES CAS, C'EST UNE ADDITION; EX: CAS 3 = CAS 1 + CAS 2
 for j=0 to v+1
  for i=0 to h+1
    select a(i,j)
      case 1:      if i=h+1 then gosub pan1: ' mur de gauche (G)
      case 2:      if j=v+1 then gosub pan2: ' mur du bas    (B)
      case 4:      gosub pan4              : ' mur de droite (D)
      case 5:      gosub pan4              : ' G+D
      case 6:      gosub pan4              : ' B+D
      case 7:      gosub pan4              : ' G+B+D (cul de sac en u)
      case 8:      gosub pan8              : ' mur du haut  (H)
      case 9:      gosub pan8              : ' G+H
      case 10:      gosub pan8              : ' B+H
      case 11:      gosub pan8              : ' G+B+H (cul de sac en [)
      case 12:      gosub pan4:gosub pan8  : ' D+H
      case 13:      gosub pan4:gosub pan8  : ' G+D+H (cul de sac en n)
      case 14:      gosub pan4:gosub pan8  : ' B+D+H (cul de sac en ])
      case 15:      gosub pan4:gosub pan8  : ' Tout fermé []
    end_select
  next i
next j
' ******************************************************************************
' ******************************************************************************


' ******************************************************************************
' ** Initialisation position de départ et création d'un timer pour gérer les  **
' * déplacements. Si le programme plante augmentez la valeur du timer_interval *
' ******************************************************************************
' * Coin inférieur droit (0,1)
i=1:j=1:dtn=1
3d_position 3,i*pas_trace,4,j*pas_trace:gosub affiche
timer 2:timer_interval 2,10:on_timer 2,moteur
end


' ******************************************************************************
' *****************    LE PROGRAMME PRINCIPAL    ******************************
' ******************************************************************************
moteur:
timer_off 2
if debug > 0
    show 520
    caption 521, "Boucle moteur"
    caption 522, "Etat des touches:  Espace:" + str$(espace) + "  Gauche : " + str$(c_gauche) + "  Droite : " + str$(c_droite) + "      "
    caption 523, "dtn = " + str$(dtn) + "  : i (dep. laéral) = " + str$(i) + "  : j (dép vertical) = "+str$(j)
    caption 524, "test dtn="+ str$(dtn) +" => a(i,j) = "+str$(a(i,j))
end_if
if espace=1 then goto trace
if c_gauche=1 then gosub gauche
if c_droite=1 then gosub droite
if c_avant=1
    if dtn=1 and j < v
        if debug > 1 then caption 524, "test dtn=1 avec j<v+1 => a(i,j) = "+str$(a(i,j))
        if a(i,j) < 8
            pt=j*pas_trace:j=j+1:gd=j*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=2 and i < h  and j > 0
        if debug > 1 then caption 524, "test dtn=2 avec i<h et j > 1 => a(i,j) = "+str$(a(i,j))
        if a(i,j)<4 or a(i,j)>7 and a(i,j)<12
          pt=i*pas_trace:i=i+1:gd=i*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=3 and j > 0
        if debug > 1 then caption 524, "test dtn=3 avec j > 2 => a(i,j) = "+str$(a(i,j))
        if a(i,j)=0 or a(i,j)=1 or a(i,j)=4 or a(i,j)=5 or a(i,j)=8 or a(i,j)=9 or a(i,j)=12 or a(i,j)=13
            pt=j*pas_trace:j=j-1:gd=j*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if

    if dtn=4 and i > 2 and j > 1
        if debug > 1 then caption 524, "test dtn=4 avec i > 2 => a(i,j) = "+str$(a(i,j))
        if odd(a(i,j))=0
            pt=i*pas_trace:i=i-1:gd=i*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if
    c_avant=0
end_if

select scancode
case 27:goto termine: ' SORTIE PROGRAMME
case 32:espace=1:    ' AFFICHAGE DU PLAN DU LABYRINTHE
case 37:c_gauche=1:  ' FLECHE GAUCHE = ROTATION A GAUCHE
case 39:c_droite=1:  ' FLECHE DROITE = ROTATION A DROITE
case 38:c_avant=1:    ' FLECHE HAUT = DTN DEFINIT LA DIRECTION NORD, OUEST, SUD OU EST
end_select

3d_position 3, i*pas_trace,4,j*pas_trace

' TEST DE SORTIE DU LABYRINTHE
if j=v+1
  beep_exclamation:message "BRAVO, VOUS ETES SORTI DU LABYRINTHE!":goto termine
end_if

timer_on 2

return



' ******************************************************************************
' *********************    LES ROUTINES      ***********************************
' ******************************************************************************

' CALCUL DES POSITIONS DES VÉHICULES MOTEUR ET CAMÉRA
affiche:
3d_position 4,o3d_x_position(3),o3d_y_position(3),o3d_z_position(3):3d_rotate 4,o3d_x_rotate(3),o3d_y_rotate(3),o3d_z_rotate(3)
3d_move 4,1:cam_position o3d_x_position(3),w,o3d_z_position(3):point_position o3d_x_position(4),4,o3d_z_position(4)
return

' CRÉATION DES MURS DU LABYRINTHE : Vous pouvez supprimer les 3d_color et mettre
' à la place un 3d_load_texture si vous voulez habillez les murs!!!
pan1:
3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace-pas_trace/2,4,j*pas_trace
3d_y_rotate number_3d_objects,90:3d_color number_3d_objects,96,0,0
return
pan2:
3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace - pas_trace/2
return
pan4:
 3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace+pas_trace/2,4,j*pas_trace
 3d_y_rotate number_3d_objects,90:3d_color number_3d_objects,96,0,0
return
pan8:
 3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace + pas_trace/2
return

' VISION DE HAUT DU LABYRINTHE EN 3D
trace:
  repeat
      w=w+pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=70

repeat
if scancode=27 then goto termine
if scancode=37 then gosub gauche
if scancode=39 then gosub droite
wait 100
until scancode=32

  repeat
      w=w-pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=4
  espace=0
  goto moteur


' ROTATION A GAUCHE
gauche:
ang=rot+90:dtn=dtn+1:if dtn>4 then dtn=1
    repeat
        rot=rot+6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot>=ang
    c_gauche=0
return

' ROTATION A DROITE
droite:
 ang=rot-90:dtn=dtn-1:if dtn<1 then dtn=4
    repeat
        rot=rot-6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot<=ang
    c_droite=0
return

' ROTATION DE LA CAMÉRA LORS DE LA VISION DE HAUT
pivot:
cam_position o3d_x_position(3),o3d_y_position(3)+w,o3d_z_position(3)
return


charge_laby:

FILE_OPEN_READ 50, F_level$
for i = 1 to 3 :  File_readln 50, chaine$ : Next i
File_readln 50, chaine$
H = val(Left$ (Chaine$,2))
V = val(Right$(Chaine$,2))
File_Readln 50, chaine$:  File_Readln 50, chaine$
for j=0 to V+1
 ' if debug > 0 then Caption 521 + j,Chaine$
  chaine$=Right$(Chaine$, len(Chaine$) - 1)
  i=0
  while len(chaine$) > 2
    a(i,j)=val(Left$(Chaine$,2))
    chaine$=Right$(Chaine$, len(Chaine$) - 3)
    i=i+1
  end_while
  File_Readln 50, chaine$
next j
file_close 50
return


' SORTIE DU PROGRAMME
termine:
timer_off 2
terminate
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Mer 30 Nov 2011, 2:56 pm

Bon, je pense que moi, à la place du glouton, il faut que je mette un cube avec des "faces différentes" pour indiquer la direction du monstre (il avance dans la direction ou il regarde et pivote quand il tourne).

A moins que quelqu'un sache faire des "monstres propres" en 3D que je pourrais implémenter dans l'explorateur de donjon (le monstre peut correspondre à un pion (une figurine fixe) pour le moment, ça n'a pas d'importance).

Comme j'ai vu que des revenants de la 3D revenaient sur le forum, y en aurait-il un qui pourrait ajouter ça au moteur d'exploration ? (objet 3D ressemblant à un monstre (orc, gobelin par exemple) )
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1127
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Un monstre   Mer 30 Nov 2011, 8:54 pm

Salut Jicehel,

Je t"envoie un petit prog d'un revenant animé en 3d. Regarde bien comment j'ai fait l'animation et cela te donnera peut-être des idées pour la suite.
Tu t'arrangera pour changer le chemin dans le prog, je n'ai pas le temps. C'est fastidieux à faire et j'ai la flegme. drunken Le lien de téléchargement ci-après... Arrow
[url= megaupload.com UN1ZGK6F ]un revenant animé[/url]

Code:
dim i:label prog,fin
full_space 0:scene3d 1:full_space 1:color 1,100,0,0
cam_position 0,0,5:point_position 0,0,0
3d_mesh 1:3d_load_object 1,"c:\a animer\rv01.3ds"
3d_mesh 2:3d_load_object 2,"c:\a animer\rv02.3ds"
3d_mesh 3:3d_load_object 3,"c:\a animer\rv03.3ds"
3d_mesh 4:3d_load_object 4,"c:\a animer\rv04.3ds"
3d_mesh 5:3d_load_object 5,"c:\a animer\rv05.3ds"
3d_mesh 6:3d_load_object 6,"c:\a animer\rv06.3ds"
3d_mesh 7:3d_load_object 7,"c:\a animer\rv07.3ds"
3d_mesh 8:3d_load_object 8,"c:\a animer\rv08.3ds"
3d_mesh 9:3d_load_object 9,"c:\a animer\rv09.3ds"
3d_mesh 10:3d_load_object 10,"c:\a animer\rv10.3ds"
3d_mesh 11:3d_load_object 11,"c:\a animer\rv11.3ds"
3d_mesh 12:3d_load_object 12,"c:\a animer\rv12.3ds"
3d_mesh 13:3d_load_object 13,"c:\a animer\rv13.3ds"
3d_mesh 14:3d_load_object 14,"c:\a animer\rv14.3ds"
3d_mesh 15:3d_load_object 15,"c:\a animer\rv15.3ds"
3d_mesh 16:3d_load_object 16,"c:\a animer\rv16.3ds"
3d_mesh 17:3d_load_object 17,"c:\a animer\rv17.3ds"
3d_mesh 18:3d_load_object 18,"c:\a animer\rv18.3ds"
3d_mesh 19:3d_load_object 19,"c:\a animer\rv19.3ds"
3d_mesh 20:3d_load_object 20,"c:\a animer\rv20.3ds"
3d_mesh 21:3d_load_object 21,"c:\a animer\rv21.3ds"
3d_mesh 22:3d_load_object 22,"c:\a animer\rv22.3ds"
3d_mesh 23:3d_load_object 23,"c:\a animer\rv23.3ds"
3d_mesh 24:3d_load_object 24,"c:\a animer\rv24.3ds"
3d_mesh 25:3d_load_object 25,"c:\a animer\rv25.3ds"
3d_mesh 26:3d_load_object 26,"c:\a animer\rv26.3ds"
3d_mesh 27:3d_load_object 27,"c:\a animer\rv27.3ds"
3d_mesh 28:3d_load_object 28,"c:\a animer\rv28.3ds"
3d_mesh 29:3d_load_object 29,"c:\a animer\rv29.3ds"
3d_mesh 30:3d_load_object 30,"c:\a animer\rv30.3ds"
3d_mesh 31:3d_load_object 31,"c:\a animer\rv31.3ds"
3d_mesh 32:3d_load_object 32,"c:\a animer\rv32.3ds"
3d_mesh 33:3d_load_object 33,"c:\a animer\rv33.3ds"
3d_mesh 34:3d_load_object 34,"c:\a animer\rv34.3ds"
3d_mesh 35:3d_load_object 35,"c:\a animer\rv35.3ds"
3d_mesh 36:3d_load_object 36,"c:\a animer\rv36.3ds"
3d_mesh 37:3d_load_object 37,"c:\a animer\rv37.3ds"
3d_mesh 38:3d_load_object 38,"c:\a animer\rv38.3ds"
3d_mesh 39:3d_load_object 39,"c:\a animer\rv39.3ds"
3d_mesh 40:3d_load_object 40,"c:\a animer\rv40.3ds"
3d_mesh 41:3d_load_object 41,"c:\a animer\rv41.3ds"
3d_mesh 42:3d_load_object 42,"c:\a animer\rv42.3ds"
3d_mesh 43:3d_load_object 43,"c:\a animer\rv43.3ds"
3d_mesh 44:3d_load_object 44,"c:\a animer\rv44.3ds"
3d_mesh 45:3d_load_object 45,"c:\a animer\rv45.3ds"
3d_mesh 46:3d_load_object 46,"c:\a animer\rv46.3ds"
3d_mesh 47:3d_load_object 47,"c:\a animer\rv47.3ds"
3d_mesh 48:3d_load_object 48,"c:\a animer\rv48.3ds"

for i=1 to 24:3d_load_texture i,"c:\a animer\rv.bmp"
3d_position i,0,-10,-7.5:3d_scale i,.025,.025,.025:3d_x_rotate i,90:3d_z_rotate i,-90:next i
for i=1 to 48:3d_hide i:next i

i=8:timer 99:timer_interval 99,100:on_timer 99,prog:end

prog:
if scancode=27 then goto fin
3d_hide i:i=i+1:if i=25 then i=8
3d_show i:return
fin:
timer_off 99:terminate

Smile cheers
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
659_minifly



Nombre de messages : 590
Age : 69
Localisation : Valenciennes Nord
Date d'inscription : 29/04/2010

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Mer 30 Nov 2011, 9:08 pm

Jice
voila deux fichiers contenant chacun un monstre.

dl.free.fr/jIoGEDlKI


dl.free.fr/ky7CCjSRQ

Ils ne sont pas de moi.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Mer 30 Nov 2011, 10:11 pm

Merci à vous deux Smile Je regarde ça ce soir après mangé Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Jeu 01 Déc 2011, 11:48 am

Bon, j'ai regardé hier, j'ai commencé à programmer (j'ai un squelette qui se déplace et se tourne dans le bon sens, j'ai aussi un dragon mais je ne l'utilise pas pour le moment, pour faire simple).
Je n'ai pas mis le source car il y a encore un petit bug dans mes tests et le squelette sort du labyrinthe sur un type de cases, je devrais pouvoir corriger ça vite ce soir. En plus il flotte un peu en l'air et je n'avais pas réussi à corriger hier soir avant que je doive monter m'occuper de ma fille qui est malade.
En principe, je mettrais le source corrigé ce soir.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jpcr

avatar

Nombre de messages : 276
Age : 51
Localisation : Val de Marne (94)
Date d'inscription : 06/05/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Jeu 01 Déc 2011, 12:33 pm

ben dis donc Jicehel , on t'arrete plus Very Happy
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://jeanpierre.creis.free.fr/Panoramic/Panoramic.html
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Jeu 01 Déc 2011, 12:56 pm

Ben le programme de bignono m'a bien plus et m'a donné envie de m'y remettre un peu Smile
Ce soir, si j'ai le temps et des enfants qui dorment au lieu de tousser et de demander leur papa (je te jure, on travaille avec des handicaps ... Smile ), une fois le problème d'affichage corrigé, je rajoute le test si la position du monstre = position du joueur, on masque le monstre pour ne pas avoir un affichage pourri, on ouvre une fenêtre et on lance notre programme de combat (par un include) => Le monstre meurt et on en créé un autre (pour le moment, je fais simple) sinon on meurt et c'est la fin.
Ce soir, je rajoute aussi les texture sur les murs / sol et je fais un zip pour le forum
Après, j'ajouterais les tests de fuite mais je préfère progresser doucement

Si j'ai le temps, je sépare les déclarations dans un include, ... pour ne garde que le moteur et les includes dans le programme.

Après en fonction des "monstres 3DS" médiévaux / fantastiques que je trouve et que j'arrive à intégrer, l'idée serait de se faire une bibliothèque avec le nom du monstre, le nom du fichier 3DS, les correction à apporter l'objet (scale, rotation, ...) et ses caractéristiques (celles que nous utilisons actuellement dans notre moteur de combat).

Plus tard, je voudrais pouvoir gérer:
- les salles avec les textures sur les murs
- les portes (avec ou sans clés)
- les passages secrets
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Ven 02 Déc 2011, 1:22 am

Voilà, j'ai fais les modifs suivantes comme convenues:

- Le squelette se déplace sans traverser de mur (le problème venait de mon générateur de donjons ou j'avais oublié de tester et de régler la valeur des cases sur le bord du labyrinthe qui prenaient parfois des valeurs impossibles ...)

- Le labyrinthe est texturé (Ca peut et sera sans doute amélioré, mais bon, on voit ce que ça peut donner)

Le fichier contenant les sources de l'éditeur et de l'explorateur ainsi que les textures et les objets 3DS est ici:
ZIP Donjons (Textures, objets, sources)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 50
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Ven 02 Déc 2011, 2:48 am

J'arrive pas à faire fonctionner ton prog: Explore_Donjon
erreur en ligne 115 : T_Cases non identifié...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Ven 02 Déc 2011, 8:25 am

Tu as raison Nardo, je n'avais pas sauvegardé avant de faire le zip, désolé ... Voici le source corrigé:
Code:

' ******************************************************************************
' ******************************************************************************
' **********************  DONJONS V1.0 par Jicehel  **************************
' ***********  basé sur: LABYRINTHE 3D version 12 (Créé par Bignono) **********
' *******************  EN BASIC PANORAMIC le 28/11/11  ***********************
' ******************************************************************************
' ******************************************************************************

dim c_gauche,c_droite,c_avant,espace,pas,pasv,pas_trace
dim ang,d,dtn,gd,h,v,i,j,k,pt,rot,w, a(30,30),debug
dim X_monstre(3), Y_monstre(3), dir_monstre(3), h_monstre(3), Cpt_monstre, mgd, mpt

' Initialisation des chaines de caractères
dim Chemin$ : Chemin$ = "C:\temp"  :                        ' Chemin de base du programme
dim F_level$, Chaine$ : F_level$ = Chemin$ + "\level.dat" : ' Fichier de data du niveau

label affiche,droite,gauche,moteur,pan1,pan2,pan4,pan8,pivot,termine,trace
label Mvt_Monstre, charge_laby

dim texture_mur1 : texture_mur1 = 101 : image texture_mur1: file_load texture_mur1,"Decors\mur1.bmp"
dim texture_mur2 : texture_mur2 = 102 : image texture_mur2: file_load texture_mur2,"Decors\mur2.bmp"
dim texture_mur3 : texture_mur3 = 103 : image texture_mur3: file_load texture_mur3,"Decors\mur3.bmp"
dim texture_mur4 : texture_mur4 = 105 : image texture_mur4: file_load texture_mur4,"Decors\mur4.bmp"

scene3d 1: ' full_space 0
full_space 1:light_position 0,1500,0
3d_skybox 1
3d_load_texture_back  1,"Decors\canyon_back.jpg"
3d_load_texture_front  1,"Decors\canyon_front.jpg"
3d_load_texture_left  1,"Decors\canyon_left.jpg"
3d_load_texture_right  1,"Decors\canyon_right.jpg"
3d_load_texture_top    1,"Decors\canyon_top.jpg"
3d_plane 2:3d_scale 2,500,500,1:3d_x_rotate 2,90:3d_y_position 2,0
3d_u_tile 2,500: 3d_v_tile 2,500 : 3d_load_texture 2,"Decors\sol.bmp"
3d_cube 3,1:3d_cube 4,1:3d_hide 3:3d_hide 4: ' CRÉATION DES VÉHICULES MOTEUR ET CAMÉRA
3d_mesh 5 : 3d_hide 5: 3d_load_object 5, "Monstres\skeleton.3ds"
3d_X_rotate 5,90: 3d_scale 5,10,10,10
' 3d_mesh 6 : 3d_hide 6: 3d_load_object 6, "Monstres\dragon-red.3DS"
' 3d_X_rotate 6,90:3d_scale 6,0.0003,0.0005,0.0005

' ******************************************************************************
' ************************ INITIALISATION DES VARIABLES ************************
' ******************************************************************************
' ** h et v représentent les dimensions du labyrinthe (vous pouvez les modifier,
' mais plus le labyrinthe est grand, plus le programme ralentit!) **************
' ****** pas : sert à règler la vitesse de déplacement dans le labyrinthe ******
' ****** pasv: sert à règler la vitesse du zoom vertical ***********************

debug = 1

if debug > 0
  v = 22
  form 520: width 520, 400 : height 520, (V+5) * 17: top 520, 0  : left 520,800
  for i = 1 to 30
      alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
  next i
end_if

gosub charge_laby
d=1:w=4:espace=0:c_gauche=0:c_droite=0:c_avant=0: pas=1:pasv=2 : pas_trace = 8
Cpt_monstre = 0

' ******************************************************************************
' ******************************************************************************



' ******************************************************************************
' ****************    CONSTRUCTION DU LABYRINTHE EN 3D  ***********************
' ******************************************************************************

' CAS 1 = MUR GAUCHE, CAS 2 = MUR ARRIÈRE, CAS 4 = MUR DROIT, CAS 8 = MUR FACE
' LES AUTRES CAS, C'EST UNE ADDITION; EX: CAS 3 = CAS 1 + CAS 2
 for j=0 to v+1
  for i=0 to h+1
    select a(i,j)
      case 1:      if i=h+1 then gosub pan1: ' mur de gauche (G)
      case 2:      if j=v+1 then gosub pan2: ' mur du bas    (B)
      case 4:      gosub pan4              : ' mur de droite (D)
      case 5:      gosub pan4              : ' G+D
      case 6:      gosub pan4              : ' B+D
      case 7:      gosub pan4              : ' G+B+D (cul de sac en u)
      case 8:      gosub pan8              : ' mur du haut  (H)
      case 9:      gosub pan8              : ' G+H
      case 10:      gosub pan8              : ' B+H
      case 11:      gosub pan8              : ' G+B+H (cul de sac en [)
      case 12:      gosub pan4:gosub pan8  : ' D+H
      case 13:      gosub pan4:gosub pan8  : ' G+D+H (cul de sac en n)
      case 14:      gosub pan4:gosub pan8  : ' B+D+H (cul de sac en ])
      case 15:      gosub pan4:gosub pan8  : ' Tout fermé []
    end_select
  next i
next j
' ******************************************************************************
' ******************************************************************************


' ******************************************************************************
' ** Initialisation position de départ et création d'un timer pour gérer les  **
' * déplacements. Si le programme plante augmentez la valeur du timer_interval *
' ******************************************************************************
' * Coin inférieur droit (0,1)
i=1:j=1 : dtn = 1
X_monstre(1) = 2: Y_monstre(1) = 2 : h_monstre(1)= 0



if bin_and(a(X_monstre(1),Y_monstre(1)),8) = 0
  dir_monstre(1)=1
  else
    if bin_and(a(X_monstre(1),Y_monstre(1)),1) = 0
      dir_monstre(1)=2
    else
      if bin_and(a(X_monstre(1),Y_monstre(1)),2) = 0
        dir_monstre(1)=3
      else
        if bin_and(a(X_monstre(1),Y_monstre(1)),4) =0
          dir_monstre(1) = 4
        else
          dir_monstre(1) = 0
        end_if
      end_if
    end_if
end_if

' X_monstre(2) = 2: Y_monstre(2) = 1 : dir_monstre(2) = 1
3d_position 5, X_monstre(1)*pas_trace,h_monstre(1), Y_monstre(1)*pas_trace: 3d_show 5
' 3d_position 6, X_monstre(2)*pas_trace,0, Y_monstre(2)*pas_trace: 3d_show 6
3d_position 3,i*pas_trace,4,j*pas_trace:gosub affiche
timer 2:timer_interval 2,200:on_timer 2,moteur
end


' ******************************************************************************
' *****************    LE PROGRAMME PRINCIPAL    ******************************
' ******************************************************************************
moteur:
timer_off 2
if debug > 0
    show 520
    caption 521, "Boucle moteur"
    caption 522, "Etat des touches:  Espace:" + str$(espace) + "  Gauche : " + str$(c_gauche) + "  Droite : " + str$(c_droite) + "      "
    caption 523, "dtn = " + str$(dtn) + "  : i (dep. laéral) = " + str$(i) + "  : j (dép vertical) = "+str$(j)
    caption 524, "test dtn="+ str$(dtn) +" => a(i,j) = "+str$(a(i,j))
end_if
if espace=1 then goto trace
if c_gauche=1 then gosub gauche
if c_droite=1 then gosub droite
if c_avant=1
    if dtn=1 and j < v
        if debug > 1 then caption 524, "test dtn=1 avec j<v+1 => a(i,j) = "+str$(a(i,j))
        if a(i,j) < 8
            pt=j*pas_trace:j=j+1:gd=j*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=2 and i < h  and j > 0
        if debug > 1 then caption 524, "test dtn=2 avec i<h et j > 1 => a(i,j) = "+str$(a(i,j))
        if a(i,j)<4 or a(i,j)>7 and a(i,j)<12
          pt=i*pas_trace:i=i+1:gd=i*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=3 and j > 0
        if debug > 1 then caption 524, "test dtn=3 avec j > 2 => a(i,j) = "+str$(a(i,j))
        if a(i,j)=0 or a(i,j)=1 or a(i,j)=4 or a(i,j)=5 or a(i,j)=8 or a(i,j)=9 or a(i,j)=12 or a(i,j)=13
            pt=j*pas_trace:j=j-1:gd=j*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if

    if dtn=4 and i > 1 and j > 1
        if debug > 1 then caption 524, "test dtn=4 avec i > 2 => a(i,j) = "+str$(a(i,j))
        if odd(a(i,j))=0
            pt=i*pas_trace:i=i-1:gd=i*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if
    c_avant=0
end_if

select scancode
case 27:goto termine: ' SORTIE PROGRAMME
case 32:espace=1:    ' AFFICHAGE DU PLAN DU LABYRINTHE
case 37:c_gauche=1:  ' FLECHE GAUCHE = ROTATION A GAUCHE
case 39:c_droite=1:  ' FLECHE DROITE = ROTATION A DROITE
case 38:c_avant=1:    ' FLECHE HAUT = DTN DEFINIT LA DIRECTION NORD, OUEST, SUD OU EST
end_select

3d_position 3, i*pas_trace,4,j*pas_trace

' TEST DE SORTIE DU LABYRINTHE
if j=v+1
  beep_exclamation:message "BRAVO, VOUS ETES SORTI DU LABYRINTHE!":goto termine
end_if

Cpt_monstre = Cpt_monstre + 1: If Cpt_monstre = 5 then gosub Mvt_Monstre

timer_on 2

return

Mvt_Monstre:

select dir_monstre(1)

  case 0

  case 1
    3d_z_rotate 5,0
    mgd=Y_monstre(1)*8:Y_monstre(1)=Y_monstre(1)+1:mpt=Y_monstre(1)*8
    repeat
        mgd=mgd+pas::3d_position 5,X_monstre(1)*8,h_monstre(1),mgd
    until mgd>=mpt
  if a(X_monstre(1),Y_monstre(1))= 1 or a(X_monstre(1),Y_monstre(1))=8 or a(X_monstre(1),Y_monstre(1))=9 then dir_monstre(1)=4
  if a(X_monstre(1),Y_monstre(1))=12 then dir_monstre(1)=2
  if a(X_monstre(1),Y_monstre(1))=13 then dir_monstre(1)=3

  case 2
    3d_z_rotate 5,270
    mgd=X_monstre(1)*8:X_monstre(1)=X_monstre(1)-1:mpt=X_monstre(1)*8
    repeat
        mgd=mgd-pas:3d_position 5,mgd,h_monstre(1),Y_monstre(1)*8
    until mgd<=mpt
  if a(X_monstre(1),Y_monstre(1))= 1 or a(X_monstre(1),Y_monstre(1))=2 or a(X_monstre(1),Y_monstre(1))=3 then dir_monstre(1)=1
  if a(X_monstre(1),Y_monstre(1))= 9 then dir_monstre(1)=3
  if a(X_monstre(1),Y_monstre(1))=11 then dir_monstre(1)=4

  case 3
    3d_z_rotate 5,180
    mpt=Y_monstre(1)*8:Y_monstre(1)=Y_monstre(1)-1:mgd=Y_monstre(1)*8
    repeat
        mpt=mpt-pas:3d_position 5,X_monstre(1)*8,h_monstre(1),mpt
    until mgd>=mpt
  if a(X_monstre(1),Y_monstre(1))= 2 or a(X_monstre(1),Y_monstre(1))=4 or a(X_monstre(1),Y_monstre(1))=6 or a(X_monstre(1),Y_monstre(1))=10 then dir_monstre(1)=2
  if a(X_monstre(1),Y_monstre(1))= 3 then dir_monstre(1)=4
  if a(X_monstre(1),Y_monstre(1))= 7 then dir_monstre(1)=1

  case 4
    3d_z_rotate 5,90
    mpt=X_monstre(1)*8:X_monstre(1)=X_monstre(1)+1:mgd=X_monstre(1)*8
    repeat
        mpt=mpt+pas:3d_position 5,mpt,h_monstre(1),Y_monstre(1)*8
    until mpt>=mgd
  if a(X_monstre(1),Y_monstre(1))= 4 or a(X_monstre(1),Y_monstre(1))=8 or a(X_monstre(1),Y_monstre(1))=12 then dir_monstre(1)=3
  if a(X_monstre(1),Y_monstre(1))= 6 then dir_monstre(1)=1
  if a(X_monstre(1),Y_monstre(1))=14 then dir_monstre(1)=2

end_select
if debug > 0
  caption 525, "Monstre: x  = "+ str$(X_monstre(1)) + "  :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y)  = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))+ "      "
'  if X_monstre(1) > H or Y_monstre(1) > V
'      Message "Monstre: x= "+ str$(X_monstre(1)) + " :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y) = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))
'  end_if
end_if
Cpt_monstre=0

return

' ******************************************************************************
' *********************    LES ROUTINES      ***********************************
' ******************************************************************************

' CALCUL DES POSITIONS DES VÉHICULES MOTEUR ET CAMÉRA
affiche:
3d_position 4,o3d_x_position(3),o3d_y_position(3),o3d_z_position(3):3d_rotate 4,o3d_x_rotate(3),o3d_y_rotate(3),o3d_z_rotate(3)
3d_move 4,1:cam_position o3d_x_position(3),w,o3d_z_position(3):point_position o3d_x_position(4),4,o3d_z_position(4)
return

' CRÉATION DES MURS DU LABYRINTHE : Vous pouvez supprimer les 3d_color et mettre
' à la place un 3d_load_texture si vous voulez habillez les murs!!!
pan1:
3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace-pas_trace/2,4,j*pas_trace
3d_y_rotate number_3d_objects,90: 3d_image_texture number_3d_objects, texture_mur1
return
pan2:
3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace - pas_trace/2
3d_image_texture number_3d_objects, texture_mur4
return
pan4:
 3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace+pas_trace/2,4,j*pas_trace
 3d_y_rotate number_3d_objects,90:3d_image_texture number_3d_objects, texture_mur2
return
pan8:
 3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace + pas_trace/2
 3d_image_texture number_3d_objects, texture_mur3
return

' VISION DE HAUT DU LABYRINTHE EN 3D
trace:
  repeat
      w=w+pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=70

repeat
if scancode=27 then goto termine
if scancode=37 then gosub gauche
if scancode=39 then gosub droite
Cpt_monstre = Cpt_monstre + 1: If Cpt_monstre = 5 then gosub Mvt_Monstre
wait 200
until scancode=32

  repeat
      w=w-pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=4
  espace=0
  goto moteur


' ROTATION A GAUCHE
gauche:
ang=rot+90:dtn=dtn+1:if dtn>4 then dtn=1
    repeat
        rot=rot+6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot>=ang
    c_gauche=0
return

' ROTATION A DROITE
droite:
 ang=rot-90:dtn=dtn-1:if dtn<1 then dtn=4
    repeat
        rot=rot-6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot<=ang
    c_droite=0
return

' ROTATION DE LA CAMÉRA LORS DE LA VISION DE HAUT
pivot:
cam_position o3d_x_position(3),o3d_y_position(3)+w,o3d_z_position(3)
return


charge_laby:

FILE_OPEN_READ 50, F_level$
for i = 1 to 3 :  File_readln 50, chaine$ : Next i
File_readln 50, chaine$
H = val(Left$ (Chaine$,2))
V = val(Right$(Chaine$,2))
File_Readln 50, chaine$:  File_Readln 50, chaine$
for j=0 to V+1
'  if debug > 0 then Caption 521 + j,Chaine$
  chaine$=Right$(Chaine$, len(Chaine$) - 1)
  i=0
  while len(chaine$) > 2
    a(i,j)=val(Left$(Chaine$,2))
    chaine$=Right$(Chaine$, len(Chaine$) - 3)
    i=i+1
  end_while
  File_Readln 50, chaine$
next j
file_close 50
return


' SORTIE DU PROGRAMME
termine:
timer_off 2
terminate
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 50
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Ven 02 Déc 2011, 8:01 pm

Bon il y a un mieux : ça plante pas ! Wink
pas contre, quelque soit la direction que je prend, je me retrouve toujours face à un mur.
J'ai bien essayé de régénérer le laby, mais j'obtiens à chaque fois la même chose...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Ven 02 Déc 2011, 10:14 pm

Salut Nardo, bon, maintenant (en tout ca pour le moment), le programme ne génère pas de labyrinthe mais des niveau tiré aléatoirement, pour le moment, je n'ai pas implémenté le contrôle de l'ouverture de la case.
L'idée, là, c'est qu'à partir du fichier, tu ailles dans labyrinthe et tu coches éditer, tu clique sur les murs pour les ajouter ou les retirer puis tu sauvegarde.

Après, tu peux explorer.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Générateur / editeur de donjon (les débuts)   

Revenir en haut Aller en bas
 
Générateur / editeur de donjon (les débuts)
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Générateur / editeur de donjon (les débuts)
» [Projet] Générateur de Signatures
» Vidéos - générateur de code pour vidéo et player
» modérateur
» Pseudo-objet - Générateur de code

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: