Spieleprogrammierung zu DOS



  • GDI und DirectX kenne ich schon und ich wollte jetzt mal zum Spaß retromäßig ein kleines Spiel unter DOS (nicht Win32-Konsole mit ASCII, sondern richtige Grafikausgabe (2D) in echtem DOS) programmieren. Kennt jemand ein gutes Buch zu dem Thema, das ich mir dann auf eBay oder so besorgen kann?
    PS: Spieleprogrammierung bitte nur mit den Sachen, die die typischen Compiler und IDEs von sich aus schon mitbringen (dos.h, conio.h und dergleichen). Keine extern erhältlichen Wrapperbibliotheken wie Allegro oder SDL (falls es letzteres für DOS geben würde).



  • Viel mehr als die Beschreibung des Mode 13h brauchst du nicht.

    http://en.wikipedia.org/wiki/Mode_13h

    Input machst du über die Funktionen des Compilers, und Sound... OK, Sound ist dann noch ein Thema. Gibt allerdings genug Infos zur Programmierung von Soundblaster Karten im Netz (jeder vernünftige Emulator/Hypervisor sollte es schaffen eine Soundblaster zu emulieren).

    -> Du brauchst nicht wirklich ein Buch.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung 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.



  • Hallo,

    ich wollte kein neuen Thread aufmachen da das genau das thema ist was ich auch gerade durchgehe. Ich will auch ein kleines dos Spiel programmieren und hab auch schon einwenig erfahrung. Meine Frage jetzt: Wie hat man damals den Sound oder die Grafik gemacht. Gabs da eigene editoren oder hat man das in ner c++ datei geschrieben und dann in der main() funktion implementiert. Auf Antworten bin ich schon gespannt.

    Gruß BlackFalcon

    P.S.: Ich verwende Turbo C++ 3.0.



  • Noch nicht so umfangreich wie einige das hier gerne hätten.
    Aber so ein paar Spielereien sind schon erkennbar.
    Quelltext sollte aus etwa Mitte der 90er sein damals MS DOS 5.0 und Hardware mit CPU-Takt 25 oder 40 MHz.

    /* Turbo C */
    #include <dos.h>
    #include <conio.h>
    
    int t = 3,         /* Spielbaelle */
        e = 2,
        s = 0,	   /* Spielsteinzaehler */
        u,		   /* weitere Spielsteine */
        v = 39,	   /* 39 Spielsteine (Basis : 3 * 13) */
        k = 1,
        r = 256,       /* Ballgeschwindigkeit */
        f,		   /* Ballposition */
        g,		   /* Ballposition */
        c,
        d,
        n = 1,
        m,
        x = 1,
        w,
        i;
    char q;
    
    p(int x, int y, int c, char*z)
    {
       textcolor(c);
       gotoxy(x, y);
       cputs(z);
    }
    b(int x, int y, int n, int r, int c, char*z)
    			/* n = count */
    			/* r = down(1) or right(0) */
    {
       while(n--) p(r?x:x++,r?y++:y,c,z);
    }
    a(char*h)		     /* show racket */
    {
       b(e, 23, 7, 0, 2, h);
    }
    l()			     /* draw begin of round one ball */
    {
       b(4, 1, t++, 0, 14, "o"); /* ball counter view */
       u = v += 13;		     /* stones (39 + 13) */
       for(i = 0; i < v ; i++)   /* draw stones */
          b(2+i%13*6, 6+i/13, 6, 0, (i&7)+3, "Û");
       a(" ");
       e = 36;		     /* center racket */
       a("ß");
       f = 39;		     /* ball start pos */
       g = 23;		     /* ball start pos */
       c = 1;
       d = -1;
       r -= 3;
    }
    
    main()
    {
       clrscr();
       b(1, 1, 160, 0, 5, "²");  /* top frame 160 = double */
       b(1, 3, 22, 1, 5, "±");   /* left frame */
       b(80, 3, 22, 1, 5, "±");  /* right frame */
       p(36, 1, 5, "ùBlockerù"); /* top line */
       l();
       do
       {
          if(!n--)		     /* racket pos */
          {
    	 w = peek(64, 23);
    	 if(i=w&4&&e>2?-1:w&8&&e<73?1:0)
           	   p(e+3-i*3, 23, 2, " ");
    	 e += i;
    	 a("ß");
    	 n = 18;
          }
          if(!k--)		     /* ball direction */
          {
    	 p(f, g, 1," ");
    	 if(f+c<2||f+c>79)c = -c;
    	 if(g+d<3)d = -d;
    	 f += x?c:++m&1?c:0;
    	 g += d;
    	 q = peek(47094,f*2+g*160-2);
    	 nosound();
    	 if(q == 'ß')	     /* ball meets racket */
    	 {
    	    sound(400);
    	    d = -1;
    	    g--;
    	    c = f == e+3?-1:1;
    	    x = f!=e+2&f!=e+4;
    	 }
    	 if(q == 'Û')	     /* ball meets stone */
    	 {
    	    sound(99);
    	    b((f-2)/6*6+2,g,6,0,1," ");
    	    d = -d;
    	    p(74,1,15," ");
    	    cprintf("%i",++s);    /* stone-meet-counter */
    	    if(!--u)l();
    	 }
    	 if(g>25)
    	 {
    	    p(2+t--,1,5,"²");/* dec ball counter view */
    	    delay(500);
    	    f = e + 3;
    	    g = 22;
    	    d = -1;
    	 }
    	 else p(f,g,14,"o"); /* draw ball position */
    	 k =  r + 1;
          }
          delay(16);		/* play speed */
       }
       while(t);
       p(1,3,15,"Game OVER");
    }
    

    eventuell den Quelltext mal umschreiben - scheint wohl ein sehr kurze Codeversion zu sein. Die Langversion sollte besser zu lesen sein.

    Kommentare in Denglish 😃

    Und C99 oder so sahen das teilweise auch noch anders als heute 😉

    MfG f.-th.



  • danke für den code werd ihn mal ausprobieren und davon einbisschen lernen. Von der Lesbarkeit her hätte ich längere Variablennamen gewünscht aber man kann ja nicht alles haben. Will nämlich mit dem Spiel Pong beginnen. Ich mag die retro Spiele. Die haben bei mir Nostalgie werte.

    Gruß BlackFalcon



  • Die Borland Compiler hatten ein Jahr 2000 Patch.
    Ob der Quelltext oben davon betroffen ist?

    Die Verzögerungen sollten an die aktuelle Hardware angepasst werden.

    Hab leider genaue Infos vergessen - die Zeitschrift Toolbox sollte Ende der 90er in einer ihrer Ausgaben einen alternativen Pascal-Compiler mit einer Spieledemo veröffentlicht haben. Vielleicht findet jemand die Infos dazu. Müsste so ein Trapper mit Lagerfeuer und Hütte im Wald gewesen sein. Der Trapper lies sich über dem Bildschirm steuern.

    Zu C oder C++ aus der Zeit gab es auch noch andere kleine Spiele. Denke da so an Snake und weitere im Text wie auch im Grafikmodus.
    Vielleicht findet ihr in einer Bücherei noch eine Ausgabe von PCIntern:
    http://www.amazon.de/PC-intern-Systemprogrammierung-Michael-Tischer/dp/3815811694
    Da sind aber Spiele nicht der Hauptinhalt des Buches ⚠

    Zur Geschwindigkeit der Spiele unter DOS:
    Wenn Interrupts für die Grafik genutzt werden, laufen die Programme unter fast allen damaligen Hardwaren/Grafikkarten, aber sind nicht sehr schnell. Richtig schnell wird das, wenn die Grafikkarte direkt adressiert wird. Leider muss letzteres speziell für den Chipsatz eurer Grafikkarte programmiert werden.

    MfG f.-th.



  • naja ich mach es über die bibliothek graphics.



  • Die direkte Speicheradressierung ist auch schneller als graphics. 👍
    Aber wo bekommt man heute die Infos zu den Grafikkarten her?
    Und, wemm das nur auf einer Chipfamilie läuft, ist das ja auch nicht immer so gewollt.

    MfG f.-th.



  • Die Borland-Compiler verwenden BGI-Treiber. Die damals üblichen Grafikkarten
    S3, Tseng, Trident, Paradise und wie sie alle hiessen würden nur auf sehr alten
    Rechnern noch laufen.
    Das ct-Magazin hatte damals ein BGI-Treiber Gerüst zum selbst erweitern - was ich auch bis zum gehtnichmehr gemacht hatte.

    Rückblickend würde ich auf den VESA-Grafikmode setzen. Würde hoffen das den heute jede Grafikkarte (noch) beherrscht.

    http://de.wikipedia.org/wiki/VESA_BIOS_Extension

    Also wenn es Borland sein soll wäre ein VESA-BGI-Treiber eine gute Wahl.

    Wenn ich mich richtig erinnere würde das ganze auch unter WinXP als Konsolenanwendung noch laufen.

    Wie ds VGA-BIOS (und die VESA-Erweiterung) mit den seltsamen heute üblichen Displayauflösungen umgeht müsste man mal sehen - vermutlich gibt das schwarzen Flächen rechts und links ...

    Notfalls könnte man auch direkt, also nur mit VESA auf die Grafikkarte zugreiffen:

    Programming with Vesa Bios Extensions:
    http://davmac.org/davpage/vesa.html

    Wieviele Farben sollen denn verwendet werden ? Wenn es mehr als 256 sein sollen wird es richtig wild ...



  • BlackFalcon schrieb:

    Meine Frage jetzt: Wie hat man damals den Sound oder die Grafik gemacht.

    Wenn dir eine Auflösung von 320 x 200 mit gleichzeitig 256 Farben reicht, dann kannst du Mode 13 benutzen. Da wird der gesamte Bildschirm als einzelnes Byte-Array mit 64000 Einträgen repräsentiert und du kannst direkt in den Grafikspeicher schreiben. Keine Notwendigkeit, die graphics.h zu benutzen.
    Hier sind zwei Tutorials:
    www3.telus.net/alexander_russell/course/introduction.htm
    www.brackeen.com/vga/resource.html

    Das mit dem Sound dürfte etwas komplizierter sein. Dazu braucht man, glaube ich, spezielle Treiberdateien oder so.

    Wenn Du ein Buch willst, das alle Aspekte abdeckt (inklusive Gamepadinput), guck dir mal das hier an:
    www.amazon.de/Teach-Yourself-Game-Programming-Cd-Rom/dp/0672305623



  • Zum Link mit den Compilern unter DOS:
    Borland Turbo C 2.0 gibt es als anthike Software noch bei Hersteller, bis etwa Borland 4.0 oder gar 5.0 sollte DOS als Zielplattform möglich sein. Borland auch als C++ verfügbar.
    Digital Mars auf der Internetseite nachsehen, da gibt es einen 16-Bit-Baukasten. Der Digital Mars hiess davor mal Symanatec und davor Zortech. Schon als Zortech als C und C++
    Microsoft Quick C oder die umfangreicheren "professionellen" Versionen und VS 1,52 als letzte 16-Bit-Variante. Microsoft ist erst ab VS C++ fähig.
    Open Watcom hat bei der 1.6 Version noch 16-Bit als Ziel. In der 1.9 Veersion nicht mehr. Ist wohl bei 1.7 oder 1.8 eingestellt worden? Auch schon seit Jahren als C++ verfügbar.
    Pacific C

    Meiner Erinnerung nach nannten sich die Grafik-Headerdateien:
    Borland : graphics.h
    Digital Mars : display.h
    Microsoft : graph.h
    und hatten ihren eigenen speziellen Dialekt 🙄

    Es gab damals noch weitere Compilerhersteller, aber die oben aufgezählten sind noch relativ einfach verfügbar.

    So weit erst mal, ich hoffe mal das es passt 😃

    MfG f.-th.



  • zur ergänzung:
    der djgpp hat auch eine dos variante
    http://www.delorie.com/djgpp/
    http://www.delorie.com/djgpp/zip-picker.html, dort für ms-dos und opendos...

    und ein paar nette features in der conio.h



  • Herzlichen Glückwunsch zum 10.Jahrestag im Forum 😃



  • elise schrieb:

    http://www.delorie.com/djgpp/zip-picker.html, dort für ms-dos und opendos...

    Herzlichen Glückwunsch auch von mir.

    PS:
    Nach so langer Mitgliedschaft sollte man aber Links so publizieren können,
    das sie benutzbar sind - hier also OHNE Komma 🙂

    http://www.delorie.com/djgpp/zip-picker.html



  • merano schrieb:

    PS:
    Nach so langer Mitgliedschaft sollte man aber Links so publizieren können,
    das sie benutzbar sind - hier also OHNE Komma 🙂

    http://www.delorie.com/djgpp/zip-picker.html

    komm du erstmal in mein alter... da werden so sachen wie kommas hin oder weg vollkommen unwichtig... 🤡



  • Bitsy schrieb:

    Herzlichen Glückwunsch zum 10.Jahrestag im Forum 😃

    *anstoss*



  • elise schrieb:

    Bitsy schrieb:

    Herzlichen Glückwunsch zum 10.Jahrestag im Forum 😃

    *anstoss*

    Oh, ich ja auch! *anstoß* 🙂



  • Bashar schrieb:

    elise schrieb:

    Bitsy schrieb:

    Herzlichen Glückwunsch zum 10.Jahrestag im Forum 😃

    *anstoss*

    Oh, ich ja auch! *anstoß* 🙂

    Ist zwar mittlerweile total offtopic, aber dass ich das noch erlebe, dass Du mal ein wenig aus der Reserve kommst - *prost* ! 🕶


Anmelden zum Antworten