Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Un simulateur de vol pour la Graph 90+E !!
Shadow15510Hors ligneAdministrateurPoints: 3940 Défis: 16 Message

Un simulateur de vol pour la Graph 90+E !!

Posté le 08/05/2019 13:46

Coucou !

Présentation

Fly Simulator (abrégé en FlySim) est un simulateur de vol pour la Graph 90+E. Le jeu se présente en 2 dimensions, vu de profil. Le but est de voler d'un aéroport à un autre, en transportant des passagers. Plus vous aurez de passagers et plus loin vous volerez, plus vous aurez d'argent pour entretenir et améliorer vos avions. Vous pourrez alors acheter de nouveaux avions et voler vers des aéroports encore plus éloignés, et ainsi avoir encore plus d'argent. Dans ce jeu l'avion reste au centre de l'écran, le paysage défile en arrière plan.

Bien entendu, pour palier à la vue en 2D peu réaliste, le jeu sera le plus poussé possible, tant au niveau de la souplesse que de l'ergonomie ou encore des mécanismes du jeu. Il est prévu d'avoir, par exemple, le choix de l'heure du vol : jour, aube, créspuscule, et nuit. Il faudra aussi gérer le moteur, les différents régimes, les manœuvres, le carburant, et la température de l'huile. En plus de devoir éviter les incendies du moteur, vous devrez répondre à la tour de contrôle !

Bref un jeu visant avant tout à vous plonger dans l'athmosphère d'un cockpit que ce soit dans les moments de calme du vol de croisière ou dans le stress d'un crash imminent avec la tour de contrôle qui vous demande des comptes.


La gestion de l'heure et du temps

L'heure sera simulée par un changement de la couleur du fond de l'écran. Pour simuler un jour, le fond est d'un bleu, l'aube est représenté par un fond mauve, le crépuscule sera symolisé par un fond de couleur orange, et la nuit par un bleu-gris très foncé.

Le temps sera moins nuancé avec la présence, ou non de nuages en haut de l'écran.

Les instruments

La jauge de carburant vous indique le carburant restant. La reserve est la zone rouge à gauche, et le voyant à la droite de la jauge, vous indique que la reserve est entamée. Il n'y pas encore de lien entre le carburant brûlé et la distances parcourue.

La température d'huile est liée au gaz. Pas de voyant, mais une partie de la jauge est colorée. Le vert correspond à une température normale. La zone orange et rouge signalent une température anormalement élevée. Si la jauge reste dans l'orange pendant 15 secondes, cela déclenche un feu moteur. Par contre, seules 10 secondes dans le rouge amènent à l'incendie. Les 3 zones correspondent à des régimes moteurs : la zone verte = 50 -> 75% des gaz, la zone orange correspond à 87,2% des gaz ou plus et la zone rouge à 100% des gaz.

L'anémomètre, vous indique votre vitesse via une aiguille. Le trait tout en haut correspond au 0. Puis chaque trait correspond à 2 pixels de déplacement horizontal à chaque *frame*. Le maximum est donc 14 pixels par *frame*. A 10fps (vitesse calculée à partir des animations des avions) le déplacement est à 140 pixels par secondes, donc un peu plus de 2,7 secondes sont nécessaire pour que l'écran soit traversé. Ce qui, à vitesse maximum, semble correct. La relation entre gaz est vitesse est : un trait = 12,5% des gaz. Les traits ont également des correspondances particulières :
- 1er trait 12,5% Comme sur certains avions le premier trait de l'anémomètre n'est pas 0. Ce premier trait ne suffit pas à faire voler l'avion même avec les deux crans de volets.
- 2nd trait 25% et 2 crans de volet
- 3ème trait 37,5% 1 cran de volet
- 4ème trait 50% vol dit *lent*
- 5ème trait 62,5% vol de croisière
- 6ème trait 78% vol de croisière rapide
- 7ème et 8ème trait 90,5% et 100% sont des régimes spéciaux réservés au décollage.

L'altimètre à lui aussi 8 trait. Celui tout en haut correspond au niveau du sol. Le sol fait 20 pixels de haut. En comptant les 30 pixels de la barre des instruments plus la hauteur de l'avion (20 pixels) le 0 de l'altimètre est de 70 pixels de haut. En comptant 20 pixels par barres de l'alti. 7x20 = 140 ; 140+70 = 210 pixels de haut. Cela laisse donc une marge de 6 pixels en haut lorsque que l'avion est à son altitude maximale.

l'horizon artificielle, vous indique l'assiette et le roulis de l'avion.

Les volets ont trois position celle actuelle est soulignée par un voyant allumé en vert clairs, les autres étant en en vert foncés. La première position celle tout en haut est le neutre. Dans le jargon on parle de volet *en lisse* car ils ne dépassent pas du profil de l'aile. La seconde position juste en dessous, au milieu, correspond au premier cran de volet, et la position tout en bas correspond au deuxième cran. Leurs utilisations sont décritent dans la partie dédiée au pilotage.

La manette des gaz et le cadrant des RpM (Rotation moteurs Par Minutes) vous indiquent ici le pourcentage de gaz, le 0 etant tout en bas du cadrant. Il y a 7 traits donc chauqe trait équivaut 14,3 % des gaz.

Les témoins du train d'aterrissage sont en rouge si le train est rentré, en vert si le train est dehors, près à l'aterrissage. Dans la vraie vie, le voyant connait une prériode transitoire en jaune/orange pour signalé que le train est en cours de sortie. Ici la sortie est tellement rapide que, par simplification, ce passage a été abandonné.

La fenêtre des fréquences vous indique quelle fréquence est actuellement utilisée lors des communications. Ce sera à vous de changer cette fréquence via les touches dédiées. Comme dans la vraie vie, on ne change pas de fréquence n'importe comment : on suit les instruction de la tour en collationnant la sortie de zone avec la nouvelle fréquence, en changeant la fréquence pour celle demandée et en s'identifiant sur la nouvelle fréquence. Les changements de fréquence en dehors de ces périodes seront prises pour des fautes de pilotages : en effet la fréquence n'est plus la bonne, donc vous ne pouvez plus communiquer avec le sol, ni le sol avec vous… Comme dans la vraie vie également, les fréquences sont hertz et celle reservées aux communicationss sont comprises dans la plage allant de 118,00 hz à 137,00 Mhz avec un pas de 0,05 Mhz. Plus récemment, le système s'est affiné aux centième de hz, mais le jeu s'arrête lui aux dixièmes.

Le radar vous indique votre position. A gauche l'aéroport de départ, à droite celui d'arrivée, vous serez représentez par une flèche pointant sur la ligne au dessus.


Le cockpit en bas de l'écran, représente les instruments de l'avion


Le Cessna 172 SP



Le Learjet 45


Le Beechcraft 1900 D


Je prévois également une gestion de plusieurs heure de la journée…

Merci d'avance de votre aide à ce projet !

Les sources de l'ancien projet sont en fichier joint et sont 100% libres de droit.
Ancien projet
Ancien projet
Concernant le code, je développerai ce jeu grâce a C.Basic du célèbre Sentaro21 !

J'ai plutôt pas mal avancé avec la gestion de l'avion qui est terminée avec les instruments, tous fonctionnels ! On peut décoller atterrir, et voler (monter, descendre et tourner) Quelques screens :






Fichier joint


Pages : Précédente1 ... , 3, 4, 5, 6, 7, 8
Shadow15510Hors ligneAdministrateurPoints: 3940 Défis: 16 Message

Citer : Posté le 26/07/2019 19:19 | # | Fichier joint


Les sources en *.txt en fichier joint
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
CaptainluigiHors ligneMembrePoints: 618 Défis: 1 Message

Citer : Posté le 26/07/2019 19:19 | #


Shadow15510 a écrit :
Les sources en *.txt en fichier joint


Merci !!!!
Jouez à Mario sans arrêt sur votre Casio !
Ma chaine YouTube : Tutodev
Cliquez pour découvrir
Cliquez pour recouvrir
City Heroes
Piano Casio
Micro GIMP
Merci d'avoir lu.
De rien !
Super !

M'en fout
C'est pas très bien ...
Shadow15510Hors ligneAdministrateurPoints: 3940 Défis: 16 Message

Citer : Posté le 23/10/2019 16:58 | #


Après plusieurs mois d'absence, je reviens hanter le topic ! J'ai mis à jour Gint et le fxsdk pour les dernière fonctionnalités de Gint, je modifie un peu le code du projet… et je compile… Le but était de voir comment rendent les images, pour l'instant juste le cockpit et le fond avec les communications .
Bref, e compile et là… Paf ! Erreur… Autant d'habitude c'est pas trop complexe : illegal token et autre joyeusetés dues à mon inexpérience… autant là j'ai pas compris :

pc37:Sources antoine$ make
sh3eb-elf-gcc -o build-cg/src/FlySim.elf build-cg/src/main.o build-cg/assets/img/cockpit.png.o build-cg/assets/img/heure.png.o -mb -ffreestanding -nostdlib -Wall -Wextra -fstrict-volatile-bitfields -std=c11 -Os -m4-nofpu -DFXCG50  -Tfxcg50.ld  -lgint-cg -lgcc -Wl,-Map=build-cg/map
/Users/antoine/gcc/sh3eb-elf-2.32-8.3.0/lib/gcc/sh3eb-elf/8.3.0/../../../../sh3eb-elf/bin/ld: build-cg/src/FlySim.elf section `.rodata' will not fit in region `rom'
/Users/antoine/gcc/sh3eb-elf-2.32-8.3.0/lib/gcc/sh3eb-elf/8.3.0/../../../../sh3eb-elf/bin/ld: region `rom' overflowed by 531268 bytes
collect2: error: ld returned 1 exit status
make: *** [FlySim.g3a] Error 1


Pour le code source, le dépôt git est à jour : https://gitea.planet-casio.com/Shadow/Fly_Simulator
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirHors ligneAdministrateurPoints: 16040 Défis: 140 Message

Citer : Posté le 23/10/2019 16:59 | #


Je sais pas ce que tu as déclaré comme variable globale mais tu as 530k de données au-delà de la limite possible par la calculatrice.
Shadow15510Hors ligneAdministrateurPoints: 3940 Défis: 16 Message

Citer : Posté le 23/10/2019 17:01 | #


Ah ça aide pas… Les images peuvent expliquer cette tailles ? Parce qu'honnêtement, j'ai pas grand-chose là…

Ajouté le 23/10/2019 à 17:07 :
Ben j'ai bien regardé mon code, et je vois pas d'où ça peut venir… J'ai aucune variable constantes :

//-----
// Nom du projet : Fly Simulator
// Version : - dev -
// Dernière modification le : 23 octobre 2019
//-----

/* ----------- */
/* - IMPORTS - */
/* ----------- */
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/std/string.h>
#include <gint/std/stdio.h>

/* -------------- */
/* - CONSTANTES - */
/* -------------- */

#define C_RED 0xf800
#define C_GREEN 0x07e0
#define C_BLUE 0x001f

/* -------------- */
/* - PROTOTYPES - */
/* -------------- */

//communication : gère les communications entre la tour et l'avion
void communication (int *com_id, int *id, const int langue);

//display_comm : affiche les communications
void display_comm (char *msg_1,char *msg_2,char *msg_3, const int *joueur);

//display : affiche sur la VRAM les éléments de décors
void display(const image_t * img_heure, const image_t * img_cockpit);

//fill_char : initialise une chaine avec un nombre de caractères répétés 'n' fois
char *fill_char(char *dest, const char *src, unsigned int debut, unsigned int fin);


int main (void)
{    
    extern image_t img_cockpit;
    extern image_t img_heure;
    
    int com_id = 1, id = 0, langue = 0;// variables des communications
    int key = 0;//variables diverses
    
    dclear(C_WHITE);
    dtext(1, 1, "-== Choix de la langue ==-", C_RED, C_NONE);
    dtext(1, 12, " 1. Francais", C_BLUE, C_NONE);
    dtext(1, 23, " 2. Anglais", C_BLACK, C_NONE);
    dupdate();
    while (langue == 0)
    {
        key = getkey().key;
        if (key == KEY_1) langue = 1;
        if (key == KEY_2) langue = 2;
    }
    langue -= 1;
    while(com_id <= 26)
    {
        dclear(C_WHITE);
        communication(&com_id, &id, langue);
        display(&img_heure, &img_cockpit);
        dupdate();
        key = getkey().key;
        if(key == KEY_EXIT) return 0;

    }
        getkey();
    return 0;
}

void communication(int *com_id, int *id, const int langue)
{
    const char *avion = "Cessna 172", *immat = "F-GUXF", *immat_courte = "F-XF", *aipt_depart = "Caen", *aipt_arrivee = "Le Havre", *freq_cont = "117.15", *freq_arrivee = "122.80", *passagers = "4";//données de l'avion et de son trajet
    
    char *comm_1[2] = {"%s tour, %s. Bonjour.", "%s tower, %s. Good morning."},
    *comm_2[2] = {"%s, %s bonjour.",  "%s, %s Hello."},
    *comm_3_1[2] = {"%s %s. %s passagers a bord. Demandons", "%s %s. %s passengers on board. Request"},
    *comm_3_2[2] = {"vol vers %s.", "flight to %s."},
    *comm_4[2] = {"%s vol autorise. Rappelez pret au depart.", "%s authorized flight. Call back clear to take off."},
    *comm_5[2] = {"Rappelons pret au depart, %s.", "Call back clear to take off, %s."},
    *comm_6[2] = {"%s, pret au depart.", "%s, clear for take off." },
    *comm_7[2] = {"%s, autorise decollage.", "%s, authorized take off."},
    *comm_8[2] = {"Autorise decollage, %s.", "Authorized take off, %s."},
    *comm_9_1[2] = {"%s, vous quittez mon espace. Services radar", "%s, you leave my airpace. Services radar"},
    *comm_9_2[2] = {"et radio termines. Informations de vol avec", "and radio terminated. Informations for flight"},
    *comm_9_3[2] = {"Controle, %s. Au revoir.", "with Controle, %s. Bye."},
    *comm_10[2] = {"Controle, %s. Bonne journee, %s.", "Controle, %s. See you, %s."},
    *comm_11[2] = {"Controle %s. Bonjour.", "Controle %s. Hello."},
    *comm_12[2] = {"%s Controle, bienvenu.", "%s Controle, welcome."},
    *comm_13_1[2] = {"%s %s. %s passagers a bord. Sortie de", "%s %s. %s passengers on board. Exit"},
    *comm_13_2[2] = {"%s vers %s.", "%s towards %s."},
    *comm_14[2] = {"%s, identifie radar.", "%s, identify radar."},
    *comm_15_1[2] = {"%s, vous quittez mon espace. Contactez", "%s, you leave my airspace. Contact"},
    *comm_15_2[2] = {"%s, %s. Bon vol.", "%s, %s. Have a good flight."},
    *comm_16[2] = {"%s %s. Au revoir, %s.", "%s %s. Good bye, %s."},
    *comm_17[2] = {"%s tour, %s. Bonjour.", "%s tower, %s. Hy."},
    *comm_18[2] = {"%s, %s, a l'ecoute.", "%s, %s, listen."},
    *comm_19_1[2] = {"%s %s. %s passagers a bord. Demandons", "%s %s. %s passengers on board. Request"},
    *comm_19_2[2] = {"consignes pour atterrissage sur %s.", "instructions for landing on %s."},
    *comm_20[2] = {"%s, commencez votre approche.", "%s, starts your approach."},
    *comm_21[2] = {"Commencons notre approche, %s.", "We start our approach, %s."},
    *comm_22_1[2] = {"%s en finale, demandons autorisation", "%s on final, request clearance"},
    *comm_22_2[2] = {"d'atterrissage.", "to landing."},
    *comm_23[2] = {"%s, autorise atterrissage. Rappelez au sol.", "%s, authorized landing. Call back on ground."},
    *comm_24[2] = {"Autorise atterrissage, rappelons au sol, %s.", "Authorized landing, call back on ground, %s."},
    *comm_25[2] = {"%s, au sol, pour quitter. Merci.", "%s, on ground for leave. Thanks."},
    *comm_26[2] = {"%s, quittez la frequence a bientot.", "%s, leave frequence, see you."};
    
    
    char msg_1[70], msg_2[70], msg_3[70];
    
    fill_char(msg_1, " ", 0, 70);
    fill_char(msg_2, " ", 0, 70);
    fill_char(msg_3, " ", 0, 70);

    switch (*com_id)
    {
        case 1:
            *id = 1;
            
            sprintf(msg_1, comm_1[langue], aipt_depart, immat);
            break;
        case 2:
            *id = 0;
            
            sprintf(msg_1, comm_2[langue], immat, aipt_depart);
            break;
        case 3:
            *id = 1;
            
            sprintf(msg_1, comm_3_1[langue], immat, avion, passagers);
            sprintf(msg_2, comm_3_2[langue], aipt_arrivee);
            break;
        case 4:
            *id = 0;
            
            sprintf(msg_1, comm_4[langue], immat_courte);
            break;
        case 5:
            *id = 1;
            
            sprintf(msg_1, comm_5[langue], immat_courte);
            break;
        case 6:
            *id = 1;
            
            sprintf(msg_1, comm_6[langue], immat_courte);
            break;
        case 7:
            *id = 0;
            
            sprintf(msg_1, comm_7[langue], immat_courte);
            break;
        case 8:
            *id = 1;
            
            sprintf(msg_1, comm_8[langue], immat_courte);
            break;
        case 9:
            *id = 0;
            
            sprintf(msg_1, comm_9_1[langue], immat_courte);
            sprintf(msg_2, comm_9_2[langue]);
            sprintf(msg_3, comm_9_3[langue], freq_cont);
            break;
        case 10:
            *id = 1;
            
            sprintf(msg_1, comm_10[langue], freq_cont, immat_courte);
            break;
        case 11:
            *id = 1;
            
            sprintf(msg_1, comm_11[langue], immat);
            break;
        case 12:
            *id = 0;
            
            sprintf(msg_1, comm_12[langue], immat_courte);
            break;
        case 13:
            *id = 1;
            
            sprintf(msg_1, comm_13_1[langue], immat, avion, passagers);
            sprintf(msg_2, comm_13_2[langue], aipt_depart, aipt_arrivee);
            break;
        case 14:
            *id = 0;
            
            sprintf(msg_1, comm_14[langue], immat_courte);
            break;
        case 15:
            *id = 0;
            
            sprintf(msg_1, comm_15_1[langue], immat_courte);
            sprintf(msg_2, comm_15_2[langue], aipt_arrivee, freq_arrivee);
            break;
        case 16:
            *id = 1;
            
            sprintf(msg_1, comm_16[langue], aipt_arrivee, freq_arrivee, immat_courte);
            break;
        case 17:
            *id = 1;
            
            sprintf(msg_1, comm_17[langue], aipt_arrivee, immat);
            break;
        case 18:
            *id = 0;
            
            sprintf(msg_1, comm_18[langue], immat_courte, aipt_arrivee);
            break;
        case 19:
            *id = 1;
            
            sprintf(msg_1, comm_19_1[langue], immat, avion, passagers);
            sprintf(msg_2, comm_19_2[langue], aipt_arrivee);
            break;
        case 20:
            *id = 0;
            
            sprintf(msg_1, comm_20[langue], immat_courte);
            break;
        case 21:
            *id = 1;
            
            sprintf(msg_1, comm_21[langue], immat_courte);
            break;
        case 22:
            *id = 1;
            
            sprintf(msg_1, comm_22_1[langue], immat_courte);
            sprintf(msg_2, comm_22_2[langue]);
            break;
        case 23:
            *id = 0;
            
            sprintf(msg_1, comm_23[langue], immat_courte);
            break;
        case 24:
            *id = 1;
            
            sprintf(msg_1, comm_24[langue], immat_courte);
            break;
        case 25:
            *id = 1;
            sprintf(msg_1, comm_25[langue], immat_courte);
            break;
        case 26:
            *id = 0;
            
            sprintf(msg_1, comm_26[langue], immat_courte);
            break;
    }
    
    display_comm(msg_1, msg_2, msg_3, &(*id));
    *com_id += 1;
}


void display_comm (char *msg_1,char *msg_2, char *msg_3, const int *joueur)
{
    fill_char(msg_1, " ", strlen(msg_1), 70);
    fill_char(msg_2, " ", strlen(msg_2), 70);
    fill_char(msg_3, " ", strlen(msg_3), 70);
    
    if (*joueur == 1){
        dtext(1, 1, msg_1, C_BLUE, C_NONE);
        dtext(1, 12, msg_2, C_BLUE, C_NONE);
        dtext(1, 23, msg_3, C_BLUE, C_NONE);
    }
    else{
        dtext(1, 1, msg_1, C_BLACK, C_NONE);
        dtext(1, 12, msg_2, C_BLACK, C_NONE);
        dtext(1, 23, msg_3, C_BLACK, C_NONE);
    }
}

void display(const image_t * img_heure, const image_t * img_cockpit)
{
    dsubimage(0, 0, img_heure, 0, 0, 396, 224, 0);
    dimage(0, 194, img_cockpit);
    
}

char *fill_char(char *dest, const char *src, unsigned int debut, unsigned int fin)
{
    unsigned int i;
    for (i = debut ; i < fin ; i++)
    {
        dest[i] = src[0];
    }
    dest[fin] = '\0';
    return dest;
}

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirHors ligneAdministrateurPoints: 16040 Défis: 140 Message

Citer : Posté le 23/10/2019 23:51 | #


As-tu le code sur un dépôt, ou au moins une archive ?
Shadow15510Hors ligneAdministrateurPoints: 3940 Défis: 16 Message

Citer : Posté le 24/10/2019 13:24 | #


Euh, oui tout est sur le git J'ai mis le lien quelques commentaires plus haut !
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
Pages : Précédente1 ... , 3, 4, 5, 6, 7, 8

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 43 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