Grafiken einfügen?!



  • Moin,

    ich habe mich freiwillig dazu bereit erklärt für unseren Unterricht ein C Programm zuschreiben das Grafiken wie z.B. Quadrate o.ä. zeichnet in dem ich die Grafikkarte anspreche (???).
    Im Netz bin ich bisher nicht fündig, angeblich soll es eine Funktionsbibliothek dafür geben 😕

    Das Programm soll im Endeffekt nur auf Kommando nen Quadrat anzeigen o.ä.

    Wäre um ein paar Tipps SEHR dankbar.

    Gruß
    Sven



  • also wenn du angibst für welches os das sein soll, könnte man spezifischer draufeingehen. würde dir die sdl empfehlen. fall du mit unix arbeitest schau mal nach der ncurses-lib



  • Such mal nach Mode 13 oder VGA Programming etc.
    Ist halt nur mit einer max. Auflösung von 320x200.
    Hier kannst Du wirklich direkt ins GFX-Karten Register schreiben ohne grössere Probleme.

    Ansonsten TinyPTC, SDL oder PixelToaster, das sind jeweils Libarys die alles auch wichtige für dich erledigen. Den Rest musst Du dann selber schreiben.



  • Also OS ist Dos Ebene. Naja wir sind in den Kinderschuhen der Programmierung. Haben gerade mit dem Thema Arrays abgeschlossen, also denke ich mal kann das ganze nicht soooo kompliziert sein. Aber ich check mal eure Tipps.

    Danke schonmal



  • Darfs auch ne Windows Anwendung sein?



  • Ich weiss jetzt nicht genau wie das unter Dos heisst,
    aber ich meine dort gibt es ein Pendant zur semi Grafik, irgendwas mit conio oder sowas.

    Damit sollte es relativ simpel sein kleine Grafik Demos zu schreiben.



  • es gibt zahlreiche Bibliotheken dafür z. B. http://www.dislin.de/, die man Einsetzen könnte



  • Wenn Du mit dem Delorie GCC-GNU-Dingens und im Mode13h arbeiten willst, kannst Du das hier benutzen:
    Das hab ich mir so im Netz zusammen gesucht und irgendwann zum laufen gekriegt.
    Bisher hatte ich keine Motivation das unter MSVSC++ zu laufen zu bringen.

    //Mode13_03.c
    //mk,2005
    //
    //dosmode 13h gfx thingie
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>	
    #include <conio.h>					// req. for kbhit()
    #include <dos.h>						// required for int86()
    #include <sys/nearptr.h>		//<- __djgpp_conventional_base
    #include <sys/farptr.h>			// Required for all _far* functions
    
    #include <go32.h>						// Required for _dos_ds selector
    
    // #define stuff
    #define MCGA			0x13
    #define TEXT			0x03
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // SET MODE FOR SCREEN
    void SetMode (unsigned int Mode)
    {
      union REGS regs;
    
      regs.x.ax = Mode;				// Put the desired mode in register AX 
      int86(0x10,&regs,&regs); 
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // directly paint the pixel
    void directPixel(unsigned int x, unsigned int y, int color)
    {
    	if ((x<0) || (x>=320) || (y<0) || (y>=200))
    		return;
    
    	_farnspokeb(0xA0000 + (y<<8) + (y<<6) + x, color);
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // paintpixel in the double buffer
    void bPixel(unsigned int x, unsigned int y, int color, unsigned char *double_buffer)
    {
    	double_buffer[(y<<8) + (y<<6) + x] = color;
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // clears the double Buffer!
    void clear_dBuff(unsigned char *double_buffer)
    {
    	memset(double_buffer, 0, 64000);
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //	wait for the Kathodenstrahl
    void waitRetrace()
    {
       // Wait vertical retrace
       while(inportb(0x03DA)&0x08);
       // Wait refresh
       while(!(inportb(0x03DA)&0x08));
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // MAIN
    int main()
    {
    	int		x_Coord	=160,			// x-mitte
    			y_Coord	=100,			// y-mitte
    			pixCol	=0,			// Base Color
    			count	=0,
    			pFlag	=0;
    
    	int 	pDirection=0;
    	char	userKeyHit=0;		// thats the name of my mother
    	unsigned char	*double_buffer;
    	char *video_ram;			// pointer to the video adress
    
    	double_buffer = (unsigned char *) malloc(320*200);
    	__djgpp_nearptr_enable();	// turn of protection
    	_farsetsel(_dos_ds);
    	video_ram=(char *)(0xA0000);
    	srand(time(NULL));
    	printf("video_ram adress should be 0xA000. It is: %x\nBeenden mit ANYKEY." ,video_ram);
    	getchar();
    
    // begin to rock!
    	SetMode(MCGA);
    
    	while (!kbhit())
    	{
    		for (count=32000;count;count-=2)
    			bPixel(rand()%320,rand()%200,rand()%15+15,double_buffer);
    
    		waitRetrace();
    		//memmove(video_ram,double_buffer,64000);	// Does not work :(
    		dosmemput(double_buffer, 64000, video_ram); //replace video_ram with 0xA0000 to get rid of the warning
    		clear_dBuff(double_buffer);	
    	}
    
    //Fill Screen with Black
    	waitRetrace();
    	clear_dBuff(double_buffer);
    	dosmemput(double_buffer, 64000, 0xA0000);
    // exit Prog. and clean up!
    	free(double_buffer);
    	__djgpp_nearptr_disable();	//<---
    	SetMode(TEXT);
    	return 0;
    }
    


  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten