Gå til innhold

Vise (lage) grafikk i DOS. (C++) ?


Anbefalte innlegg

Driver å lære meg c++, og tror jeg begynner å bli ganske stø i det helt basiske.

 

Den boka jeg har lest (c++ for dummies) forteller ingenting om grafikk. (tegne pixler osv..) Kanskje ikke så rart siden boka handler om c++ og ikke dos, directx, opengl..

 

Kunne jo så klart få tak i en bok om directx/opengl, men tenkte det var lurt å få litt mer erfaring først, men jeg har begynt å bli lei av å skrive kjedelige, dumme tekstbaserte program. :( Det ville vært mye morsommere hvis jeg kunne lage noe enkel grafikk.

 

Har søkt litt på internet, men finner bare store library som er alt for mye å sette seg inn i (skal jo ikke lære meg et nytt ubrukelig api)

 

Derfor lurte jeg på om det er noe som vet om en enkel måte å f.eks tegne pixler på skjermen?

 

Takknemmelig for svar..

Lenke til kommentar
Videoannonse
Annonse

Etter å ha sett meg litt rundt, fant jeg:

 

http://www.ultimategameprogramming.com/zips/Points.zip

 

 

Koden for å skrive punkter til skjermen finner du i funksjonen RenderScene

 


     glColor3f(1.0f, 1.0f, 1.0f);  // All 1's equal the color of white.



     // Call glVertex3f to define the x, y, and z position of a vertex.

     // Here we are placing the first vertex in the center of the screen.



     //          X     Y     Z

     glVertex3f(0.0f, 0.0f, 0.0f);



     // Remember that negative numbers go in one direction and positive the

     // other.  1.0f along the X goes right and -1.0f along the X goes left

     // for example.



     glColor3f(1.0f, 1.0f, 1.0f);  // All 1's equal the color of white.

     glVertex3f(0.2f, 0.0f, 0.0f); // Move .1 along the positive x (right).



     glColor3f(1.0f, 1.0f, 1.0f);  // All 1's equal the color of white.

     glVertex3f(0.2f, -0.2f, 0.0f);// Move .1 right, and .1 down.



     glColor3f(1.0f, 1.0f, 1.0f);  // All 1's equal the color of white.

     glVertex3f(0.0f, -0.2f, 0.0f);// Place this vertex .1 units down.

 

 

 

Tror dette er godt nok, hvis alt du skal er å eksperimentere med skjermgrafikk. Ønsker du å lære om 2d/3d-grafikk anbefaler jeg deg å skaffe en god/lettlest bok om DirectX. Sjekk bøker skrevet av LaMothe, han er genial. :woot:

 

Merk! For DirectX8 er 2D delen "smeltet sammen" med 3D-delen. Så tutorial'ene du finner rundt om kring er ikke spesielt lettleste.

 

 

 

BIW

Lenke til kommentar

Lage spill krever masse arbeid og er seff tøft, kankje du kunne prøve deg på noen windows program? Etter du prøver litt blir det plutseligt ikke så kjedeligt i forhold til å lage spill....

 

Man seff, Har du lyst har du lov!!!!!

Lenke til kommentar

Er ikke det opengl b-burn? Har ikke tenkt å begynne med det enda, fordi jeg er såpass uerfaren.

 

Fant en tutorial i dag:


#include graphics.h

#include conio.h

#include stdlib.h

#include stdio.h



int gdriver = DETECT, gmode, error;

initgraph(&gdriver, &gmode, "");



 	

error = graphresult();

if (error != grOk) {

 printf("Graphics error: %s

", grapherrormsg(error));

 printf("Press any key to halt:");

 getch();

 exit(1);               

}

setcolor(1);

line(0, 0, 640, 480);

 

Prøvde dette i vc++ 6, men det virker som om graphics.h ikke følger med vc++6. Søkte litt på internett å fant ut at den har "gått ut på dato" (følger ikke med lenger)

 

Ingen som vet hvor jeg kan finne denne + tilhørende library?

 

PS. Har ikke tenkt å lage noe avanserte greier, bare skrive noe code så får litt trening.

Lenke til kommentar
Er ikke det opengl b-burn? Har ikke tenkt å begynne med det enda, fordi jeg er såpass uerfaren.

 

Stemmer det... det var det nærmeste jeg kom en enkel løsning.

 

De fleste andre "enkle" løsningene jeg kunne finne baserer seg på mode13h --> noe som var greit den gang 320*200*8 bit var en akseptabel oppløsning :lol:

 

Jeg testet noe gammel kode for sikker hets skyld.. men det skar seg fortere enn en du kan si arcuscosinushyberbolicus.

 

 

 

 

BIW

Lenke til kommentar

Latet ned borland 5.5 fordi jeg fant ut at "borland" skulle ha med graphics.h, men den var visstnok "gått ut på dato" der også. Men den skal ihvertfall være med i v. 4, men den får jeg ikke lastet ned fra borlands sider. :(

 

B-urn: Så lit tpå den zip filen, og selv om jeg ikke forstår halvparten, så kan jeg jo så klart bruke glVertex3f(0.1f, 0.0f, 0.0f), glColor3f(1.0f, 1.0f, 1.0f) og glTranslatef(0.0f, 0.0f, -1.0f) til å bestemme farge og posisjon. Og skrive resten av koden inne i void RenderScene().

 

Kommer til å lete litt til, men hvis jeg ikke finner ut noe så skal jeg prøve opengl...

Lenke til kommentar

Hei igjen.

 

Jeg så en referanse til SDL i en annen tråd (husker ikke hvilken).

Søkte litt på dette og det viste seg at det kanskje er svaret på problemet ditt.

 

"Veldig" enkelt å forstå. Vel.. i forhold til mye annet grafs jeg har sett er dette noe av det bedre.

 

Sjekk:

http://cone3d.gamedev.net/cgi-bin/index.pl...als/gfxsdl/tut1

 

Det innebærer litt kopiering av filer, men det er stort sett "kokebok".

Jeg fulgte tutorial'en rett frem (bruker VC6.0). Fungerte på første forsøk.

 

 

Lister koden her:

 


#include <stdio.h>

#include <stdlib.h>

#include <SDL/SDL.h>



// The functions are not shown to save space

void DrawPixel(SDL_Surface *screen, int x, int y,

                                   Uint8 R, Uint8 G, Uint8 B);

void Slock(SDL_Surface *screen);

void Sulock(SDL_Surface *screen);



#include "misc_functions.h"





//Entrance

int main(int argc, char *argv[])

{



 if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )

 {

   printf("Unable to init SDL: %sn", SDL_GetError());

   exit(1);

 }

 atexit(SDL_Quit);



 SDL_Surface *screen;

 screen=SDL_SetVideoMode(1024,768,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

 if ( screen == NULL )

 {

   printf("Unable to set 640x480 video: %sn", SDL_GetError());

   exit(1);

 }



 //**********************

 // DET ER HER DET SKJER 

 //**********************

 for(int i=0;i<100;i++)

 { 

     Slock(screen);

     for(int x=0;x<640;x++)

  { 

         for(int y=0;y<480;y++) 

   {DrawPixel(screen, x,y,y/2,y/2,x/3);}

  }



     Sulock(screen);

     SDL_Flip(screen);

 }



 //********************





 return 0;

}





void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B)

{

 Uint32 color = SDL_MapRGB(screen->format, R, G, B);

 switch (screen->format->BytesPerPixel)

 {

   case 1: // Assuming 8-bpp

     {

       Uint8 *bufp;

       bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;

       *bufp = color;

     }

     break;

   case 2: // Probably 15-bpp or 16-bpp

     {

       Uint16 *bufp;

       bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;

       *bufp = color;

     }

     break;

   case 3: // Slow 24-bpp mode, usually not used

     {

       Uint8 *bufp;

       bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;

       if(SDL_BYTEORDER == SDL_LIL_ENDIAN)

       {

         bufp[0] = color;

         bufp[1] = color >> 8;

         bufp[2] = color >> 16;

       } else {

         bufp[2] = color;

         bufp[1] = color >> 8;

         bufp[0] = color >> 16;

       }

     }

     break;

   case 4: // Probably 32-bpp

     {

       Uint32 *bufp;

       bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;

       *bufp = color;

     }

     break;

 }

}





void Slock(SDL_Surface *screen) { if (SDL_MUSTLOCK(screen)) {if (SDL_LockSurface(screen)<0) { return;}}}

void Sulock(SDL_Surface *screen){ if (SDL_MUSTLOCK(screen)) { SDL_UnlockSurface(screen);}}



 

 

Merk! Selv om det ikke er så mye "ekkel" kode igjen, er det litt.

Fokuser på det som skjer i denne delen av koden.

Den burde ikke være så vanskelig å forstå, og kan brukes til god gammeldags "Amiga"-programmering hvis du føler for det (plasma,3d,fraktaler osv). Masse morro-programmering altså.

 

 


 //**********************

 // DET ER HER DET SKJER 

 //**********************

 for(int i=0;i<100;i++)

 { 

     Slock(screen);

     for(int x=0;x<640;x++)

  { 

         for(int y=0;y<480;y++) 

   {DrawPixel(screen, x,y,y/2,y/2,x/3);}

  }



     Sulock(screen);

     SDL_Flip(screen);

 }



 

PS! De tre siste argumentene i Drawpixel()-rutinen er R,G,B-verdiene til punktet.

 

BIW

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...