Starwars 3D: moteur de perspective open source.
Posté le 10/03/2012 16:06
J'ai posté aujourd'hui mon petit add-in
Starwars 3D, réalisé en C.
Afin de guider ceux qui désirent mettre les pieds dans l'aventure de la perspective sur calculatrice, voici ici les explications du fonctionnement de ce moteur 3D.
Pour un moteur 3D, il est assez particulier puisqu'il affiche en fait des objets... 2D !
L'utilité ? Gagner considérablement en rapidité.
Pour l'organisation de l'espace, c'est simple: on le coupe en cases, et on utilise un tableau à trois dimensions: si il y a un vaisseau la case vaut 1, sinon 0.
La fonction d'affichage parcourt ce tableau et affiche un vaisseau si elle lit 1.
Les objets à afficher en perspective sont codés en un tableau à deux dimensions: les abscisses des points et leurs ordonnées.
Lorsqu'on veut afficher un objet on envoie ses trois coordonnées à une fonction qui le réduit d'un coefficient calculé à partir de la profondeur de l'objet, et l'affiche à l'écran.
Pour voir la structure du programme et mieux assimiler ces explications, téléchargez sur
sa page le zip contenant les sources et ouvrez starwars.c.
Bonne lecture de mon petit code à tous !
Citer : Posté le 10/03/2012 16:08 | #
Et n'hésitez pas à poser vos questions sur le code ici, et sur le jeu dans les commentaires du jeu.
Citer : Posté le 10/03/2012 16:09 | #
Vectoriel?
Citer : Posté le 10/03/2012 16:16 | #
De quoi ?
Citer : Posté le 10/03/2012 16:24 | #
C'est bizarre de mettre les commentaires qui donnent des infos sur la fonction après la fonction
Pour les images de 128 pixels de large, il serait bien plus efficace de les copier avec un simple memcpy.
Globalement le code est bien commenté, mais pas très bien organisé, t'as des tableaux de données un peu partout.
Citer : Posté le 10/03/2012 16:33 | #
Pourquoi un memcpy , J'ai pas besoin de copier des tableaux.
Mais c'est sûr mes codes ne valent pas les tiens...
Citer : Posté le 10/03/2012 16:51 | #
C'est du vecto, les graphismes? (comme du xyLine en drawstat)
Citer : Posté le 10/03/2012 16:58 | #
Comment tu fais un tableau 3d ?
Avec plusieurs tableaux 2D ?
Citer : Posté le 10/03/2012 17:20 | #
Je pense qu'il utilise plusieurs tableaux 2D, chacun correspondant à une position Z (la profondeur).
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 10/03/2012 17:29 | #
Je fais un tableau à trois dimensions:
int exemple[A][C] avec A, B et C trois entiers positifs.
Citer : Posté le 10/03/2012 17:31 | #
Ok j'ai a peu près compris comment fonctionne l'affichage. Bien joué.
Eiyo: C'est un peu le même principe que du vectoriel sauf que c'est des points et pas des lignes.
Ajouté le 10/03/2012 à 17:33 :
Juste une question: pourquoi avoir mis \"espace\" en variable globale ?
Calculatrice: Graph 35+ (modifiée 75) + graph 75
Dead Labs est sorti ! N'hésitez pas à l'essayer et à voter !!!
Citer : Posté le 10/03/2012 17:36 | #
Parce que le passage de tableaux à trois dimensions à des fonctions est souvent sources d'erreurs pour les pas doués comme moi
Citer : Posté le 10/03/2012 17:52 | #
Ça:
fonction(espace);
void fonction(int *espace)
{
espace[x][y][z] = 0;
}
Ou ça:
void fonction(int* *espace)
{
*espace[x][y][z] = 0;
}
devrait fonctionner sans problème (théoriquement)
Calculatrice: Graph 35+ (modifiée 75) + graph 75
Dead Labs est sorti ! N'hésitez pas à l'essayer et à voter !!!
Citer : Posté le 10/03/2012 18:11 | #
Dans la pratique on s'encombre avec des pointeurs. Si j'avais fait en C++ j'aurais mis une référence et l'utilisation aurait été normale, mais là je trouve pas ma solution trop sale.
Citer : Posté le 10/03/2012 19:51 | #
@Louloux : La VRAM est un tableau, ton image est un tableau. Donc copier une image de 128 de large à l'abscisse 0 peut se faire avec memcpy, et ce sera bien plus rapide qu'avec une fonction de sprite qui est prévue pour gérer le clipping et des coordonnées quelconques.
@Catrix : Un tableau 2D est une liste de tableaux 1D. Un tableau 3D est une liste de tableaux 2D. etc
@Adbook : Non, t'es 2 codes sont faux.
Il y a 2 sortes de tableaux 2D en réalité. Un tableau 2D peut être :
-> Une liste de pointeurs vers des tableaux 1D, qui ne sont pas forcément à la suite dans la mémoire, et qui ne font pas forcément la même longueur.
-> Un tableau simple avec toutes les données à la suite mais qu'on a déclaré avec 2 dimensions.
Le premier est un pointeur de pointeur, le second un simple pointeur.
Exemple :
int b[] = {4, 5, 6};
int* tableau_type1[2];
tableau_type1[0] = a;
tableau_type1[1] = b;
Si par contre je crée un tableau ainsi :
Quand je dis que la fonction a besoin de cette information, en réalité c'est le compilateur qui en a besoin, pour compiler correctement la fonction.
KrtX Invité
Citer : Posté le 11/03/2012 00:39 | #
Ok. Merci pour m'explication
Citer : Posté le 11/03/2012 21:32 | #
Pour l'organisation de l'espace, étant donné que il y a juste à gérer la perspective, tu aurais pu faire plus simple il me semble.
En utilisant simplement un tableau 2D : tie[nbmax_de_chasseur][4]
On aurait donc un tableau de par exemple 6 colonnes pour 4 lignes.
La première ligne contient 1 si la colonne contient un chasseur tie sinon 0.
La deuxième ligne contient la coordonnées X du chasseur.
La troisième ligne contient la coordonnées Y du chasseur.
La quatrième ligne contient la coordonnées Z du chasseur.
Ensuite l'utilisation d'un tel tableau est très simple.
Tu choisis un nombre aléatoire de chasseur. Tu affectes les colonnes, puis à chaque itération tu augmentes la quatrième ligne.
Si elle est égale à celle du X-wing, tu check et tu supprimes la colonne en mettant 0 dans la première case.
Je sais pas si je me suis bien exprimé, mais c'est très similaire à ce qu'on pourrait faire en basic. Ca évite de devoir consulter tout l'espace à chaque fois.
Escape prison
Bloxorz
Free wheel
QR code
Nombre en or
RayCasting Engine
Mario Party
Zelda
et Planète Casio
Citer : Posté le 12/03/2012 17:14 | #
C'est effectivement un moyen, mais on perd en clarté, et la vitesse ne manque pas j'ai mis un ralentisseur
En tout cas merci pour ta collaboration et tes idées.
Citer : Posté le 13/03/2012 13:04 | #
Je trouve ton jeu plutôt bien fait et les graphismes sont sympathiques.
Par contre, je rejoins les autres, les vaisseaux arrivent vraiment trop vite, et on se lasse de perdre aussi rapidement.
Citer : Posté le 13/03/2012 13:53 | #
je vais le tester, ces commentaires piquent ma curiositée
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)