Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Générateur / editeur de donjon (les débuts) | |
| | |
Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Générateur / editeur de donjon (les débuts) Sam 26 Nov 2011 - 13:35 | |
| 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 - 16:42, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Sam 26 Nov 2011 - 15:41 | |
| 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 | |
| | | bignono
Nombre de messages : 1127 Age : 66 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Sam 26 Nov 2011 - 17:14 | |
| 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
| |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Sam 26 Nov 2011 - 18:52 | |
| 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 ... | |
| | | bignono
Nombre de messages : 1127 Age : 66 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Sam 26 Nov 2011 - 19:31 | |
| Oups! effectivement, elle sert même à rien du tout ! mille excuses . donc t'avais oublié qu'un seul truc. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Sam 26 Nov 2011 - 20:37 | |
| 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
| |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Dim 27 Nov 2011 - 1:04 | |
| 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 | |
| | | bignono
Nombre de messages : 1127 Age : 66 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Dim 27 Nov 2011 - 9:16 | |
| 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 bin_and et c'est pareil pour bin_or et bin_xor. 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? 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? Si quelqu'un peut m'expliquer ou me donner un lien vers une aide à ce sujet, je serais content. Merci d'avance. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Dim 27 Nov 2011 - 10:02 | |
| 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 | |
| | | bignono
Nombre de messages : 1127 Age : 66 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Dim 27 Nov 2011 - 15:29 | |
| 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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Dim 27 Nov 2011 - 15:35 | |
| 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 - 1:02, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Dim 27 Nov 2011 - 15:46 | |
| 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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Mer 30 Nov 2011 - 1:11 | |
| 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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Mer 30 Nov 2011 - 13:56 | |
| 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) ) | |
| | | bignono
Nombre de messages : 1127 Age : 66 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Un monstre Mer 30 Nov 2011 - 19:54 | |
| 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. Le lien de téléchargement ci-après... [url= http://www.megaupload.com/?d=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 | |
| | | 659_minifly
Nombre de messages : 590 Age : 75 Localisation : Valenciennes Nord Date d'inscription : 29/04/2010
| Sujet: Re: Générateur / editeur de donjon (les débuts) Mer 30 Nov 2011 - 20:08 | |
| | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Mer 30 Nov 2011 - 21:11 | |
| Merci à vous deux Je regarde ça ce soir après mangé | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Jeu 1 Déc 2011 - 10:48 | |
| 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. | |
| | | jpcr
Nombre de messages : 276 Age : 57 Localisation : Val de Marne (94) Date d'inscription : 06/05/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Jeu 1 Déc 2011 - 11:33 | |
| ben dis donc Jicehel , on t'arrete plus | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Jeu 1 Déc 2011 - 11:56 | |
| Ben le programme de bignono m'a bien plus et m'a donné envie de m'y remettre un peu 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 ... ), 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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Ven 2 Déc 2011 - 0:22 | |
| 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) | |
| | | Nardo26
Nombre de messages : 2294 Age : 55 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Générateur / editeur de donjon (les débuts) Ven 2 Déc 2011 - 1:48 | |
| J'arrive pas à faire fonctionner ton prog: Explore_Donjon erreur en ligne 115 : T_Cases non identifié...
| |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Ven 2 Déc 2011 - 7:25 | |
| 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 | |
| | | Nardo26
Nombre de messages : 2294 Age : 55 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Générateur / editeur de donjon (les débuts) Ven 2 Déc 2011 - 19:01 | |
| Bon il y a un mieux : ça plante pas ! 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... | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur / editeur de donjon (les débuts) Ven 2 Déc 2011 - 21:14 | |
| 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. | |
| | | Contenu sponsorisé
| Sujet: Re: Générateur / editeur de donjon (les débuts) | |
| |
| | | | Générateur / editeur de donjon (les débuts) | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |