Posté le 25/03/2019 19:45
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 81 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 27/03/2019 17:04 | #
Ah oui, il n'y as pas d'erreur de compile, le programme en C n'as pas le même résultat que celui en Basic et pourtant il me semble n'avoir rien oublié
Ajouté le 27/03/2019 à 17:10 :
En fait il y a ma map stockée dans le tableau du début du programme (tableau "map" et matrice A pour le prgm basic). J'ai mon personnage qui peut se déplacer à l'écran et dans le tableau/matrice en même temps (écran et tableau/matrice on la même taille de 21*7) et le programme affiche les "murs" (représentés pas les "1" dans mon tableau/matrice) qui se trouvent dans un chap de vision allant de -30° à 30° par rapport à la direction dans laquelle regarde mon personnage. Ces murs sont représentés à l'écran par de simples "1". Le tout en radians. (pour les -30° et 30° j'ai pris -1/6*PI et 1/6*PI).
-Planétarium 2
Citer : Posté le 27/03/2019 17:12 | #
Oof.
Sinon ça vient probablement du fait que ton tableau n'est pas un tableau
Tableau : map[2][3] = {{1,2,3},{1,2,3}}
Pas tableau : map[2][3] = {1,2,3,1,2,3}
Citer : Posté le 27/03/2019 17:13 | #
Ah... et pourquoi
Oof.
?
Je suis plus ou moins débutant en C, je ne connais pas toutes les astuces
-Planétarium 2
Citer : Posté le 27/03/2019 17:15 | #
Je ne connais pas le C, mais je pense que déclarer plusieurs variables sur une seule ligne n'est pas le plus lisible, surtout que c'est un langage compilé.
Citer : Posté le 27/03/2019 17:19 | #
Ca ne m'affiche toujours pas ce que je souhaite.
Edit: J'ai oublié de dire que ma rotation ne fonctionnait pas.. je pense que les deux sont liés..
Ajouté à cela, je ne sais pas pourquoi mais les conditions qui se trouvent après les deux utilisées pour avancer et reculer ne fonctionnent pas.. les touches ne répondent pas ?
Edit: Voici le code maj:
#include "MonochromeLib.h"
#include "math.h"
//****************************************************************************
// AddIn_main (Sample program main function)
//
// param : isAppli : 1 = This application is launched by MAIN MENU.
// : 0 = This application is launched by a strip in eACT application.
//
// OptionNum : Strip number (0~3)
// (This parameter is only used when isAppli parameter is 0.)
//
// retval : 1 = No error / 0 = Error
//
//****************************************************************************
int AddIn_main(int isAppli, unsigned short OptionNum)
{
double PI = 3.1415926535897932;
double r = 0, angleCam = 0, camX = 15, camY = 4, distRayon = 0, angleRayon = 0 ;
unsigned int key;
int map[7] [21] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
ML_clear_vram();
do{
ML_clear_vram();
ML_clear_screen();
//Calculs de deplacements
camX = camX+r*(cos(angleCam));
camY = camY+r*(sin(angleCam));
r = 0;
//Personnage
locate(camX, camY);
Print((unsigned char*)"+");
//Rayons de detection
for(angleRayon = angleCam-(1/6*PI); angleRayon<angleCam+(1/6*PI); angleRayon = angleRayon+(1/60*PI))
{
for(distRayon = 0; distRayon<20; distRayon++)
{
if(map[(int) (distRayon*sin(angleRayon)+camY)] [(int) (distRayon*cos(angleRayon)+camX)] == 1)
{
locate((int)(distRayon*cos(angleRayon)+camX), (int)(distRayon*sin(angleRayon)+camY));
Print((unsigned char*)"1");
break;
}
}
}
ML_display_vram();
while(GetKey( &key)){return 0;}
//Commandes
if(IsKeyDown(KEY_CTRL_UP))
{
r++;
}
if(IsKeyDown(KEY_CTRL_DOWN))
{
r--;
}
if(IsKeyDown(KEY_CTRL_F1))
{
angleCam = angleCam+(1/4*PI);
//locate(1,1);
//Print((unsigned char*)"OK");
}
if(IsKeyDown(KEY_CTRL_F6))
{
angleCam = angleCam-(1/4*PI);
}
}while (! IsKeyDown(KEY_CTRL_MENU));
return 1;
}
-Planétarium 2
Citer : Posté le 27/03/2019 19:15 | #
Tableau : map[2][3] = {{1,2,3},{1,2,3}}
Pas tableau : map[2][3] = {1,2,3,1,2,3}
Correction. Tableau à deux dimensions : map[2][3] = {{1,2,3},{1,2,3}}
Tableau à une dimension : map[2][3] = {1,2,3,1,2,3}
Ta gestion des touches est cassée, GetKey() est une fonction qui attend que toutes les touches soient relâchées, puis qu'une touche soit pressée avant de se terminer. De plus le pointeur passé en paramètre reçoit le numéro de la touche. Il faut donc écrire :
//Commandes
if(key == KEY_CTRL_UP)
{
r++;
}
if(key == KEY_CTRL_DOWN)
{
r--;
}
if(key == KEY_CTRL_F1)
{
angleCam = angleCam+(1/4*PI);
//locate(1,1);
//Print((unsigned char*)"OK");
}
if(key == KEY_CTRL_F6)
{
angleCam = angleCam-(1/4*PI);
}
}while (key != KEY_CTRL_EXIT);
J'ai changé la condition de sortie de MENU à EXIT car, si tu appuies sur MENU pendant un appel à GetKey(), cela te ramène automatiquement au menu principal.
Citer : Posté le 27/03/2019 19:21 | #
Alors c'est mon code qui ne vas pas, quand je presse F1 ou F6, aucune rotation n'est effectuée
-Planétarium 2
Citer : Posté le 27/03/2019 23:10 | #
Correction. Tableau à deux dimensions : map[2][3] = {{1,2,3},{1,2,3}}
Tableau à une dimension : map[2][3] = {1,2,3,1,2,3}
Désolé... Maintenant j'éviterai d'affirmer des informations sur des langages que je comprends mal
Citer : Posté le 28/03/2019 14:45 | # | Fichier joint
@Disperseur
I found something to be fixed.
Here the value is zero.
1/60*PI
1/4*PI
Correctly as follows.
1.0/60*PI
1.0/4*PI
and more,
Correctly as follows.
The array of C has an index start value of 0.
So adjusted the array.
Here is the corrected source.
[Fichier joint]Test3D.c
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 28/03/2019 17:31 | #
Je suis parvenu à passer le programme en Basic en C. Merci à Sentaro21 et aux autres pour leur aide
-Planétarium 2
Citer : Posté le 28/03/2019 18:16 | # | Fichier joint
Voici en fichier joint le programme dans son état actuel en C et en Basic.
Si possible Mactul, passe ce fichier en tête du topic stp
PS:
Le programme en C est SH3
-Planétarium 2
Citer : Posté le 28/03/2019 19:00 | #
OK disperseur j'ajoute ton prog en tête de liste
Et avec plaisir!
Sell-me
Pixel
Html Intrepreter
Venez me rejoindre sur mon nouveau serveur Discord dédié a la programmation sur toutes les plateformes
https://discord.gg/bzfymHQ
Venez vous instruire, dans ce magnifique cours sur les Intelligences Artificielles que j'ai créé:
http://reseaux-neurones-a--z.ml/
Faites apprendre des choses à une machine, faites reconnaître à un ordi des images...
Citer : Posté le 28/03/2019 19:10 | #
Merci. Prends le temps de lire mon MP aussi
-Planétarium 2
Citer : Posté le 28/03/2019 19:10 | #
Fait et répondu
Sell-me
Pixel
Html Intrepreter
Venez me rejoindre sur mon nouveau serveur Discord dédié a la programmation sur toutes les plateformes
https://discord.gg/bzfymHQ
Venez vous instruire, dans ce magnifique cours sur les Intelligences Artificielles que j'ai créé:
http://reseaux-neurones-a--z.ml/
Faites apprendre des choses à une machine, faites reconnaître à un ordi des images...
Citer : Posté le 29/03/2019 11:59 | #
Comme promis dans mon dernier MP Mactul, je poursuis mes explications ici.
Dans mon MP je t'expliquais quelque chose que tu savais déjà mais que je préférais rappeler pour que l'on parte de la même base: le fonctionnement du lacé de rayons.
Peut être dois je dessiner virtuellement un décor 2D avec des pixels plus petits que la taille d'un cube de mur?
Il ne s'agit pas de ça. En fait, dans ta matrice, lieu de stockage de la map, les murs sont "codés" avec des "1" et le vide avec des "0". En fait, un "1" ne représente pas une partie d'un mur, il informe juste qu'à cet endroit, il y a un mur. Pour l'afficher c'est un autre problème qui se posera bientôt mais pas maintenant . Tes rayons ont, comme je te l'ais dit, une origine (0,0 si il n'y as pas de notion de joueur mais ici il y en as une ) qui est la position du joueur. Pour ce faire, on ajoute aux coordonnées des rayons (lors du calcul et du déplacement d'un rayon avec les deux fameuses formules de rotations) les coordonnées du joueur sur la map (matrice). On obtient quelque chose comme ça:
distanceRayon*cos(angleRayon)+posXJoueur, distanceRayon*sin(angleRayon)+posYJoueur //Coordonnées du pointeur qui évolue dans la matrice en X,Y ici.
Comme tu l'as lu dans le commentaire, on fait varier l'angle des rayons de -30° à 30°. On prends donc pour 0° la direction dans laquelle regarde le joueur. On obtient un champ de vision de 60°. Pour réaliser les déplacements, on ne va donc pas faire comme dans un jeu en 2D ou on peut aller en avant en arrière à gauche à droite avec les touches directionnelles, ici on va faire uniquement avant et arrière et tourner sur soit-même à gauche ou à droite, en faisant varier la variable correspondant à l'orientation (angle) du joueur, la direction dans laquelle il regarde.
Si tu as compris tant mieux , sinon.. ben je réponds à tes questions
-Planétarium 2
Citer : Posté le 29/03/2019 17:30 | #
Merci beaucoup Disperseur
En fait j'avais pas fait gaffe que l'on pouvait voir une matrice comme un repere pouvant contenir des nombres à virgules (pas représentables du coup il faut faire des arrondis pour trouver l'es coordonées matricielles)
En tout cas bravo pour ton poste très clair, j'espère qu'il en aidera d'autres que moi
Sell-me
Pixel
Html Intrepreter
Venez me rejoindre sur mon nouveau serveur Discord dédié a la programmation sur toutes les plateformes
https://discord.gg/bzfymHQ
Venez vous instruire, dans ce magnifique cours sur les Intelligences Artificielles que j'ai créé:
http://reseaux-neurones-a--z.ml/
Faites apprendre des choses à une machine, faites reconnaître à un ordi des images...
Citer : Posté le 29/03/2019 18:52 | #
Merci, je ne me suis pas trouvé clair perso
PS: Je suis en train d'éssayer de faire le rendu à l'écran en Basic.. pas une simple affaire
Ajouté le 29/03/2019 à 19:12 :
D'ailleurs, et je pose la question à tous, j'aurais besoin d'aide pour le rendu à l'écran.. je suis en radians et on à une fenetre de 1,127,0,1,63,0, pas pratique quand on veut un point de fuite au milieu de son écran (c'est à dire le 0,0 au milieu..). Donc si quelqu'un sait comment il faut s'y prendre techniquement ça m'aiderais
-Planétarium 2
Citer : Posté le 29/03/2019 19:29 | #
Tu fais une transformation affine (translation puis échelle). D'abord, tu retires 64 à la coordonnée x pour mettre le 0 au milieu, pareil en retirant 32 en y ; tu te retrouves avec un repère dont les 0 est au milieu, ie. [-64;63] en x et [-32;31] en y. Ensuite si tu veux un autre intervalle tu fais une échelle, par exemple si tu veux te ramener dans [-1;1] sur les deux axes.
Citer : Posté le 29/03/2019 20:48 | #
Ok merci. J'ai fait un premier jet de Raycasting en Basic. Il fonctionne assez bien avec C-basic mais en C ça sera plus rapide. Je prends le temps d'appliquer ce que tu m'as dit en C demain.
-Planétarium 2
Citer : Posté le 30/03/2019 13:36 | # | Fichier joint
Voici la première version fonctionelle de notre moteur 3D de Raycasing en fichier joint. C'est un programme Basic, il fonctionne plus rapidement avec CBasic mais je suis en train de le porter en C. Pour donner une première impression voici une image de ce dernier:
NB: On est sensé voir un cube en face de soi, dans une salle de 21*7 cases.
Comme on peut le voir, le rendu à l'écran est moyen. Les murs sont trop cascadés.. je pense que ça vient du nombre de rayons lancés donnant une trop grande précision de lecture de la matrice ...
-Planétarium 2
Citer : Posté le 30/03/2019 13:44 | #
Si tu modifies le fichier joint dans ton message, le précédent disparaît. Poste un deuxième message avec la capture !