[TurboC] Combinaison mode texte/mode graphique

Combinaison mode texte/mode graphique [TurboC] - C - Programmation

Marsh Posté le 18-08-2003 à 17:42:54    

Salut à tous!
Je cherche à afficher du mode texte, en utilisant sur la même page le mode graphique sur TC en C/C++.
En fait ça se passe bien mais si je veux écrire le texte en inverse (noir sur blanc), ce qui marche très bien en mode texte seul, ça marche pas.
La fonction textcolor() est inefficace, et l'utilisation de code escape (printf("\x1B...m" ),c'est peut être pas la syntaxe exacte, mais c'est dans l'esprit)ne marche pas plus. Et je ne veux pas écrire le texte à l'aide de outtext (enfin si vous trouvez comment afficher comme sur un écran 640*400, 25 lignes 80 colonnes je veux bien, j'ai essayé les polices vectorielles j'ai pas troué exactement ce que je voulais, même en modifiant la taille).
Voilà, si quelqu'un avait une idée, il me rendrait un fier service.
Merci d'avance pour vos réponses, mêmes négatives.
Wanpass (et repassera)

Message cité 1 fois
Message édité par Wanpass le 19-08-2003 à 10:52:14
Reply

Marsh Posté le 18-08-2003 à 17:42:54   

Reply

Marsh Posté le 18-08-2003 à 18:12:52    

quel systeme dexploitation ?? compilateur ???
 
 
 
 
 
no de visa ???  :D

Reply

Marsh Posté le 19-08-2003 à 00:04:13    

La question est donc
sous DOS, avec TurboC, comment, en mode graphique, afficher du texte en inversion vidéo ? Sachant que outtext() donne des caractères trop gros pour l'usage désiré ?
 
Il me semble me souvenir que ça dépend d'un fichier .BGI, le mode graphique courant..  
J'espère que qq est inspiré, ça date de mes balbutiements en C (1995).
 [:yoyoz]  

Reply

Marsh Posté le 19-08-2003 à 00:11:04    

sorry javais pas vu TC
 
 
le pire c que jmen suis sevi pendant des pour faire mes demos

Reply

Marsh Posté le 19-08-2003 à 10:44:02    

En utilisant la fonction "window", peut-être??? Je sais pas si c'est posssible de superposer une window en mode graphique et l'autre en mode text...:??:

Reply

Marsh Posté le 19-08-2003 à 11:26:20    

En fait j'ai déjà essayé avec la fonction window()
mais elle permet juste de définr le nombre de ligne et de colonnes de la fenêtre, mais ne résoud pas le problème d'inversion vidéo
 
 
 
Wan again

Reply

Marsh Posté le 19-08-2003 à 21:05:42    

En réfléchissant beaucoup entre deux manips au labo (heureusement que le cerveau vit sa vie sans embêter), je pense que le moyen le plus "facile" devrait être de dessiner un rectangle de couleur (blanc par exemple) puis d'écrire en noir (par exemple) dessus (à moins que ce ne soit pas l'effet désiré).
 
Pour les rectangles, je crois que c'est bar() ou bar3d(), faut faire appel à setfillstyle() avant d'après doc Borland C 3.1. Je sais plus trop comment j'écrivais du texte en mode graphique CGA (écran vert et noir, deux couleurs). Faudrait que je fouille mes archives (mais faisais pas inversion vidéo).

Reply

Marsh Posté le 20-08-2003 à 09:00:52    

Effectivement, la méthode qui consite à écrire en noir dans des rectangles blanc fonctionne.
Mais il s'agit toujours de texte graphique, et vu que j'arrive pas à faire du 25 lignes 80 colonnes ( et ouais c'est con mais j'en ai besoin) avec du texte graphique, ça ne m'arrange pas trop comme solution.
 
 
Wan (more time)

Reply

Marsh Posté le 20-08-2003 à 09:07:12    

Je ne pense pas qu'on puisse mélanger les deux, c'est pas écrit de la même façon (adresse je crois, désolé si je dis bétises) en mémoire vidéo texte et graphique.
 
Le mode graphique, c'est quoi ? VGA, ? Y a des BGI SVGA je crois sur le ouèbe (cf quel contrôleur graphique ?), ça permet de sortir du 640 * 480 de base. Y a tellement longtemps que je m'y suis pas frotté que c'est vague.
 
Cf peut-être http://www.von-bassewitz.de/uz/bgi.html

Reply

Marsh Posté le 20-08-2003 à 09:18:56    

En fait je travaille sur une catre PC 104 avec un proc' 386 et un écran TFT, alors pour le contrôleur graphique il me semble que c'est EGA/VGa, j'avoue que j'utilise une fonction d'autodétection et je m'en occupe pas.
Sinon quand tu me dis que c'est impossible, c'est au niveau de l'incersion vidéo? Parce que sinon ça marche bien, printf() fonctionne après avoir basculé l'écran en mode graphique (initgraph()).

Reply

Marsh Posté le 20-08-2003 à 09:18:56   

Reply

Marsh Posté le 20-08-2003 à 10:18:39    

Mélanger le mode texte et graphique (deux mondes obscurs), les instructions, heureusement qu'elles tiennent la route.
 
En écrivant les caractères les uns à la suite des autres, toutes les lignes de l'écran, en mode graphique, il tient combien en largeur et hauteur ? Si en mode texte, il y a 80 colonnes et 25 lignes, pourquoi pas en graphique si la matrice texte est la même (je sais plus trop :pt1cable:). Sinon, faudrait des polices plus étroites (si on peut les choisir).
 
Dommage que les spécialistes soient en congés. :sarcastic:

Reply

Marsh Posté le 20-08-2003 à 10:37:54    

ben ça dépend, par défaut les caractères sont plus petits( mais il s'agit d'une police matricielle).
On peut modifier la taille, avec setcharusr( ou un truc dans le style) qui permet d'affecter des porportions aux polices vetorielles et ainsi avoir un police de la taille désirée, j'ai bien essayé mais j'ai pas réussi à avoir exactement du 25*80.

Reply

Marsh Posté le 20-08-2003 à 10:50:46    

Ca donne combien en "natif" (cad sans bidouille sur la matrice texte) à la place le 25*80 ?  
 
Si on regarde QBASIC, y a modes graphiques  
SCREEN 2 640*200 format texte 80 * 25 avec police de caractères 8*8
SCREEN 8 640*200 idem 80*25
SCREEN 9 640*350 texte 80*25 ou 80*43 (matrice 8*14 ou 8*8)
 
En VGA (640*480), on peut faire 80*30 ou 80*60 en SCREEN 11 ou 12.
 
Si j'ai le temps ce soir, je cherche mon vieux prog en C qui tournait sur un 8086/4,77MHz en CGA/Vert&noir pr faire test (poussiéreux).

Reply

Marsh Posté le 20-08-2003 à 12:35:26    

exactement, je ne saurais ter dire combien ça fait mais en gros
ça doit faire du 100*50, à vue de nez.
Sinon pour l'instant je ruse: quand je suis en mode inversion vidéo, j'écris le texte en bleu et les espaces à l'aide de '█' bleus. Comme ça on s'y retouve un peu plus mais c'est pas top beau

Reply

Marsh Posté le 20-08-2003 à 12:52:17    

Pour compter les colonnes, on écrit des chaînes "1234567890", c'est facile à compter ensuite.
100*50, c'est colonnes/lignes en mode graphique ? Il est peut-être spécial l'écran (ou polices adaptées).
 
Si la police a une taille fixe, quand on connait le nombre de caractères de la chaîne, c'est pas trop difficile de tracer le rectangle avant d'écrire (coordonnées x,y du coin haut du texte déjà connues).

Reply

Marsh Posté le 20-08-2003 à 13:22:35    

J'ai l'impression que tu veux me faire afficher le texte en mode graphique, ok, c'est possible.
Dans ce cas je reformule ma question: est-il impossible d'afficher du texte en mode video inversé en mode graphique à l'aide de printf() (ou une autre fonction de mode texte)?
A moins qu'il soit possible de faire du 25*80 (ou 80*25, ne jouons pas sur les mots) en mode graphique sur un écran 640*400 (ce que je n'ai pas réussi à faire proprement avec une police vectorielle dont j'ai modifié la taille, ça faisait plus ou moins du 80*25 mais pas exactement).
Pour ce qui est des caractères à afficher ils arrivent du port série, impossible de connaitre leur nombre à l'avance, il faut donc les afficher un par un.
   

Reply

Marsh Posté le 20-08-2003 à 14:01:02    

Je ne veux rien du tout... :D  
 
Rien n'empêcherait, à chaque caractère reçu, de tracer le rectangle de largeur "un caractère" puis le caractère dessus pour faire l'inversion (un peu comme quand on sélectionne du texte en avançant le curseur avec shift+flèche droite sous vinedoze)..
 
Finalement, le mode graphique, il sert à qq chose ou pas ? Si y a une courbe à dessiner, des axes et graduations, indispensable (à part comme on faisait en Fortran (pas de graphisme sur les consoles ni les imprimantes) un listing avec * pour indiquer le point), mais si l'inversion se fait bien en mode texte, pourquoi se compliquer (j'ai du mal saisir le besoin; je fatigue en "attendant" les vacances :sarcastic:) ?

Reply

Marsh Posté le 20-08-2003 à 15:15:07    

Ben ouais le mode graphique me sert à tracer des rectangles (avec des vrais lignes et les coordonées de points, des trucs précis, quoi!).
Et les petits carrés pour chaque caractère ça marche, je n'en doute pas , mais ça ne résoud pas le pb du 80*25.
 
 

Reply

Marsh Posté le 20-08-2003 à 16:25:24    

Le problème limitant est donc :
"je veux :D 80 colonnes et 25 lignes de caractères en mode graphique sous DOS avec Turbo C" (je veux = il me faut impérativement).
 
Je vais regarder si, sur mon PC, j'arrive en C à avoir autant de lignes/colonnes en VGA. Si oui, possible :D. Le pb principal étant d'avoir le mode adhoc (ça va "ramer", ça fait longtemps !). Je peux monter en 1280 pixels de large sur mon HP/486, donc j'ai de la marge.
 
Y a QBASIC sur la machine (ou GWBASIC sur les anciens zinzins dont le mien) ? Si pb, ça permettra de tester si tous les modes graphiques sont acceptés et valides (si y a 80*25 sous QBasic, y peut y avoir aussi sous TC !!! Scrongneugneu :lol:)

Reply

Marsh Posté le 20-08-2003 à 19:06:13    

J'ai retrouvé mon prog, je l'ai modifié pour écrire des caractères à l'écran, mais ça coïnce sur pb de BGI, initgraph() est bien là. Je sèche. Faut que je trouve doc, ai tout oublié.
J'utilisais outtextxy(x,y,char *) pour écrire n'importe où.
 
Pour tester la faisabilité sur l'écran, sous QBasic sous DOS
SCREEN 9  ' 10, 8, 9  bons 80*25  ' 11 et 12 80*60
FOR k% = 1 TO 24
  FOR j% = 1 TO 8
    FOR i% = 1 TO 10
      LOCATE k%, i% + (j% - 1) * 10
      PRINT CHR$(i% + 47);
    NEXT i%
  NEXT j%
NEXT k%
Ca affiche 80 colonnes (8 fois "0123456789" ) sur 24 lignes.

Reply

Marsh Posté le 20-08-2003 à 20:27:27    

Il me manquait le fichier BGI dans le path...
 
J'affiche 79 colonnes et 59 lignes avec l'exemple outtextxy() borland modifié (mon TFT laisse peut-être passer un caractère sur le côté, la synchro est ajustée pour les signaux 1280*1024).
#include <graphics.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
 
int main(void)
{
   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int iLi, iCol;
   char Chne[12];
 
   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "" );
 
   /* read result of initialization */
   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:" );
      getch();
      exit(1); /* terminate with an error code */
   }
 
//   for (iLi = 0; iLi < 59; iLi ++) /* 59 lignes */
//   {
//     sprintf(Chne, "%02u", iLi + 1);
//     outtextxy(1, 1 + iLi * textheight(Chne), Chne);
//   }
 
   strcpy(Chne, "1234567890" );
   for (iCol = 0; iCol < 8; iCol ++)  /* 79 colonnes */
   {
     outtextxy(1 + iCol * textwidth(Chne), 1, Chne);
   }
 
   /* clean up */
   getch();
   closegraph();
   return 0;
}

Reply

Marsh Posté le 28-12-2007 à 18:16:38    

bonjour je voudrais savoir comment on fait pr mettre le curseur dans la version 2.01 de turboC sous le mode graphique .. je suppose que c'est grâce à une fonction .. mais je seche .. c'est urgent MERCI

Reply

Marsh Posté le 30-12-2007 à 18:22:50    

Wanpass a écrit :

Salut à tous!
Je cherche à afficher du mode texte, en utilisant sur la même page le mode graphique sur TC en C/C++.


Citation :


bonjour je voudrais savoir comment on fait pr mettre le curseur dans la version 2.01 de turboC sous le mode graphique .. je suppose que c'est grâce à une fonction .. mais je seche .. c'est urgent MERCI


C'est pas possible. Les modes graphiques et textes des cartes écrans de PC sont exclusifs. Le mode graphique BGI supporte quelques polices de texte.

 

Pour le curseur, c'est à-la-main ...


Message édité par Emmanuel Delahaye le 30-12-2007 à 18:27:17

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-01-2008 à 22:22:01    

a la main .. cad ? le truc c'est qu'il faut qu'il soit rond et qu'il se déplace avec les touches z,q,s,d oules fleches ... mais comment trouver une fonction qui permette de changer les coordonnées du curseur a chaque fois que l'on appuie sur l'une de ces 4 touches ??  
 
Pus précisement il s'agit d'un labyrinthe dans lequel le curseur doit se déplacer ...  
 
c'est URGENT !! merci a tous ceux qui peuvent m'aider !
 

Reply

Marsh Posté le 03-01-2008 à 10:18:06    

pooky13 a écrit :

a la main .. cad ?


Que c'est à toi de l'afficher, de le déplacer... (sprite).

Citation :


 le truc c'est qu'il faut qu'il soit rond et qu'il se déplace avec les touches z,q,s,d oules fleches ... mais comment trouver une fonction qui permette de changer les coordonnées du curseur a chaque fois que l'on appuie sur l'une de ces 4 touches ??


Il n'y a rien de standard. Avec Turbo C, il faut utiliser les fonctions de <conio.h> :

 

une boucle,
une suspension pour 'rythmer la boucle' et permettre les déplacements
la fonction kbhit() pour savoir si on a touché le clavier
la fonction getch() pour lire un caractère dans le clavier
(la gestion des flèches est légèrement plus compliquée)
un switch-case pour traiter la touche saisie

 

C'est un projet scolaire ? Tu n'as pas eu de cours sur les fonctions d'entrées de conio ?

 

Je te conseille de commencer par t'entrainer en mode console.

 

Voici un petit programme qui déplace une balle toute seule. Les fleches donnent la direction. (c'est comme ça que fonctionne un PacMan par exemple).

 

Voici une première ébauche qui permet de voir comment on fait "2 choses à la fois".

 

La boucle est rythmée à 100 ms. Elle affiche en temps réel un petit moulin en haut à droite, et dans le même temps, le clavier est surveillé. Si on framme la touche ESC, le programme s'arrête.

Code :
  1. #ifdef __TURBOC__
  2. #include <conio.h>
  3. #include <dos.h>
  4. #else
  5. #include <conio2.h>
  6. # /* http://delahaye.emmanuel.free.fr/clib */
  7. #include "psleep/inc/psleep.h"
  8. #define delay(ms) msleep(ms)
  9. #endif
  10. static void aff_moulin (void)
  11. {
  12.    static int i;
  13.    static char const s[4] = "|/-\\";
  14.    i++;
  15.    if (i == sizeof (s))
  16.    {
  17.       i = 0;
  18.    }
  19.    gotoxy (1, 1), putch (s[i]);
  20. }
  21. int main (void)
  22. {
  23.    int end = 0;
  24.    clrscr ();
  25.    while (!end)
  26.    {
  27.       delay (100);
  28.       aff_moulin ();
  29.       if (kbhit ())
  30.       {
  31.          int c = getch ();
  32.          switch (c)
  33.          {
  34.          case 27:              /* ESC */
  35.             end = 1;
  36.             break;
  37.          }
  38.       }
  39.    }
  40.    return 0;
  41. }


Voici une version plus complète qui montre comment la balle se déplace toute seule et comment les flèches arrivent à en contrôler la direction, donc, indirectement, le déplacement.

 

C'est un peu élaboré. Pose des questions si tu ne comprends pas. Les compilations conditionnelles traitent les différences de comportement entre la version originale de conio (MS-DOS) et la version 'Win32' (Windows).

Code :
  1. #ifdef __TURBOC__
  2. #include <conio.h>
  3. #include <dos.h>
  4. #else
  5. #include <conio2.h>
  6. /* http://delahaye.emmanuel.free.fr/clib */
  7. #include "psleep/inc/psleep.h"
  8. #define delay(ms) msleep(ms)
  9. #endif
  10. /* Largeur / hauteur */
  11. #define X 20
  12. #define Y 10
  13. /* Origine */
  14. #define X0 ((80-X)/2)
  15. #define Y0 ((25-Y)/2)
  16. enum touches
  17. {
  18.    LEFT = 75,
  19.    RIGHT = 77,
  20.    UP = 72,
  21.    DOWN = 80,
  22.    dummy
  23. };
  24. /* directions */
  25. enum dir
  26. {
  27.    N, S, W, E, DIR_NB
  28. };
  29. /* coordonees */
  30. struct xy
  31. {
  32.    int x;
  33.    int y;
  34. };
  35. /* objet 'balle' */
  36. struct balle
  37. {
  38.    /* position courante */
  39.    struct xy pos;
  40.    /* direction courante */
  41.    enum dir dir;
  42. };
  43. void balle_aff (struct balle *p)
  44. {
  45.    /* effacement de la positioni courante */
  46.    gotoxy (p->pos.x, p->pos.y), putch (' ');
  47.    /* deplacement */
  48.    switch (p->dir)
  49.    {
  50.    case N:
  51.       /* controle de limites */
  52.       if (p->pos.y > Y0)
  53.       {
  54.          p->pos.y--;
  55.       }
  56.       break;
  57.    case S:
  58.       if (p->pos.y < Y0 + Y - 1)
  59.       {
  60.          p->pos.y++;
  61.       }
  62.       break;
  63.    case W:
  64.       if (p->pos.x > X0)
  65.       {
  66.          p->pos.x--;
  67.       }
  68.       break;
  69.    case E:
  70.       if (p->pos.x < X0 + X - 1)
  71.       {
  72.          p->pos.x++;
  73.       }
  74.       break;
  75.    default:;
  76.    }
  77.    gotoxy (p->pos.x, p->pos.y), putch ('O');
  78. }
  79. void balle_init (struct balle *p)
  80. {
  81.    p->pos.x = X0 + X / 2;
  82.    p->pos.y = Y0 + Y / 2;
  83.    p->dir = N;
  84. }
  85. /* encadrer l'aire de jeu */
  86. void play_init (void)
  87. {
  88.    int i;
  89.    /* 2 lignes horizontales a l'exterieur de l'aire de jeu */
  90.    for (i = 0; i < X + 2; i++)
  91.    {
  92.       gotoxy (X0 - 1 + i, Y0 - 1), putch ('*');
  93.       gotoxy (X0 - 1 + i, Y0 + Y), putch ('*');
  94.    }
  95. /* 2 lignes verticales a l'exterieur de l'aire de jeu */
  96.    for (i = 0; i < Y; i++)
  97.    {
  98.       gotoxy (X0 - 1, Y0 + i), putch ('*');
  99.       gotoxy (X0 + X, Y0 + i), putch ('*');
  100.    }
  101. #if 0
  102. /* aire de jeu (verification) */
  103.    for (i = 0; i < X; i++)
  104.    {
  105.       int j;
  106.       for (j = 0; j < Y; j++)
  107.       {
  108.          gotoxy (X0 + i, Y0 + j), putch ('-');
  109.       }
  110.    }
  111. #endif
  112. }
  113. int main (void)
  114. {
  115.    int end = 0;
  116.    struct balle balle;
  117.    clrscr ();
  118.    play_init ();
  119.    balle_init (&balle);
  120.    while (!end)
  121.    {
  122.       delay (200);
  123.       balle_aff (&balle);
  124.       if (kbhit ())
  125.       {
  126.          int c = getch ();
  127.          switch (c)
  128.          {
  129.          case 27:              /* ESC */
  130.             end = 1;
  131.             break;
  132.          case 0:
  133.             if (kbhit ())
  134.             {
  135.                c = getch ();
  136.                switch (c)
  137.                {
  138. #ifdef __TURBOC__
  139.                   /* selon la fleche, changer la direction courante */
  140.                case UP:
  141.                   balle.dir = N;
  142.                   break;
  143.                case DOWN:
  144.                   balle.dir = S;
  145.                   break;
  146.                case LEFT:
  147.                   balle.dir = W;
  148.                   break;
  149.                case RIGHT:
  150.                   balle.dir = E;
  151.                   break;
  152. #endif
  153.                default:
  154.                   gotoxy (1, 1), cprintf ("%3d", c);
  155.                }
  156.             }
  157.             break;
  158.          case 224:
  159. #ifndef __TURBOC__
  160.             if (kbhit ())
  161.             {
  162.                c = getch ();
  163.                switch (c)
  164.                {
  165.                   /* selon la fleche, changer la direction courante */
  166.                case UP:
  167.                   balle.dir = N;
  168.                   break;
  169.                case DOWN:
  170.                   balle.dir = S;
  171.                   break;
  172.                case LEFT:
  173.                   balle.dir = W;
  174.                   break;
  175.                case RIGHT:
  176.                   balle.dir = E;
  177.                   break;
  178.                default:
  179.                   gotoxy (1, 1), cprintf ("%3d", c);
  180.                }
  181.             }
  182. #endif
  183.             break;
  184.          }
  185.       }
  186.    }
  187.    return 0;
  188. }


Message édité par Emmanuel Delahaye le 04-01-2008 à 22:27:30

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-01-2008 à 22:17:02    

oui c'est un projet scolaire où le but est de créer un labyrinthe .. dans un 1er temps de le créer puis dans un second temps un phase de jeu ..  
en tout cas merci, le souci c'est que l'on a pas vu en cours toutes ces fonctions .. pas même la bibliothèque <conio.h> donc je ne sais pas si j'ai le droit d'utiliser ces fonctions .. mais merci !!   :)


Message édité par pooky13 le 04-01-2008 à 22:29:35
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed