GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

SIMPLE/BASIC : Concevoir un Univers 3D en Basic

5 participants

Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par wulf Ven 15 Juil 2022, 15:26

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


Dernière édition par wulf le Sam 16 Juil 2022, 09:41, édité 1 fois
avatar
wulf
Patient incurable

Masculin Nombre de messages : 1544
Age : 52
Localisation : --
Date d'inscription : 28/08/2008

Anarwax offre 1 suppo à ce post!

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par Anarwax Ven 15 Juil 2022, 17:37

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 !
Anarwax
Anarwax
Docteur *
Docteur *

Masculin Nombre de messages : 21061
Age : 47
Localisation : Bretagne
Date d'inscription : 06/09/2012

wulf offre 1 suppo à ce post!

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par drfloyd Sam 16 Juil 2022, 08:00

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.

_______________________________________________________
SIMPLE/BASIC : Concevoir un Univers 3D en Basic Americ10




drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 184462
Age : 55
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

wulf et Anarwax offrent 1 suppo à ce post!

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par Copper Sam 16 Juil 2022, 09:20

Bonen idée de topic par contre on peut aussi faire directement un tableau à 3 dimensions...
Copper
Copper
Docteur *
Docteur *

Masculin Nombre de messages : 7613
Age : 48
Localisation : FRANCE
Date d'inscription : 02/11/2020

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par wulf Sam 16 Juil 2022, 09:37

@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
avatar
wulf
Patient incurable

Masculin Nombre de messages : 1544
Age : 52
Localisation : --
Date d'inscription : 28/08/2008

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par Copper Sam 16 Juil 2022, 09:43

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
Copper
Copper
Docteur *
Docteur *

Masculin Nombre de messages : 7613
Age : 48
Localisation : FRANCE
Date d'inscription : 02/11/2020

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par drfloyd Sam 16 Juil 2022, 23:44

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  Mr. Green

_______________________________________________________
SIMPLE/BASIC : Concevoir un Univers 3D en Basic Americ10




drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 184462
Age : 55
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par wulf Dim 17 Juil 2022, 11:25

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.
avatar
wulf
Patient incurable

Masculin Nombre de messages : 1544
Age : 52
Localisation : --
Date d'inscription : 28/08/2008

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par drfloyd Lun 18 Juil 2022, 21:29

bah tous les basics font ça

_______________________________________________________
SIMPLE/BASIC : Concevoir un Univers 3D en Basic Americ10




drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 184462
Age : 55
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par lincruste Lun 18 Juil 2022, 23:14

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
lincruste
Interne
Interne

Masculin Nombre de messages : 5619
Age : 45
Localisation : RP
Date d'inscription : 07/06/2014

Anarwax offre 1 suppo à ce post!

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par drfloyd Lun 18 Juil 2022, 23:26

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   thumleft

_______________________________________________________
SIMPLE/BASIC : Concevoir un Univers 3D en Basic Americ10




drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 184462
Age : 55
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

SIMPLE/BASIC : Concevoir un Univers 3D en Basic Empty Re: SIMPLE/BASIC : Concevoir un Univers 3D en Basic

Message par Copper Mar 19 Juil 2022, 08:57

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
Copper
Docteur *
Docteur *

Masculin Nombre de messages : 7613
Age : 48
Localisation : FRANCE
Date d'inscription : 02/11/2020

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum