SIMPLE/BASIC : Concevoir un Univers 3D en Basic
5 participants
Page 1 sur 1
SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Bonjour
Je propose de lancer une serie de topics de programmation en Basic afin d’échanger (et de comparer) nos astuces (simples)
Cela pourrait compenser la « compétition » 10 lignes qui a pris l’eau.
Ici aucune contrainte, aucune compet ‘ non plus. Juste l’envie de dire « Tiens, j’ai un truc pour faire cela », et de l’expliquer dans un langage qui reste accessible même aux non-programmeurs afin de donner envie à ceux qui n’ont jamais essayé de se lancer.
Je propose une routine qui simule les déplacements d’un objet dans un univers 3D.
On peut donc aller de droite à gauche, monter et descendre, avancer et reculer. En algèbre, on aurait donc des coordonnées x,y,z
Je ne vais pas retenir l’algèbre, je laisse le soin à d’autres de nous livrer leurs astuces avec ces 3 coordonnées. Pour ma part, j’exploite une astuce révélée (et adaptée à ma sauce) dans un livre intitulé « Aventures graphiques sur Spectrum » , et qui simulait un donjon de 300 cases sur 3 niveaux.
Je vous explique cette routine en 3 étapes
1: Penser en 3D
2: Déplacer l’objet
3: Poser les limites de l’univers connu (ne pas sortir du cadre)
Il s’agit d’utiliser l’instruction DIM (commune à tous les Basic) qui crée un tableau de X cases.
On va l’utiliser pour simuler les déplacements d’un sous-marin. Il pourra donc aller de droite à gauche, monter et faire surface, descendre et toucher le fond, avancer et reculer.
Restons sur un univers limité pour cette démonstration. Notre océan fera 250 cases :
DIM ocean(250)
Ça y’est, on l’a crée. Mais pour l’instant notre océan n’est qu’une suite continue de 250 cases : 1-2-3-4-5-6-7-8-9-10-11-12….249-250
ETAPE 1 :PENSER EN 3D
Certes, on peut considérer ces 250 cases comme la suite d’une seule et même ligne, on peut aussi les voir de la manière suivante:
Considérons que notre océan fait 5 cases de largeur, 10 cases de profondeur (oui c’est un petit océan)
Et on se le représente comme ça:
1- 2- 3- 4- 5
6- 7- 8- 9- 10
11-12-13-14-15
16 -20
. .
. .
. .
46-47-48-49-50
Vous voyez le truc ? Positionnons notre sous-marin dans la case 3. S’il veut aller à gauche, on fait -1 , et il se retrouve dans la case 2. S’il veut aller à droite, on fait +1 et il se retrouve dans la case 4. S’il veut descendre , on fait +5 et il se retrouve dans la case 8. Il veut remonter ? Hop -5 et le revoilà en case 3. Voila l’astuce.
Hé, mais dites vous, c’est bien gentil là, mais on a que 50 cases , où sont les autres ? On est sur une simple grille, où est l’univers 3D ? On nous ment, on nous spolie !
Et bien du calme, considérons que nos 250 cases sont organisées en 5 grilles de 50 (5*50=250) et le tour est joué, cela nous permet d’ajouter l’axe Z qui nous manquait.
Considérez que les 5 grilles sont organisées en 5 plans qui se superposent, comme 5 feuilles de papier posées l’une sur l’autre.
On va voir comment ça s’organise dans le chapitre suivant.
ETAPE 2: DEPLACER L’OBJET (we all live in a yellow submarine)
Bon d’abord, on va commencer a remplir l’océan de flotte. Toutes les cases libres où il y a de l’eau sont affectées de la valeur 0
FOR N=1 TO 250: LET ocean (N)=0:NEXT N
Notre sous-marin aura la valeur 1. Et on le place en case 3 pour commencer.
LET ocean(3)=1
Très pratique ces cases qui prennent la valeur que l’on veut, car plus tard, on pourra utiliser d’autres variables pour cacher des mines sous-marine dans notre grille ou ajouter du relief sur le fond, mais on verra ça plus tard. C’est pour vous garder un peu.
Et maintenant, on va déplacer notre sous marin.
On va définir le numéro de case qu’il occupe en combinant 3 variables
C pour la Colonne où il se trouve (colonnes de 1 à 5, c’est l’axe X)
L pour la Ligne où il se trouve (lignes de 0 à 9, c’est l’axe Y)
P pour le Plan où il se trouve (Plan de 0 à 4, c’est l’axe Z)
Et la formule qui définit sa position s’écrit ainsi
LET SUB=(P*50)+(L*5)+C
Exemple notre sous-marin est en case 3, c’est à dire qu’il est au 1er plan (plan 0), sur la première ligne (qui est la ligne 0) , et sur la 3° colonne (3)
Sa valeur est (0*50)+(0*5)+3… ce qui donne bien 3
On va bouger, on descend d’un cran. Autrement dit on descend d’une colonne. Souvenez vous comme notre grille est organisée. On va donc se retrouver en case 8
On modifie la variable L en lui mettant + 1
Let L=L+1
Ce qui donne
LET SUB= (P*50)+(L*5)+C
Autrement dit (0*50)+(1*5)+ 3 = 8. Ouais, on est bien maintenant dans la case 8 , une ligne plus bas
On va maintenant avancer. On change donc de plan en augmentant la valeur P
On avance avec LET P=P+1
Ce qui donne
LET SUB= (P*50)+(L*5)+C
Autrement dit (1*50)+(1*5)+ 3 = 50+5+3 =58. Nous sommes dans la case 58 , un plan plus loin.
On descend et on avance encore ?
LET: L=L+1 : LET P=P+1
LET SUB= (P*50)+(L*5)+C
Ce qui donne (2*50)+(2*5)+3 . Nous sommes en case 113
Bon, vous avez compris le principe.
Et pour matérialiser tout cela dans notre grille ?
Rien de plus simple. D’abord avant d’autoriser le déplacement on copie notre position dans une autre variable: OLDSUB= SUB
Si le déplacement est accepté (ce que l’on va voir ensuite)
Ocean(SUB)=1 (on occupe la case désignée par notre déplacement
Ocean(OLDSUB)=0 (on libere la case que l’on occupait)
ETAPE 3 : ON POSE LES LIMITES (non mais, ho!)
Comme dirait Elie Seimoun « apprenez jeune homme qu’il y a des limites à ne pas franchir.. » en l’occurence celle de notre aquarium, pardon Océan
Bon rien de très compliqué, il s’agit de ne pas s’envoler au delà de la surface, descendre plus bas que le fond, sortir du cadre
Pour la limite « haute » : quand on remonte , on décrémente (-1) notre valeur L (ligne)
LET L=L-1: IF L<0 THEN LET L=0
On aura beau insister , on ira pas plus haut que le bord
Quand on descend
LET L=L+1: IF L>9 THEN LET L=9. Le sous-marin n’est pas une pelleteuse
Pour les déplacements latéraux C sera toujours compris entre 1 et 5 selon le même principe
Pour avancer/ reculer : idem , le Plan sera toujours compris entre 0 et 4
On recule:
LET P=P-1: IF P<0 THEN LET P=0 . Vous ne crèverez pas l’écran
On avance :
LET P=P+1:IF P>4 THEN LET P=4… si tu avances et tu recules, fais attention, fais attention aux tentacules …
POUR AGREMENTER LE TOUT
Voila, vous avez la mécanique du jeu, a vous maintenant de l’adapter à votre goût
L’avantage de l’utilisation d’une chaine DIM est de pouvoir donner plein de valeurs à nos cases, et donc de créer des trucs
On peut au début du jeu placer de manière aléatoire 10 mines sous marine dans notre grille (valeur 2) , puis dissimuler un trésor (valeur 3) et tenter de trouver l’un en évitant les autres
On peut aussi créer du relief sur les « cases du fond » , autrement dit poser des valeurs sur les valeurs qui terminent chaque plan (46-50)/(96-100)-(145-150)..etc
On peut créer un ennemi qui se déplace aussi..
Mon jeu sur ST « Pathfinder » fonctionne principalement sur ce principe, mais j’en garde les petits secrets (pas difficiles à trouver) pour moi.
Amusez-vous bien. Vos remarques sont les bienvenues.
Et si vous voulez balancer dans un autre topic « SimpleBasic » vos astuces pour créer un shmup, une route 3D, ou CosmosChronicles en 1KO sur ZX81, Lachez-vous
Je propose de lancer une serie de topics de programmation en Basic afin d’échanger (et de comparer) nos astuces (simples)
Cela pourrait compenser la « compétition » 10 lignes qui a pris l’eau.
Ici aucune contrainte, aucune compet ‘ non plus. Juste l’envie de dire « Tiens, j’ai un truc pour faire cela », et de l’expliquer dans un langage qui reste accessible même aux non-programmeurs afin de donner envie à ceux qui n’ont jamais essayé de se lancer.
Je propose une routine qui simule les déplacements d’un objet dans un univers 3D.
On peut donc aller de droite à gauche, monter et descendre, avancer et reculer. En algèbre, on aurait donc des coordonnées x,y,z
Je ne vais pas retenir l’algèbre, je laisse le soin à d’autres de nous livrer leurs astuces avec ces 3 coordonnées. Pour ma part, j’exploite une astuce révélée (et adaptée à ma sauce) dans un livre intitulé « Aventures graphiques sur Spectrum » , et qui simulait un donjon de 300 cases sur 3 niveaux.
Je vous explique cette routine en 3 étapes
1: Penser en 3D
2: Déplacer l’objet
3: Poser les limites de l’univers connu (ne pas sortir du cadre)
Il s’agit d’utiliser l’instruction DIM (commune à tous les Basic) qui crée un tableau de X cases.
On va l’utiliser pour simuler les déplacements d’un sous-marin. Il pourra donc aller de droite à gauche, monter et faire surface, descendre et toucher le fond, avancer et reculer.
Restons sur un univers limité pour cette démonstration. Notre océan fera 250 cases :
DIM ocean(250)
Ça y’est, on l’a crée. Mais pour l’instant notre océan n’est qu’une suite continue de 250 cases : 1-2-3-4-5-6-7-8-9-10-11-12….249-250
ETAPE 1 :PENSER EN 3D
Certes, on peut considérer ces 250 cases comme la suite d’une seule et même ligne, on peut aussi les voir de la manière suivante:
Considérons que notre océan fait 5 cases de largeur, 10 cases de profondeur (oui c’est un petit océan)
Et on se le représente comme ça:
1- 2- 3- 4- 5
6- 7- 8- 9- 10
11-12-13-14-15
16 -20
. .
. .
. .
46-47-48-49-50
Vous voyez le truc ? Positionnons notre sous-marin dans la case 3. S’il veut aller à gauche, on fait -1 , et il se retrouve dans la case 2. S’il veut aller à droite, on fait +1 et il se retrouve dans la case 4. S’il veut descendre , on fait +5 et il se retrouve dans la case 8. Il veut remonter ? Hop -5 et le revoilà en case 3. Voila l’astuce.
Hé, mais dites vous, c’est bien gentil là, mais on a que 50 cases , où sont les autres ? On est sur une simple grille, où est l’univers 3D ? On nous ment, on nous spolie !
Et bien du calme, considérons que nos 250 cases sont organisées en 5 grilles de 50 (5*50=250) et le tour est joué, cela nous permet d’ajouter l’axe Z qui nous manquait.
Considérez que les 5 grilles sont organisées en 5 plans qui se superposent, comme 5 feuilles de papier posées l’une sur l’autre.
On va voir comment ça s’organise dans le chapitre suivant.
ETAPE 2: DEPLACER L’OBJET (we all live in a yellow submarine)
Bon d’abord, on va commencer a remplir l’océan de flotte. Toutes les cases libres où il y a de l’eau sont affectées de la valeur 0
FOR N=1 TO 250: LET ocean (N)=0:NEXT N
Notre sous-marin aura la valeur 1. Et on le place en case 3 pour commencer.
LET ocean(3)=1
Très pratique ces cases qui prennent la valeur que l’on veut, car plus tard, on pourra utiliser d’autres variables pour cacher des mines sous-marine dans notre grille ou ajouter du relief sur le fond, mais on verra ça plus tard. C’est pour vous garder un peu.
Et maintenant, on va déplacer notre sous marin.
On va définir le numéro de case qu’il occupe en combinant 3 variables
C pour la Colonne où il se trouve (colonnes de 1 à 5, c’est l’axe X)
L pour la Ligne où il se trouve (lignes de 0 à 9, c’est l’axe Y)
P pour le Plan où il se trouve (Plan de 0 à 4, c’est l’axe Z)
Et la formule qui définit sa position s’écrit ainsi
LET SUB=(P*50)+(L*5)+C
Exemple notre sous-marin est en case 3, c’est à dire qu’il est au 1er plan (plan 0), sur la première ligne (qui est la ligne 0) , et sur la 3° colonne (3)
Sa valeur est (0*50)+(0*5)+3… ce qui donne bien 3
On va bouger, on descend d’un cran. Autrement dit on descend d’une colonne. Souvenez vous comme notre grille est organisée. On va donc se retrouver en case 8
On modifie la variable L en lui mettant + 1
Let L=L+1
Ce qui donne
LET SUB= (P*50)+(L*5)+C
Autrement dit (0*50)+(1*5)+ 3 = 8. Ouais, on est bien maintenant dans la case 8 , une ligne plus bas
On va maintenant avancer. On change donc de plan en augmentant la valeur P
On avance avec LET P=P+1
Ce qui donne
LET SUB= (P*50)+(L*5)+C
Autrement dit (1*50)+(1*5)+ 3 = 50+5+3 =58. Nous sommes dans la case 58 , un plan plus loin.
On descend et on avance encore ?
LET: L=L+1 : LET P=P+1
LET SUB= (P*50)+(L*5)+C
Ce qui donne (2*50)+(2*5)+3 . Nous sommes en case 113
Bon, vous avez compris le principe.
Et pour matérialiser tout cela dans notre grille ?
Rien de plus simple. D’abord avant d’autoriser le déplacement on copie notre position dans une autre variable: OLDSUB= SUB
Si le déplacement est accepté (ce que l’on va voir ensuite)
Ocean(SUB)=1 (on occupe la case désignée par notre déplacement
Ocean(OLDSUB)=0 (on libere la case que l’on occupait)
ETAPE 3 : ON POSE LES LIMITES (non mais, ho!)
Comme dirait Elie Seimoun « apprenez jeune homme qu’il y a des limites à ne pas franchir.. » en l’occurence celle de notre aquarium, pardon Océan
Bon rien de très compliqué, il s’agit de ne pas s’envoler au delà de la surface, descendre plus bas que le fond, sortir du cadre
Pour la limite « haute » : quand on remonte , on décrémente (-1) notre valeur L (ligne)
LET L=L-1: IF L<0 THEN LET L=0
On aura beau insister , on ira pas plus haut que le bord
Quand on descend
LET L=L+1: IF L>9 THEN LET L=9. Le sous-marin n’est pas une pelleteuse
Pour les déplacements latéraux C sera toujours compris entre 1 et 5 selon le même principe
Pour avancer/ reculer : idem , le Plan sera toujours compris entre 0 et 4
On recule:
LET P=P-1: IF P<0 THEN LET P=0 . Vous ne crèverez pas l’écran
On avance :
LET P=P+1:IF P>4 THEN LET P=4… si tu avances et tu recules, fais attention, fais attention aux tentacules …
POUR AGREMENTER LE TOUT
Voila, vous avez la mécanique du jeu, a vous maintenant de l’adapter à votre goût
L’avantage de l’utilisation d’une chaine DIM est de pouvoir donner plein de valeurs à nos cases, et donc de créer des trucs
On peut au début du jeu placer de manière aléatoire 10 mines sous marine dans notre grille (valeur 2) , puis dissimuler un trésor (valeur 3) et tenter de trouver l’un en évitant les autres
On peut aussi créer du relief sur les « cases du fond » , autrement dit poser des valeurs sur les valeurs qui terminent chaque plan (46-50)/(96-100)-(145-150)..etc
On peut créer un ennemi qui se déplace aussi..
Mon jeu sur ST « Pathfinder » fonctionne principalement sur ce principe, mais j’en garde les petits secrets (pas difficiles à trouver) pour moi.
Amusez-vous bien. Vos remarques sont les bienvenues.
Et si vous voulez balancer dans un autre topic « SimpleBasic » vos astuces pour créer un shmup, une route 3D, ou CosmosChronicles en 1KO sur ZX81, Lachez-vous
Dernière édition par wulf le Sam 16 Juil 2022, 09:41, édité 1 fois
wulf- Patient incurable
- Nombre de messages : 1544
Age : 52
Localisation : --
Date d'inscription : 28/08/2008
Anarwax offre 1 suppo à ce post!
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Très bonne idée ton tuto !!!
oui j'utilisais les tableaux moi aussi pour créer soit des labyrinthes genre JDR, soit des mondes extérieurs où chaque valeur d'une case du tableau correspondait à un élément de décor, par exemple un arbre. Génial et simple pour créer un monde aléatoire !
oui j'utilisais les tableaux moi aussi pour créer soit des labyrinthes genre JDR, soit des mondes extérieurs où chaque valeur d'une case du tableau correspondait à un élément de décor, par exemple un arbre. Génial et simple pour créer un monde aléatoire !
Anarwax- Docteur *
- Nombre de messages : 21061
Age : 47
Localisation : Bretagne
Date d'inscription : 06/09/2012
wulf offre 1 suppo à ce post!
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Génial comme idée de topic, j'essayerai de participer si je trouve le temps.
Le 10lignopat ce fut comme pour une star du rock, un succès de dingue, puis l'oubli et la déchéance. Un grand moment de 2021.
Le 10lignopat ce fut comme pour une star du rock, un succès de dingue, puis l'oubli et la déchéance. Un grand moment de 2021.
_______________________________________________________
wulf et Anarwax offrent 1 suppo à ce post!
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Bonen idée de topic par contre on peut aussi faire directement un tableau à 3 dimensions...
Copper- Docteur *
- Nombre de messages : 7613
Age : 48
Localisation : FRANCE
Date d'inscription : 02/11/2020
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
@copper , oui c'est exact. Sur Spectrum (pour rester sur cet exemple) on peut utiliser l'instruction DIM avec une deuxième "dimension" , exemple DIM océan (250,10) , mais je ne maitrise pas trop le concept. Si tu veux nous éclairer, c'est youpi
wulf- Patient incurable
- Nombre de messages : 1544
Age : 52
Localisation : --
Date d'inscription : 28/08/2008
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Tu peux même faire 3 dimensions...
Tu déclares ton tableau comme ceci : DIM ocean(5,10,5)
Ensuite tu peux y accéder LET ocean(x,y,z) = 1
IF ocean(x,y,z) = 1 THEN
Tu déclares ton tableau comme ceci : DIM ocean(5,10,5)
Ensuite tu peux y accéder LET ocean(x,y,z) = 1
IF ocean(x,y,z) = 1 THEN
Copper- Docteur *
- Nombre de messages : 7613
Age : 48
Localisation : FRANCE
Date d'inscription : 02/11/2020
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Copper a écrit:Bonen idée de topic par contre on peut aussi faire directement un tableau à 3 dimensions...
je n'osais pas le dire
_______________________________________________________
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Je viens de me replonger dans le très laconique "guide de l'utilisateur" du zx spectrum+ , en effet il est possible de créer un DIM ocean(x,y,z). leur explication est tellement mal foutue que je n'y avais rien compris. Déso.
wulf- Patient incurable
- Nombre de messages : 1544
Age : 52
Localisation : --
Date d'inscription : 28/08/2008
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
bah tous les basics font ça
_______________________________________________________
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
Je trouve ça très respectable de trouver sa propre sauce quitte à réinventer la roue ou même dans le cas présent de compenser une lacune par une réelle preuve d'ingéniosité. Très bien joué.
lincruste- Interne
- Nombre de messages : 5619
Age : 45
Localisation : RP
Date d'inscription : 07/06/2014
Anarwax offre 1 suppo à ce post!
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
lincruste a écrit:Je trouve ça très respectable de trouver sa propre sauce quitte à réinventer la roue ou même dans le cas présent de compenser une lacune par une réelle preuve d'ingéniosité. Très bien joué.
C'est vrai
_______________________________________________________
Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic
C'est pas mal de savoir simuler un tableau à 3 dimensions avec un tableau à 1 dimension mais bon en BASIC je ne pense pas que cela soit intéressant niveau perfs surtout quand les calculs nécessaires sont effectués en virgule flottante d'ailleurs...
Copper- Docteur *
- Nombre de messages : 7613
Age : 48
Localisation : FRANCE
Date d'inscription : 02/11/2020
Sujets similaires
» [BLITZ BASIC] le topic officiel du meilleur basic au monde ?
» [BASIC QB64] le topic officiel du meilleur basic au monde ?
» UG BASIC, le basic micro 8bit miracle ?
» X11 Basic (GFA Basic style)
» CPC BASIC ?
» [BASIC QB64] le topic officiel du meilleur basic au monde ?
» UG BASIC, le basic micro 8bit miracle ?
» X11 Basic (GFA Basic style)
» CPC BASIC ?
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum